在2D中模拟弹丸旋转的最佳方法?

时间:2014-03-17 17:37:25

标签: c# xna rotation 2d xna-4.0

所以我正在为一个我正在上课的2D城堡防御风格的游戏工作,我在尝试获得玩家在飞行时正常旋转的箭头时遇到了困难他们的抛物线弧。我相信你们中的很多人之前都玩过类似的游戏,但这里有一个链接,例如,正是我想要完成的。

http://www.lostvectors.com/prelude/

我目前有一个箭头类:

public class Arrow
    {
        public Texture2D arrowSprite;
        public double Xvelocity;
        public double Yvelocity;
        public int currentXpos;
        public int currentYpos;
        public int oldXpos;
        public int oldYpos;
        public float currentAngle;
        public float oldAngle;

        public Arrow() 
        {
            arrowSprite = WindowsGame1.Game1.arrow;
            Xvelocity = 10;
            Yvelocity = 10;
            currentXpos = 850;
            currentYpos = 200;
        }
    }

注意:我设置的初始值就位,直到我可以让动画正常工作。一旦解决了这个问题,我将根据用户输入设置值。

我的更新方法中有以下代码来更新箭头:

foreach (Player.Arrow arrow in onscreenArrows)
            {
                arrow.oldXpos = arrow.currentXpos;
                arrow.oldYpos = arrow.currentYpos;
                arrow.currentXpos -= Convert.ToInt32(arrow.Xvelocity);
                arrow.currentYpos -= Convert.ToInt32(arrow.Yvelocity);
                arrow.oldAngle = arrow.currentAngle;
                arrow.currentAngle = Convert.ToSingle(Math.Atan(arrow.Yvelocity/arrow.Xvelocity) * 180 / Math.PI);
                arrow.Yvelocity -= 1;
            }

和我的绘图方法中的这个片段:

foreach (Player.Arrow arrow in onscreenArrows)
        {
            spriteBatch.Draw(arrow.arrowSprite, new Vector2(arrow.currentXpos, arrow.currentYpos), null, Color.White, arrow.currentAngle - arrow.oldAngle, new Vector2(0, 4), 1.0f, SpriteEffects.None, 0);
        }

为了澄清,箭头从屏幕右侧射出并向左移动。我为我极其凌乱的代码道歉。我对游戏编程还很陌生,而且在做其他任何事情之前,我一直试图让动画正常工作。任何建议都会非常有用,非常感谢,谢谢!!

1 个答案:

答案 0 :(得分:1)

您的代码实际上看起来很不错。我能看到的唯一错误是你将spriteBatch.Draw函数传递给:

arrow.currentAngle - arrow.oldAngle

给SpriteBatch.Draw的旋转是绝对旋转(MSDN),所以你应该只传递它arrow.currentAngle

要清楚的是,当前没有最后一帧的记忆时,你正在向它传递最后一帧的角度变化(三角形或相对角度)。你应该给它画一个角度。

<强>更新 错过了数学上的一些问题。

  1. Math.Atan返回一个弧度,而spriteBatch.Draw需要一个弧度,所以你不需要在度和弧度之间进行转换(事实上,这可能就是你看到它疯狂跳跃的原因)

  2. 如果你正确地旅行,你的数学会得到正确的角度。为了让它向左移动,取180度并减去计算出的角度。

  3. 通过这些改进,您的代码变为:

    arrow.currentAngle = Math.Pi - Math.Atan(arrow.Yvelocity/arrow.Xvelocity);
    

    让我知道它是怎么回事!