碰撞会停止列表中移动的所有字符

时间:2012-10-15 14:55:47

标签: xna collision-detection xna-4.0

我正在制作一个游戏,角色来自屏幕的两侧,相互碰撞并相互攻击,然后在死亡时将其移除。我已经设法让列表停止移动并在碰撞时造成伤害,但我的问题是当其中两个碰撞时所有人都停止移动。 我的shortwordsman碰撞代码是:

private void shortMoveCollisions(GameTime gameTime)
    {
        Rectangle shortRect;
        int shortSpeed = 2;
        int shortDamage = 20;
        bool collided = false;

        for (int i = 0; i < shortList.Count; i++)
        {
            List<Goblin> tempGoblinList = new List<Goblin>(goblinList);
            shortRect = new Rectangle((int)shortList[i].position.X, (int)shortList[i].position.Y, ShortSwordsman.texture.Width / 4 - 20, ShortSwordsman.texture.Height);

            foreach (Goblin goblin in tempGoblinList)
            {
                Rectangle goblinRect = new Rectangle((int)goblin.position.X, (int)goblin.position.Y, Goblin.texture.Width / 4 - 20, Goblin.texture.Height);
                if (shortRect.Intersects(goblinRect))
                {
                    collided = true;
                    shortList[i].AnimateAttack(gameTime);

                    shortTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                    if (shortTimer >= shortDelay)
                    {
                        shortTimer -= shortDelay;
                        goblin.health -= shortDamage;
                        if (goblin.health <= 0)
                        {
                            goblinList.Remove(goblin);
                        }
                    }
                }
            }
            if (shortRect.Intersects(background.badCastleRect))
            {
                collided = true;
                shortList[i].AnimateAttack(gameTime);

                shortTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (shortTimer >= shortDelay)
                {
                    shortTimer -= shortDelay;
                    badCastleHealth -= shortDamage;
                }
             }
            if (collided == false)
            {
                shortList[i].AnimateWalk(gameTime);

                shortList[i].position.X += shortSpeed;
            }
        }
    }

我的地精碰撞代码是:

private void GoblinMoveCollisions(GameTime gameTime)
    {
        Rectangle goblinRect;
        int goblinSpeed = 2;
        int goblinDamage = 20;
        bool collided = false;

        for (int i = 0; i < goblinList.Count; i++)
        {
            List<ShortSwordsman> tempShortList = new List<ShortSwordsman>(shortList);
            goblinRect = new Rectangle((int)goblinList[i].position.X, (int)goblinList[i].position.Y, Goblin.texture.Width / 4 - 20, Goblin.texture.Height);

            foreach (ShortSwordsman shortSwordsman in tempShortList)
            {
                Rectangle shortRect = new Rectangle((int)shortSwordsman.position.X, (int)shortSwordsman.position.Y, ShortSwordsman.texture.Width / 4 - 20, ShortSwordsman.texture.Height);
                if (goblinRect.Intersects(shortRect))
                {
                    collided = true;
                    goblinList[i].AnimateAttack(gameTime);

                    goblinAttackTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                    if (goblinAttackTimer >= goblinAttackDelay)
                    {
                        goblinAttackTimer -= goblinAttackDelay;
                        shortSwordsman.health -= goblinDamage;
                        if (shortSwordsman.health <= 0)
                        {
                            shortList.Remove(shortSwordsman);
                        }
                    }
                }
            }
            if (goblinRect.Intersects(background.goodCastleRect))
            {
                collided = true;
                goblinList[i].AnimateAttack(gameTime);

                goblinAttackTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (goblinAttackTimer >= goblinAttackDelay)
                {
                    goblinAttackTimer -= goblinAttackDelay;
                    goodCastleHealth -= goblinDamage;
                }
            }
            if (collided == false)
            {
                goblinList[i].AnimateWalk(gameTime);

                goblinList[i].position.X -= goblinSpeed;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

您的碰撞bool不应该是这些类的变量,因为这些类似乎在所有实体的整个列表上运行。相反,碰撞检测应该逐个实体地进行,基本上:使碰撞的bool成为地精和剑士的属性。这意味着您必须检查与其他同类型生物的交叉点,可能没有攻击命令。

答案 1 :(得分:0)

这是我目前正在使用的代码 - shortswordsman和goblin是相同的,所以我只会展示一个:

在妖精班:

public Goblin(Vector2 position, float health, bool Collided, Rectangle goblinRect)
    {
        this.position = position;
        this.health = health;
        this.Collided = Collided;
        this.goblinRect = goblinRect;
    }

在game1课程中:

void CreateGoblin()
    {
        goblinList.Add(new Goblin(new Vector2(1900, 270), 100, false, new Rectangle()));
    }

然后对于碰撞我试过这个 - 这包括尝试阻止它们相互重叠的位:

private void GoblinMoveCollisions(GameTime gameTime)
    {
        int goblinSpeed = 2;
        int goblinDamage = 20;

        for (int i = 0; i < goblinList.Count; i++)
        {
            goblinList[i].Collided = false;
            goblinList[i].goblinRect = new Rectangle((int)goblinList[i].position.X, (int)goblinList[i].position.Y, Goblin.texture.Width / 4 - 20, Goblin.texture.Height);
            List<ShortSwordsman> tempShortList = new List<ShortSwordsman>(shortList);

            foreach (ShortSwordsman shortSwordsman in tempShortList)
            {
                Rectangle shortRect = new Rectangle((int)shortSwordsman.position.X, (int)shortSwordsman.position.Y, ShortSwordsman.texture.Width / 4 - 20, ShortSwordsman.texture.Height);
                if (goblinList[i].goblinRect.Intersects(shortRect))
                {
                    goblinList[i].Collided = true;
                    goblinList[i].AnimateAttack(gameTime);

                    goblinAttackTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                    if (goblinAttackTimer >= goblinAttackDelay)
                    {
                        goblinAttackTimer -= goblinAttackDelay;
                        shortSwordsman.health -= goblinDamage;
                        if (shortSwordsman.health <= 0)
                        {
                            shortList.Remove(shortSwordsman);
                        }
                    }
                }
            }
            if (goblinList[i].goblinRect.Intersects(background.goodCastleRect))
            {
                goblinList[i].Collided = true;
                goblinList[i].AnimateAttack(gameTime);

                goblinAttackTimer += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (goblinAttackTimer >= goblinAttackDelay)
                {
                    goblinAttackTimer -= goblinAttackDelay;
                    goodCastleHealth -= goblinDamage;
                }
            }
            if (goblinList[i].goblinRect.Intersects(goblinList[i].goblinRect))
            {
                goblinList[i].Collided = true;
                goblinList[i].AnimateStill(gameTime);
            }
            if (goblinList[i].Collided == false)
            {
                goblinList[i].AnimateWalk(gameTime);
                goblinList[i].position.X -= goblinSpeed;
            }
        }
    }