从列表中进行XNA 4.0碰撞检测

时间:2015-05-06 12:42:36

标签: c# list xna collision-detection xna-4.0

我有一个简单的小游戏,我正在努力让我的脚在设计过程中弄湿。我在尝试对列表中的项目进行碰撞检测时遇到了问题。我有一个敌人级别,一次会产生三个敌人,然后这些舰艇每个都能够一次发射三颗子弹。我得到的问题是我的碰撞检测是跟踪船而不是每个子弹,即使碰撞矩正在获得子弹位置。在射击子弹方法中,我指定一个Vector2来复制子弹位置(非常确定我必须做一些传递索引,但我不知道从哪里开始)。任何帮助/指导将不胜感激!

SpriteManager.cs

 for (int j = 0; j < enemies.Count; j++)
            {
                Enemies e = enemies[j];

                //Update Sprite
                e.Update(Game.GraphicsDevice, gameTime);

                //Check for Collision
                if (e.collisionRect.Intersects(player.collisionRect))
                {
                    lives -= 1;
                }
            }

Enemies.cs

public void ShootBullets()
    {
        Bullets newBullet = new Bullets(bulletTexture);
        newBullet.velocity.X = velocity.X - 3f;
        newBullet.position = new Vector2(position.X + newBullet.velocity.X, 
            position.Y + (texture.Height / 2) - (bulletTexture.Height / 2));

        //Test
        bulletPos = newBullet.position;

        newBullet.isVisible = true;
        if (bullets.Count() < 3)
            bullets.Add(newBullet);
    }

    public Rectangle collisionRect
    {
        get
        {
            return new Rectangle(
                (int)bulletPos.X + collisionOffset,
                (int)bulletPos.Y + collisionOffset,
                bulletTexture.Width - (collisionOffset * 2),
                bulletTexture.Height - (collisionOffset * 2));
        }
    }

编辑以添加项目符号类:

    public class Bullets
    {
        // Variables
        public Texture2D texture;

        public Vector2 position;
        public Vector2 velocity;

        public bool isVisible;

        //public Rectangle boundingBox;
        //public Vector2 origin;
        //public float speed;

        // Methods

        // Constructor
        public Bullets(Texture2D newTexture)
        {
           // speed = 10;
            texture = newTexture;
            isVisible = false;
        }

        // Draw
        public void draw(SpriteBatch spritebatch)
        {
            spritebatch.Draw(texture, position, Color.White);
        }

    }
}

1 个答案:

答案 0 :(得分:2)

不仅仅是在敌人身上循环,你还需要遍历每个敌人的子弹。

对代码的最简单修改看起来像

 for (int j = 0; j < enemies.Count; j++)
            {
                Enemies e = enemies[j];

                //Update Sprite
                e.Update(Game.GraphicsDevice, gameTime);

                for (int u = 0; u < e.bullets.count; u++) {
                   Bullet b = e.bullets[u];
                   //Check for Collision
                   if (b.collisionRect.Intersects(player.collisionRect))
                   {
                       lives -= 1;
                   }
                }
            }

但是,请注意,通常不建议你在这里做几件事。

首先,不是每个敌人都有自己的子弹列表,所有子弹都应该有一个全局列表,每个敌人都会添加,因为他们会点击#34;他们的子弹。

然后你只能搜索那个列表,而不是查找每个敌人,然后再查找那个敌人的每个子弹。

其次,不是像你一样写出自定义循环

for (int j = 0; j < enemies.Count; j++) {
Enemies e = enemies[j];

只考虑做

//same thing
foreach (var e in enemies) {

此外,请确保在这些项目符号上执行更新逻辑时删除任何超出范围或命中其他对象的项目符号。 有很多方法可以优化何时可以销毁对象以及需要检查碰撞的对象。 碰撞检查一般应该针对您可以逃避的小物体进行,因为它们是您在游戏中需要做的较慢的事情之一。 Althoguh简单的矩形交叉点非常快,所以也许无需担心优化该部分。