0

キャラクターが画面の反対側から来て衝突して攻撃し、死ぬとキャラクターが取り除かれるゲームを作っています。私はリストが衝突したときにリストの移動を停止してダメージを与えることができましたが、私の問題は、リストの2つが衝突したときにすべてのリストが移動を停止することです。短剣士の衝突の私のコードは次のとおりです。

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;
            }
        }
    }
4

2 に答える 2

0

これらのクラスはすべてのエンティティのリスト全体で動作しているように見えるため、衝突boolはこれらのクラスの変数であってはなりません。代わりに、衝突検出はエンティティごとに行う必要があります。基本的には、衝突boolをゴブリンと剣士のプロパティにします。これは、おそらく攻撃コマンドなしで、同じタイプの他のクリーチャーとの交差点もチェックする必要があることを意味します。

于 2012-10-15T15:05:27.310 に答える
0

これは私が現在使用しているコードです-shortswordsmanとgoblinは同じなので、1つだけ表示します:

ゴブリンクラスの場合:

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;
            }
        }
    }
于 2012-10-16T15:48:51.743 に答える