XNA正确旋转水箱

时间:2009-08-25 13:45:29

标签: c# xna

我正在制作一个玩家控制坦克的2D游戏。

我可以制作坦克,所有这些,但是我的想法是什么,如何让它相应地旋转。

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

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

我通过将度数分成2个180度的部分来重温一段时间的教程。但我根本无法找到该死的网站。

我希望你们能够理解我想说的话。 在此先感谢:)

3 个答案:

答案 0 :(得分:4)

我假设你把你的坦克画成雪碧?在这种情况下,SpriteBatch.Draw方法会出现重载,允许您指定原点周围的旋转角度。

SpriteBatch.Draw overload

Here's an example如何在MSDN中使用它

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

我希望它有意义,否则只是让我知道。

答案 1 :(得分: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
}

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

答案 2 :(得分:0)

基于它们旋转的角度,您的移动方向是否存在问题?

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

此处的速度将是您想要朝这个方向移动的速度的数字。 position是精灵位置的另一个Vector2。正如Tchami所说,你可以使用SpriteBatch.Draw重载来旋转它。 Cos和Sin方法的旋转应该是弧度,但我认为如果我没记错,Draw应该是度数。 MathHelper.ToRadians(度)和MathHelper.ToDegrees(弧度)应该解决这个问题。

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