2

こんにちは、弾丸オブジェクトの配列があります。弾丸オブジェクト isAlive var を false に設定しています。スペースボタンをクリックせずにコードを実行すると(弾丸が発射されます)、配列オブジェクト isAlive var が出力され、それらがすべて false として出力されます(本来のように)。

箇条書きが画面に表示されて正しく移動したら、スペース ボタンをクリックすると、isAlive var を示す箇条書き配列を印刷すると、それらはすべて同じ x/y 位置で true に設定されます。スペース ボタンを 2 回クリックすると、2 つの箇条書き表示されて通常どおり移動しますが、配列を印刷すると、最初の 10 個の要素が同じ x/y 位置 (画面の最初の箇条書き) で生きていることが示され、次の 10 個も同じ x/y 位置で生きています(画面上の 2 番目の箇条書き)

スペースバーをこれ以上押しても、新しい弾丸は追加されません。here; fireButton() のコードです

public void fireBullet(){
    if(currentBullet > BULLETS -1){
        currentBullet = 0;
    }
    if(bullet[currentBullet].isAlive()==false){
        bullet[currentBullet].setAlive(true);
        bullet[currentBullet].setxPos(ship.getxPos());
        bullet[currentBullet].setyPos(ship.getyPos());
    }
    currentBullet ++;
}

これが KeyPressedMethod で呼び出されたものです

case KeyEvent.VK_SPACE: 
        fireBullet();
        break;

誰かが私が間違っているところを見ることができますか?しばらくの間コードをいじっていて、頭を悩ませています:)

編集:ここでできればすべての質問に答えます:) 1) currentBullet はプライベート クラス メンバーであり、最初は 0 に初期化され、20 まで発射された弾丸ごとに fireBullet() メソッドでインクリメントされます。その後、0 にリセットされます。

2) 弾丸配列を初期化するとき、新しい Bullet() を各要素に割り当てます。各弾丸コンストラクターは isAlive を false に設定します

3) 箇条書き変数 isAlive は、画面を離れると false に戻されます 4) keypressed メソッドの全文

public void keyPressed(KeyEvent k) {
    int keyCode = k.getKeyCode();

    switch (keyCode) {

    case KeyEvent.VK_A:
        //move ship left
        if(ship.getxPos()<20){
            ship.setxPos(20);
        }else
        ship.setxPos(ship.getxPos()-1);
        break;
    case KeyEvent.VK_D:
        if(ship.getxPos()>1260){
            ship.setxPos(1260);
        }else
        ship.setxPos(ship.getxPos()+1);
        break;
    case KeyEvent.VK_SPACE: 
        fireBullet();
        break;
    }


}//end keypressed event

弾丸を描画しているので、レンダリングは問題ないと思いますが、10 個または 20 個の弾丸を重ねて描画しているため、コードを実行すると、2 つの弾丸が画面を上に移動するだけです。

問題は、スペースバーを押すごとに生きている弾丸が1つだけであるべきですが、一度押すと、20個の弾丸すべてが生きているように設定されることです!

2 番目の編集: ゲーム ループの最後に現在の弾丸を出力すると、スペースバーを押すたびに fireBullet() メソッドが呼び出されていることを示す正しくインクリメントしているように見えます。

4

1 に答える 1

0

おかげですべてが機能しました!上記の NPE が提案したように、fireBullet() メソッドと他の 2 つのキープレスに小さな println を入れました。 . JFrameコンストラクターではなく、ペイントメソッドにaddKeyListener(this)があったことが判明しました。正直に言って、ペイントメソッドにどのように配置されたのかわかりません:)

于 2013-03-02T20:34:58.753 に答える