【问题标题】:Moving an enemy back and forth in Monogame / XNA在 Monogame / XNA 中来回移动敌人
【发布时间】:2023-07-12 10:03:01
【问题描述】:

我现在正在尝试实现一个非常基本的 2D 游戏,其中一个敌人在屏幕上,它在设定点(50 和 500)之间来回弹跳,有点像太空入侵者之类的东西。我的问题是我只能让它向右走,但不能回到左边重复。

在费心研究它并真正弄清楚之前,我一直在自己编写代码,但我认为我有一些可行的方法,但它没有,我的问题是我不明白为什么。 我的代码应该像开关一样工作,Update 循环中有两个 if 语句,一个打开另一个关闭,一个向右移动,另一个向左移动,我认为这很好,但它没有这样做。它向右移动它就好了,但是左边的部分就不起作用了。

那么,为什么下面的代码不起作用?

namespace _2D_game_num1
{
    class Enemy
    {
        int health;
        Vector2 enemy_location = new Vector2(50, 50);
        Vector2 enemy_speed = new Vector2(1, 1);
        Player player = new Player("dummy");

        public Enemy()
        {
            health = 100;
        }

        public void UpdateLocation()
        {
            //Vector2 player_pos = player.GetLocation();
            //if (player_pos.X < 200)
            // Using the players location to figure out where the enemy should move
            bool right = true;
            bool left = false;
            if (right)
            {
                enemy_location.X += enemy_speed.X;
                if (enemy_location.X == 500)
                {
                    right = false;
                    left = true;
                }
            }

            if (left)
            {
                enemy_location.X -= enemy_speed.X;
                if (enemy_location.X == 50)
                {
                    right = true;
                    left = false;
                }
            }

        }

        public Vector2 GetLocation()
        {
            return enemy_location;
        }


    }
}

然后在主游戏类中,我有它这样的enemy1.UpdateLocation();正确位于“更新”部分(以及我的球员运动,效果很好)。

【问题讨论】:

  • 您不需要rightleft 变量。只需使用“正确”变量即可简化事情。如果这是真的,那么你正在向右移动。如果它是假的,你会向左移动。另外,要小心,因为向量是基于浮点数的,你应该避免测试相等性(双精度数也是如此)。你最好使用&gt;= 500&lt;= 50 来避免任何“接近但不是500或50”的错误。
  • 另一个问题,您需要将我所说的单个right 变量设为类成员,而不是UpdateLocation() 的局部变量。由于它是该方法的本地方法,因此它没有保留其价值。每次您现在拨打UpdateLocation(),它会将right 重置为trueleft 重置为false。这可能是您遇到的主要问题。

标签: c# xna game-physics monogame


【解决方案1】:

试试这个:

    public void UpdateLocation()
    {
            enemy_location.X += enemy_speed.X;

            if (enemy_location.X <= 50 || enemy_location.X >= 500)
            {
                enemy_speed.X = new Vector2(-enemy_speed.X, enemy_speed.Y);
            }
    }

我们在这里所做的是根据敌人当前的速度移动敌人。然后,如果该位置在屏幕的左侧或右侧,请更改方向。

有时让事情保持简单是值得的。摆脱 leftright 标志,因为它们只是令人困惑的事情。当您处理Update 方法时,您通常会更改某些东西的状态。与以前一样,每次调用 UpdateLocation 时,leftright 状态都会重置。

顺便说一句,您可能需要考虑将GameTime 传递给您的Update 方法。通常,当您实时移动物体时,您需要将移动乘以某种deltaTime,以保持所有设备上的流畅度。您可能会摆脱它,因为默认情况下它将是固定帧速率,但情况可能并非总是如此,因此养成一个好习惯。

【讨论】: