列表中的敌人:将敌人与其他敌人相撞的问题

时间:2015-03-23 18:34:58

标签: c# list xna collision-detection

我正在开发一款游戏,其中一个敌人列表在x轴上随机生成一个级别,使用一个列表,直到产生的最大数量点(目前设置为10)I有很大一部分游戏工作,但我目前有一个问题,敌人可以重叠/堆叠在彼此之上。

我想要的是敌人的碰撞盒是否与列表中的另一个敌人相交,因为它没有重叠。 (如果这是有道理的)这是我到目前为止的代码。

        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 个答案:

答案 0 :(得分:0)

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

我对如何订购的建议:

  1. 根据position.X和position.Y来定义碰撞框 它始终准确地反映了正确的位置。
  2. 更新所有敌人x和y位置。
  3. 所有敌人阵地更新后,执行下方的片段。
  4. 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)。