XNA平滑向下俯冲运动

时间:2017-03-09 21:05:10

标签: c# xna position texture2d

(在你看之前,我很担心在这里发帖,因为我之前的问题得到了很多负面回答......请尽量保持友好。我是学生,不能写“完美”代码)

我正在试图弄清楚如何使蚊子(Texture2D)向下猛扑然后再回到原来的位置。 目前,蚊子只是在屏幕边界内左右移动,没有Y移动。

我已经通过一个调试器,并观察它的Y坐标。我的蚊子确实猛扑下来,然后又向上又回来了......但是,它们的速度很快,人眼看不到它。

因此,我需要一种方法来顺利地将它们击落,以便它实际上可见。 我目前无法将图像嵌入到我的帖子中,但是我已经制作了一个GIF来展示我想要的效果。 Here's a link to my GIF

我尝试过的事情:

  • 复制我的移动代码的第一行(见下图)并更改它以便它只会影响Y坐标。
    • 结果:蚊子仍然太快看不到。
  • 改变我的蚊子的速度.Y包括一个非0的Y,这样我的移动代码也会改变Y位置而不仅仅是X位置。
    • 结果:由于我的移动代码在Update()函数中找到,因此游戏停留在无限循环中,并且代码永远不会离开循环以便它可以更新位置。

这是我在更新中的移动代码。 蚊子一直向右移动,然后一直向左移动。

        internal void Update(GameTime GameTime)
        {
           position += velocity * (float)GameTime.ElapsedGameTime.TotalSeconds;

           // Reverses the direction of the mosquito if it hits the bounds
           if (position.X <= gameBoundingBox.Left ||
              position.X + animationSequence.CelWidth > gameBoundingBox.Right)
           {
               velocity.X *= -1;
           }
        }

这是我拥有的实际Swoop()代码......

    internal void Swoop(GameTime gameTime)
    {
        float originalYPosition = position.Y;
        bool currentlySwooping = true;

        while (currentlySwooping)
        {
            position.Y++;

            if (this.BoundingBox.Bottom >= gameBoundingBox.Bottom)
            {
                currentlySwooping = false;
            }
        }

        while (!currentlySwooping && position.Y > originalYPosition)
        {
            position.Y--;
        }
    }

我不经常在这里提问,所以如果我使用的格式不正确或者我提供的信息太少,我很抱歉。 如果您还需要了解其他信息,请告知我们。

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一点,但是应该这样做。

float originalYPosition = position.Y;
int swoopDirection = 0;
internal void Update(GameTime GameTime)
{
    /* Same update code */

    if (swoopDirection != 0)
    {
        position.Y += swoopDirection;

        if (swoopDirection == 1 && this.BoundingBox.Bottom >= gameBoundingBox.Bottom)
        {
            swoopDirection = -1;
        }
        else if (swoopDirection == -1 && position.Y <= originalYPosition)
        {
            swoopDirection = 0;
        }
    }
}
internal void Swoop()
{
    swoopDirection = 1;
}

基本上,我们有一个变量swoopDirection,它根据猛扑的状态而变化(下降时为1,上升时为-1)。在更新方法中,我们检查swoopDirection != 0(我们正在俯冲)。如果我们俯冲,我们将方向添加到Y轴并检查我们是否超出界限。如果我们触摸底部,我们将swoopDirection设置为-1,这样我们就可以了。如果我们处于原始位置swoopDirection设置为0并且我们停止俯冲。