XNA中最佳的方法是什么,使玩家可以在屏幕上平滑地绘画?

6
我正在开发一个wp7游戏,玩家在程序中画线,球会从线上反弹。我正在使用XNA和farseer物理引擎。用户画一条线,然后程序将其转化为物理对象或至少是一个vector2列表的最佳方法是什么?我已经尝试创建TouchLocations列表,但如果用户不画得很慢,就会出现问题,就像我附加的图片一样。有什么建议吗? 谢谢 http://img829.imageshack.us/img829/3985/capturehbn.png 这是一些代码: 我正在使用gamestatemanagement示例,并且这是HandleInput方法中的代码。
foreach (TouchLocation t in input.TouchState) {
  pathManager.Update(gameTime, t.Position);
}

路径管理器类(pathManager class) 管理一组路径类(path classes),这些路径类是可绘制的物理对象。这里是pathManager.Update。
public void Update(GameTime gameTime, Vector2 touchPosition) {
  paths.Add(new Path(world,texture, new Vector2(5,5) ,0.1f));
  paths[paths.Count-1].Position = touchPosition;
}

这是我现在正在做的事情,我愿意为任何事情放弃它。你可能认为每个触摸位置都有一个5x5的矩形会影响性能,但使用farseer,即使屏幕大部分被占用,我也没有看到任何下降。然而,如果线条绘制得很快,这个系统根本不会创建平滑的线条。
我怀疑这对任何人都没有帮助,但这是Path构造函数。
public Path(World world, Texture2D texture, Vector2 size, float mass) {
  this.Size = size;
  this.texture = texture;
  body = BodyFactory.CreateRectangle(world, size.X * pixelToUnit, size.Y * pixelToUnit, 1);
  body.BodyType = BodyType.Static;
  body.Restitution = 1f;
  body.Friction = 0;
  body.Friction = 10;
}

你能把相关的代码粘贴进来吗? - ForceMagic
1
你必须拥有超过2个线的点吗? - Allan Spreys
我觉得不是必须的,但最好还是这样。但我只能看到一条直线。我该怎么做? - Ian Wilson
我在想是否有某种算法可以计算跳过的所有位置之间的位置? - Ian Wilson
当你说“所有位置之间”时,你实际上是什么意思? - neeKo
我的意思是,当它从一个点跳到另一个点时,就像我发布的图片链接中那样,是否有一种方法可以找到它记录的两个点斜率沿线的所有点? - Ian Wilson
1个回答

1

如何使用XNA绘制线条?

绘制基元的最佳方法是使用BasicEffect着色器。这将由硬件加速。如果需要,您还可以添加纹理。

我不确定在WP7上是否相同,但至少对于Windows7有效。


感谢您的回答,我喜欢这种绘图方法,但我需要一条线上所有点的列表以进行碰撞检测。 - Ian Wilson
1
任何由BodyFactory创建的物体都可以使用。或者你是指当线条彼此碰撞时?在Farseer中有一个叫做Contact的东西。每当发生碰撞时,会创建一个包含有关碰撞具体位置的Contact。 - ColacX
很有道理。我不知道为什么我一直卡在一个Vector2列表上。最终我使用了BodyFactory.CreateEdge,使用自由拖动手势的第一个和最后一个点,并使用您的绘图方法。谢谢! - Ian Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接