2009-08-25 59 views
2

进入玩家控制坦克的2D游戏。XNA正确旋转坦克

我可以做坦克,以及所有,但什么真正用脑子搞乱是如何使它相应地旋转。

我希望它的行为就像Wii游戏坦克一样。 固定方向,坦克上没有真正的正面和背面。

向上行驶,然后左转应该向左旋转。 向上行驶,然后向下不应该使其旋转,只是驱动另一个方向。

我红教程而回的一些方式通过将度为2个的180度部分做到这一点。但我根本无法再找到那个该死的网站。

我希望你们能明白我想说什么。 感谢提前:)

+0

上下你是在谈论前进还是后退? – Lazarus 2009-08-25 14:01:32

+0

正确:)向前和向后 – Moulde 2009-08-25 17:38:27

+0

我仍然在寻找与旋转使用一些方法,角度作为参数的方法,然后返回它分成两个角度或类似的东西的网站。 – Moulde 2009-08-25 17:42:29

回答

2

我认为你在寻找什么很简单,就是尽量减少坦克,模180度的旋转的最佳途径。

我会用所期望的移动方向和坦克的当前方向开始之间的角度。确保这是最小角度,然后将其与坦克当前方向+ 180度之间的角度进行比较。例如:

// smallest angle between the current direction and the desired direction 
minAngle1 = Math.Abs(Math.Min(tankAngle - desiredAngle, desiredAngle - tankAngle)); 

// smallest angle between the opposite direction and the desired direction 
oppositeAngle = (tankAngle + 180) % 360; 
minAngle2 = Math.Abs(Math.Min(oppositeAngle - desiredAngle, desiredAngle - oppositeAngle)); 

// get the smaller of two to rotate to 
if (minAngle1 < minAngle2) { 
    // we know that we should rotate the current direction to the desired direction 
} else { 
    // rotate the opposing direction to the desired direction 
} 

请注意,您需要使用旋转标志来确保旋转方向正确。此外,我假定你知道你的旋转角度,如果你有矢量,你可以通过使用两个矢量之间的点积而不是比较角度来简化这一点。

4

我假设你正在绘制你的坦克作为一个精灵?在这种情况下,会出现SpriteBatch.Draw方法的重载,它允许您指定原点周围的旋转角度。

SpriteBatch.Draw overload

如何使用它从MSDN

上面的例子将不断旋转你的精灵,所以你需要添加一些自定义逻辑,所以它只会根据键盘输入旋转它Here's an exampleHere's a simple example关于如何检查键盘输入。因此,添加检查是否按下了右键或左键的逻辑,如果有,则更新旋转角度。如果它是按下的向上或向下按钮,你只需修改你的精灵的位置。

我希望它是有道理的,否则只是让我知道。

+0

是的,我得到了所有:) 我想要的是坦克决定哪种方式坦克旋转时,我想它移动。 – Moulde 2009-08-25 17:41:31

0

基于旋转角度的运动方向是否存在问题?

Vector2 moveDir = new Vector2(Math.Cos(rotation), Math.Sin(rotation)); 
position += (moveDir * speed); 

这里的速度会是一个数字,表示您想要朝这个方向移动多快。位置是精灵位置的另一个Vector2。正如Tchami说的那样,你可以使用SpriteBatch.Draw重载进行旋转绘制。 Cos和Sin方法的旋转应该用弧度表示,但如果我没有记错,我认为Draw应该是度数。 MathHelper.ToRadians(度)和MathHelper.ToDegrees(弧度)应该可以解决这个问题。

有很多XNA教程和示例的网站上http://creators.xna.com/en-US/education/catalog/

+0

没有我的问题是,当我告诉它去某个地方时,我希望我的坦克旋转的可能性最小。 – Moulde 2009-08-25 17:40:37