XNA,Do-While 基本问题

XNA, Do-While basic trouble

我正在为我的 XNA 项目创建一个简单的 AI。

我的敌人应该在短时间后从右移到左。

不幸的是,我的代码跳过了我的第一次和第二次 Do-While,所以我的敌人没有移动:< 5 秒长。所以他只是从+-1.X位置跳

while (i <= 1)
    {
        EnemyVelocity.X += 1f;
        timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
        usedTimeRight = timer;
        i++;
    } 

    if (usedTimeRight != 0) 
    {
        do
        { EnemyVelocity.X -= 1f;
          timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
        } while ((timer - usedTimeRight) >= 5);
        usedTimeLeft = timer;
        usedTimeRight = 0;
    }
    if (usedTimeLeft != 0)
    {
        do
        { EnemyVelocity.X += 1f;
          timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
        }
        while (timer - usedTimeLeft >= 5);
        usedTimeRight = timer;
        usedTimeLeft= 0;
    }

已更新...~~~~~~~~~~~

所以,现在另一个问题 - 我的敌人一直在向左移动

timer += (float)gameTime.ElapsedGameTime.TotalSeconds;

while (i <= 1)
    {
        EnemyVelocity.X -= 1f;
        timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
        usedTimeRight = timer;
        i++;
    }

    if (usedTimeRight != 0 && (timer - usedTimeRight <= 2))
    { 
        int x;

        for (x = 0; x <= 3; x++)
        {
            EnemyVelocity.X = 1;

        }
        usedTimeLeft = timer;
        usedTimeRight = 0;
    }
  if (usedTimeLeft != 0 && (timer - usedTimeLeft <= 2))
    {
        int x;

        for (x = 0; x <= 3; x++)
        {
            EnemyVelocity.X = - 1;

        }
        usedTimeRight = timer;
        usedTimeLeft = 0;
    }

问题在于初始 while 循环迭代速度如此之快,以至于 while 循环在 usedTimeRight = timer > 0 之前退出。这意味着您的第一个和第二个 if 语句将为假,因为 useTimeLeftuseTimeRight 将始终为 0。尝试更改此设置,以便 Timer 变量在声明时等于 1。

例如:

  float timer = 1f;

  while (i <= 1 ) 
            {
                EnemyVelocity.X += 1f;
                timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                usedTimeRight = timer;
                i++;
            } 


            if (usedTimeRight != 0) 
            {
                do
                { EnemyVelocity.X -= 1f;
                  timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                } while ((timer - usedTimeRight) >= 5);
                usedTimeLeft = timer;
                usedTimeRight = 0;
            }
            if (usedTimeLeft != 0)
            {
                do
                { EnemyVelocity.X += 1f;
                  timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                }
                while (timer - usedTimeLeft >= 5);
                usedTimeRight = timer;
                usedTimeLeft= 0;
            }

我强烈建议初学者在视频游戏中使用 while 循环只有在你真正需要它时才更新循环,因为它可能会停止你的游戏或给你带来意想不到的结果(通常是像这个问题中的瞬移一样的东西)因为困难首先要了解游戏内部逻辑是如何工作的。

如果你需要你的敌人做某事五秒钟,只需在它开始你想要的动作时将 gameTime.ElapsedGameTime.totalMilliseconds 保存在一个变量中,如果你的 savedGameTime 小于总游戏时间,则只需检查- 减去你想要的时间。

如果做对了,你想让你的敌人向左移动五秒钟,然后向右移动五秒钟?要做到这一点,你必须做这样的事情 :

        float delayBetweenMoves = 5f;
        float lastMoveTime = 0f;
        bool isMovingLeft;
        public void Update(GameTime gameTime)
        {
            Move(gameTime);
            enemy.Position += (enemy.VelocityX * enemy.Speed);
        }
        private void Move(GameTime gameTime)
        {
            if(lastMoveTime < gameTime.TotalGameTime.TotalMiliseconds - TimeSpan.FromSeconds(delayBetweenMoves))
            {
                lastMoveTime = gameTime.TotalGameTime.TotalMiliseconds;
                if (isMovingLeft)
                {
                    enemy.VelocityX = -1;
                    isMovingLeft = false;
                }
                else
                {
                    enemy.VelocityX = +1;
                }
            }
        }