0

私はプログラミングの 2 年目で、Java しか知りません。ただし、私のクラスでは、垂直方向のサイド スクローラーを作成する必要があります。私の設定では、敵船用の ArrayList と、プレイヤーのロケット用の ArrayList があります。render(Graphics2D g) メソッドでプレイヤー船の正確な場所に 2 つのロケットを描画し、同じメソッドで敵船を描画します。ロケットの ArrayList は、

arsenal.add(r);
arsenal.add(r2);

ここで、r と r2 はパラメーター (x、y、w、h) を持つロケットであり、arsenal はロケットの配列リストです。宇宙船のさまざまな端にある、非常に特定の場所にそれらを描画するように設定しました。update() メソッドには、次のメソッドがあります。

if (arsenal.size() < 0){
        arsenal.add(new Rocket(p.currentX(), p.getHalfY(),30,30));
        arsenal.add(new Rocket(p.getHalfX(), p.getHalfY(), 30, 30));
    }

これは、arraylist が空になったときにロケットが再追加され、宇宙船の端に対応する座標に再描画されるようにするためです。ロケットが消える唯一の方法は、画面外に出るか、敵と衝突するときです。私はそれをチェックするためにこのコードを入れました:

for(int x = army.size()-1; x >= 0; x--){
        if (army.get(x).getR().y > 1024){
            army.remove(x);
        }
        if(p.intersects(army.get(x).getR())){
            army.remove(x);
            p.changeH(10);
        }
        for (int q = arsenal.size()-1; q>=0;q++){
            if (arsenal.get(q).intersects(army.get(x).getR())){
                score+=20;
                army.remove(x);
                arsenal.remove(q);
            }
        }
}

このメソッド全体が敵船の配列リスト「army」を調べて、(1) 敵船が設定された高さを超えたかどうか、(2) プレイヤー船が敵船と衝突したかどうか、(3) ロケットがアーセナル アレイリストで敵艦と衝突しました。すべての衝突は長方形を使用して行われます。p.changeH(10); コマンドはプレイヤーの体力を 10 下げることで、スコアは +=20 です。スコアを上げることです。これらすべてのチェックで、敵艦が配列リストから削除されて描画されなくなることを確認します。次に、ロケットが画面外に出たり衝突した場合、それらも配列リストから削除され、仮想的に描画が取り消されます。言及は、敵艦のarralustが以下によって居住されるようになることです:

if (frameCount % 100 == 0){
            Random r = new Random();
            int randX = r.nextInt(width - 10);
            army.add(new EnemyShip(randX, -200 , 47, 47, enemyP1));
}

パラメータ (x,y,w,h,Image) を受け取り、横スクロールのように見せるために最初にオフスクリーンで描画されます。x 変数はランダムであるため、すべての船が同じ場所に表示されるわけではありません。frameCount は更新ごとに 1 ずつ増加し、update() メソッドは 1 秒間に 60 回呼び出されます。

私のプロジェクトへのこの大規模な紹介の後、私の問題は、ゲームを実行するたびに、ゲームが数秒後に停止し、Eclipse がコードでエラーを表示することです。

if (arsenal.get(q).intersects(army.get(x).getR())){

問題がわかりません。どんな助けでも大歓迎です。さらにゲーム コードが必要な場合は、お知らせください。ありがとう!

編集:

GameScreen.update(GameScreen.java:108)

次の行に移動します。

 if (arsenal.get(q).intersects(army.get(x).getR())){

これはループの一部です:

for (int q = arsenal.size()-1; q>=0;q++){
            if (arsenal.get(q).intersects(army.get(x).getR())){
                score+=20;
                army.remove(x);
                arsenal.remove(q);
            }
}

コンストラクターでは、コマンドを配置する場所です

arsenal.add(r);
arsenal.add(r2);

これにより、それらが arraylist に追加されます。render(Graphics2D g) メソッドでは、次を使用して描画します。

for (Rocket r :arsenal){
            r.draw(g);
}

ロケット コンストラクターでは、p.currentX() はプレーヤーの現在の x 座標であり、p.getHalfY() と p.getHalfX() は一目瞭然です。それらは、ロケット r が片側に表示され、ロケット r2 が反対側に表示されるようにコード化されています。rMove と r2move という 2 つのブール変数も作成しました。これらはロケットのスムーズな動きを助け、いつ動くかを伝えます:

if (!r2move){
        r2.setP(p.getR().x + 40, currentY + 12);
}
    if(!rMove){
        r.setP(p.currentX() - 10, currentY + 12);
}

setP(x,y) は、ロケットの位置を元の場所に設定します。私はこれについて先生に話しました.彼は私が配列リストと別々のオブジェクトの両方を使用していると言いましたが、私は問題を理解していません. さらに関連するコードが必要な場合は、お知らせください。このコード行は、いつ移動するかをロケットに伝えます。それは、スペース ボタンが発射されたときです。

if (rMove && r2move){
    for (Rocket p:arsenal){
        p.move();
    }
}
if(r.getR().y < 0){     
        rMove = false;
        space = false;
}
if (r2.getR().y < 0){
        r2move = false;
        space = false;
}
4

1 に答える 1

1

例外が伝えているのは、ArrayList2 つの要素が含まれていることです。つまり、有効なインデックスは 0 と 1 です。しかし、コードは.get()この ArrayList のメソッドをインデックス値 2 で呼び出していますが、これは明らかに存在しません。この例外が発生します。

qコードを見ると、次の行でループ変数を初期化して使用する方法に問題があるようです。

for (int q = arsenal.size()-1; q>=0;q++){
            if (arsenal.get(q).intersects(army.get(x).getR()))

に 2 つのarsenal要素があり、したがってサイズが 2 であるとします。その結果、qは値 1 で初期化されます。ifステートメントが呼び出され、呼び出さarsenal.get(1)れます。これはarsenalArraylist の有効なインデックスであるため、このコードはエラーなしで渡されます。

ループの次のパスでは、qは 1 ずつインクリメントされ、2 になります。ループ チェック条件に従って、2 > 0実行は次の行に続きます。ifステートメントが再度呼び出され、呼び出されますarsenal.get(2)arsenal2 は項目が 2 つしかない無効なインデックスであるため、表示される例外がスローされます。

この問題は、ループ内で値をインクリメントする代わりにデクリメントすることで修正できます。qfor

于 2014-09-04T01:05:06.987 に答える