【问题标题】:XNA Smooth Downward Swoop MotionXNA 平滑向下俯冲运动
【发布时间】:2017-07-31 00:44:11
【问题描述】:

(在您阅读之前,我对在这里发帖感到非常紧张,因为我之前的问题得到了很多负面回应......请尽量保持友善。我是一名学生,不能写“完美”代码)

我目前正在尝试弄清楚如何让蚊子 (Texture2D) 向下俯冲,然后回到原来的位置。 目前蚊子只是在屏幕范围内左右移动,没有 Y 移动。

我已经通过调试器单步执行它并观察它的 Y 坐标。我的蚊子确实在俯冲下来,然后又向上飞……但是,它们的速度如此之快,以至于人眼看不到。

因此,我需要一种方法来平稳地将它们俯冲下来,使其真正可见。 我目前无法将图像嵌入到我的帖子中,但是我制作了一个 GIF 来展示我想要的效果。 Here's a link to my GIF

我尝试过的事情:

  • 复制了我的运动代码的第一行(见下文)并对其进行了更改,使其仅影响 Y 坐标。
    • 结果:蚊子仍然俯冲得太快,看不见。
  • 更改我的蚊子的velocity.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--;
        }
    }

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

【问题讨论】:

  • 你在哪里打电话Swoop
  • 在我的主游戏代码 (MosquitoAttackGame.cs) 中。我有一个随机数生成器,如果生成特定数字,它会调用 swoop 方法。我还没有尝试你的解决方案,因为我目前在学校。不过我回家后会试试的:)

标签: c# xna position texture2d


【解决方案1】:

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

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 并且我们停止俯冲。

【讨论】:

  • 谢谢!我不得不调整和修改您的代码,以便它适用于我的游戏,但总体而言,您的方法确实有效! :) 再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 2012-08-07
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多