0

ミサイル専用のクラスを追加しました。コードを以下に示します。

 class Missile
    {
        Vector2 Position;

        public Missile(int XInitialPos, int YInitialPos)
        {
            Position = new Vector2(XInitialPos, YInitialPos);
        }

        public void Move()
        {
            Position.Y = Position.Y - 8;
        }
        public void MoveMissile()
        {
            Position.Y = Position.Y + 8;
        }

        public Vector2 GetPosition()
        {
            return Position;
        }

}

ランチャーを撃つためにmoveメソッドを呼び出す方法は知っていますが、侵入者を撃つためにランダムに何かを呼び出す方法はわかりません。どんな助けでもいただければ幸いです。ありがとうございました。

code which invokes launcher to shoot in the update method:
 if (MissileFired != null && MissileFired.GetPosition().Y < 20) MissileFired = null;

            if (Keyboard.GetState().IsKeyDown(Keys.Space) && MissileFired == null)
            {
                MissileFired = new Missile(LauncherXPos, 650);
             }
4

1 に答える 1

2

のような名前の侵入者にメソッドを追加できますShouldShootMissile。おそらく、ゲーム時間の表現をパラメーター (doubleまたは XNAGameTimeオブジェクト) として取得する必要があります。この関数は を返しますbool

次に、この情報を使用して、さまざまな要因に基づいて侵略者がミサイルを発射する資格があるかどうかを判断できます。これらの要因はおそらく、発射できる最大レート (500 ミリ秒ごとに 1 回) を示す一定の要因であり、次に可変性 (250 ミリ秒) です。標準の乱数ジェネレーターを使用して変動性を計算し、これらの条件に応じて true または false を返すことができます。

多分このようなもの:

    Random rand = new Random();
    double lastMissileFired = 0d;

    private bool ShouldFireMissile(double time)
    {
        double fixedDelay = 500d;
        double firingProbability = 0.1d

        if (time - lastMissileFired < fixedDelay)
            return false;

        if (rand.NextDouble() > firingProbability)
            return false;

        lastMissileFired = time;
        return true;
    }

警告、上記のコードにはおそらく多くの問題が含まれており、ほぼ確実にあなたのプログラムにうまく適合しませんが、私の意図がより明確になることを願っています。250 ミリ秒の可変遅延を、発射される確率に変更することにしました。

インベーダーが更新されるたびに上記のコードを実行します

if (invader.ShouldFireMissile())
    invader.FireMissile();
于 2012-04-20T19:31:15.580 に答える