列表中的敌人:与其他敌人发生碰撞的问题

Enemies in a list: issue with colliding the enemies with the other enemies

我目前正在开发一个游戏,其中敌人列表在 x 轴上随机生成到关卡中,使用的列表达到最大生成数量(当前设置为 10)我有很大一部分游戏在运行,但是我目前遇到的问题是敌人可以 overlap/stack 相互叠加。

我想要的是,如果敌人的碰撞盒与列表中的另一个敌人相交,则不会重叠。 (如果这有意义的话)这是我到目前为止的代码。

        foreach (EnemyClass enemy1 in enemies)
        {
            if (enemy1.position.X < myPlayer.position.X - 10 && !enemy1.stopMoving)
            {
                enemy1.position.X += enemy1.amountToMove;                   
            }

            if (enemy1.position.X > myPlayer.position.X - 50 && !enemy1.stopMoving)
            {
                enemy1.position.X -= enemy1.amountToMove;
            }

            foreach (EnemyClass enemy2 in enemies)
            {
                if (enemy1 != enemy2 && enemy1.collisionBox.Intersects(enemy2.collisionBox))
                {
                    System.Console.WriteLine("Collision Detected");
                }
            }

            enemy1.collisionX = (int)enemy1.position.X;
            enemy1.Update(graphics.GraphicsDevice);
        }

如有任何帮助,我们将不胜感激。

编辑:我错过的是它们在技术上确实会发生碰撞,但是当它们相距 1000 像素时它们会发生碰撞,而精灵实际上是 50 像素宽。

编辑:这是更改后的碰撞代码..

foreach (EnemyClass enemy in enemies)
        {
            enemy.collisionX = (int)enemy.position.X;

            if (enemy.position.X < myPlayer.position.X - 10 && !enemy.stopMoving)
            {
                enemy.position.X += enemy.amountToMove;                   
            }

            if (enemy.position.X > myPlayer.position.X - 50 && !enemy.stopMoving)
            {
                enemy.position.X -= enemy.amountToMove;
            }

            for (int i = 0; i < enemies.Count; i++)
            {
                for (int j = i + 1; j < enemies.Count; j++)
                {
                    if (enemies[i].collisionBox.Intersects(enemies[i].collisionBox))
                    {
                        System.Console.WriteLine("Collision Detected");
                    }
                }
            }

            enemy.Update(graphics.GraphicsDevice);
        }

编辑:这是 EnemyClass,其中包含 collisionBox:

public EnemyClass(Texture2D newTexture, Vector2 newPosition)
{
    texture = newTexture;
    position = newPosition;

    collisionBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);

    randX = random.Next(1, 3);
    speed = new Vector2(randX, 0);
}

public void Update(GraphicsDevice graphics)
{
    collisionBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
}

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(texture, position, Color.White);
}

似乎在所有碰撞框更新之前检测到碰撞。

我对如何订购东西的建议:

  1. 根据position.X和position.Y定义碰撞框所以 它始终准确反映正确的位置。
  2. 更新所有敌人的 x 和 y 位置。
  3. 在所有敌人位置更新后执行下面的代码片段。

foreach (EnemyClass enemy in enemies)
{
    if (enemy.position.X < myPlayer.position.X - 10 && !enemy.stopMoving)
    {
        enemy.position.X += enemy.amountToMove;                   
    }

    if (enemy.position.X > myPlayer.position.X - 50 && !enemy.stopMoving)
    {
        enemy.position.X -= enemy.amountToMove;
    }
    enemy.Update(graphics.GraphicsDevice);
} 

for (int i = 0; i < enemies.Count; i++)
{
    for (int j = i + 1; j < enemies.Count; j++)
    {
        if (enemies[i].collisionBox.Intersects(enemies[j].collisionBox))
        {
            System.Console.WriteLine("Collision Detected");
        }
    }
}

上面的代码还有一个优点是不会检测到两次相同的碰撞(即enemy1/enemy2和enemy2/enemy1)。