0

ここで私のゲームを続けます (プレイヤーが船になり、流星を撃墜するゲーム)。私は現在、弾丸を撃っている船に取り組んでおり、弾丸が当たった流星を取り除こうとしています. これが私がやったことです。もう少しで完了ですが、コーディングにエラーが見つかりました。私のゲームでは、マップの右側の外側に流星が発生し、左に移動します。ポイントはそれらを撃ち落とすことです。これは、流星を正しい順序で撃つと機能しますが、そうでない場合は機能しません。写真で説明しましょう。 例

2つ目の隕石を撃ち落とすとしたら、1番の隕石が先に破壊される

//spawns the enemies.
public void LoadEnemies()
    {
        int randY = random.Next(100, 500);
        if (spawn > 1)
        {
            spawn = 0;
            if (enemies.Count() < 4)
                enemies.Add(new Enemies(Content.Load<Texture2D>("meteor"), new Vector2(1110, randY)));
        }
        //Here's where the error lies because of the bulletcolliding (I think)
        for (int i = 0; i < enemies.Count; i++)
        {
            if (!enemies[i].isVisible || bulletColliding)
            {
                bulletColliding = false;
                enemies.RemoveAt(i);
                i--;
            }
        }
    }

衝突法。

        public void bulletCollision(GameTime gameTime)
    {
        foreach (var x in bullets)
        {
            foreach (var y in enemies)
            {
                enemy_rect = new Rectangle((int)y.position.X, (int)y.position.Y, 10, 10);
                bullet_rect = new Rectangle((int)x.position.X, (int)x.position.Y, 10, 10);
                if (bullet_rect.Intersects(enemy_rect))
                {
                    bulletColliding = true;
                }
            }
        }
    }

基本的に、衝突した特定の隕石を取り除く方法がわかりません。あなたの助けが必要です. 私が得るすべての助けに感謝します。

4

2 に答える 2

5

のみを使用しないでbool bulletCollidingください。破壊すべき敵の数を示す整数も使用し、各敵のクラスで彼の数の情報を保持します。

2 番目のオプションはbool ifDestroy、最初は false の敵クラスを維持し、敵を破壊する必要がある場合は true に変更することです。で確認できますloadEnemies()

于 2012-11-03T18:16:00.063 に答える
2

基本的に、これはサブリナ・ルの答えのさらなる説明です。

敵オブジェクト自体にブール値が呼び出されるbulletCollidingようにしたい場合、衝突コードでは次のようになります...

public void bulletCollision(GameTime gameTime)
{
    foreach (var x in bullets)
    {
        foreach (var y in enemies)
        {
            enemy_rect = new Rectangle((int)y.position.X, (int)y.position.Y, 10, 10);
            bullet_rect = new Rectangle((int)x.position.X, (int)x.position.Y, 10, 10);
            if (bullet_rect.Intersects(enemy_rect))
            {
                y.bulletColliding = true;
            }
        }
    }
}

そして、敵の読み込みコードは次のようになります...

//spawns the enemies.
public void LoadEnemies()
{
    int randY = random.Next(100, 500);
    if (spawn > 1)
    {
        spawn = 0;
        if (enemies.Count() < 4)
            enemies.Add(new Enemies(Content.Load<Texture2D>("meteor"), new Vector2(1110, randY)));
    }
    //Here's where the error lies because of the bulletcolliding (I think)
    for (int i = 0; i < enemies.Count; i++)
    {
        if (!enemies[i].isVisible || enemies[i].bulletColliding)
        {
            enemies[i].bulletColliding = false;
            enemies.RemoveAt(i);
            i--;
        }
    }
}

厳密に単一のbulletColliding変数を使用することで、隕石が当たったときに true に設定されます。したがって、メソッドが隕石を順番にチェックすると、最初のオブジェクトをチェックするときでも bulletColliding が true に設定されていることがわかり、if 内のコードが実行されます。敵固有のブール値を使用すると、どの敵が攻撃を受けたかがわかり、それに応じて削除されます。

于 2012-11-03T18:42:13.893 に答える