1

私のゲームでは、と呼ばれるブール変数を使用しています

onScreen

ゲームが開始されるたびに true に設定されます。と呼ばれるint変数もあります

onScreenTime

ゲーム開始時に180に設定されています。これらは、設定された時間、画面に「Wave X の準備」というテキストを表示するために使用されます。onScreenTime が 180 で、fps が 60 であるため、テキストは 2 秒間しか表示されません。2 秒が経過すると、onScreen が false に設定され、ゲームが続行されます。コード:

if (onScreen){
        g.setFont(new Font("Geneva", Font.BOLD, 50));
        g.setColor(Color.BLACK);
        g.drawString("Prepare for wave: " + currentLevel,400,500);
}

onScreen = true の場合にのみ、画面にテキストを描画します。次のコードは update() メソッド内にあり、これまでに説明した 2 つの変数を操作します。

onScreenTime--;
    if (onScreenTime == 0){
        onScreen = false;
}

基本的に、onScreenTime は update() が呼び出されるたびに 1 ずつ減少し (1 秒間に 60 回)、0 の場合は onScreen = false になります。次に、同じ update() メソッドに、2 つの if ステートメントがありますが、これは一目瞭然です。

if (score > 500){
        currentLevel = 2;
        onScreen = true;
        onScreenTime = 180;
}
if (score > 1000){
        currentLevel = 3;
        onScreen = true;
        onScreenTime = 180;
}

そして最後に、同じ update() メソッドで、

if (currentLevel == 1 && onScreen == false){
        wave(2,enemyP,100);
}
if (currentLevel == 2 && onScreen == false){
        wave(3,enemyP1,90);
}
if (currentLevel == 3 && onScreen == false){
        wave(3,enemyP2,80);
}

currentLevel は、敵、描画される画像、一度に画面に描画される数、出現する頻度を決定します。wave() は各レベルのウェーブを作成するメソッドです。それは次のように表されます。

public void wave(int amount, Image i, int seconds){
    for (int x = amount; x > 0; x--){
        if (frameCount % seconds == 0){
            Random r = new Random();
            int randX = r.nextInt(width - 20)+10;
            army.add(new EnemyShip(randX,(int)(Math.random()*100)-300,enemyH,enemyW,i,10));
        }
    }
}

i はイメージ、enemyH とenemyW = 30、10 はライフです。それは後で変更されます。私の問題は、「ウェーブの準備: 2」というテキストが表示されると消えないことです。最初の「ウェーブの準備: 1」は機能して消えますが、2 つ目は機能しないため、敵はスポーンしません。

編集: コメントで指摘されているように、私は 2 秒を書きましたが、それは 3 秒である必要があります。 編集: 以前の方法を次のように変更しました:

if (onScreenTime <= 0){
        onScreen = false;
        onScreenTime = 180;
}

また、以前の方法を次のように変更しました。

if (score == 500){
        currentLevel = 2;
        onScreen = true;
        onScreenTime = 180;
}
if (score == 1000){
        currentLevel = 3;
        onScreen = true;
        onScreenTime = 180;
}

ヒットごとにスコアが 20 ずつ上がります。問題は、== 500 ではなく if(score > 500) に設定したことだと思います。

4

2 に答える 2