1

私はこのゲームを機能させようとしています。そうではありません。

Iterator<Circle> iter = asteroids.iterator();
    while (iter.hasNext()) {
        Circle asteroid = iter.next();
        asteroid.y -= speed * Gdx.graphics.getDeltaTime();
        if (asteroid.y + asteroid.radius * 2 < 0)
            iter.remove();
        if (Intersector.overlapCircles(shipCir, asteroid) && alive) {
            iter.remove();
            alive = false;

        }
    }

    Iterator<Rectangle> iterB = bullets.iterator();
    while (iterB.hasNext()) {
        Rectangle bullet = iterB.next();
        bullet.y += 300 * Gdx.graphics.getDeltaTime();
        if (bullet.y > Gdx.graphics.getHeight())
            iterB.remove();

    }

    /*if (Intersector.overlapCircleRectangle(asteroid, bullet)) {
        // REMOVE OBJECT
    }                                                             
       */

動作していない部分は、上記のコメント アウトされたセクションです。それを解決する方法を教えていただければ、それは素晴らしいことです。whileループの中にいて、理由がわからない場合を除き、小惑星または弾丸にアクセスできません。

更新: これが、あなたが私に試してみるように言ったと思うものです。それは今でも同じことをしています。

Iterator<Circle> iter = asteroids.iterator();
Iterator<Rectangle> iterB = bullets.iterator();

    while (iter.hasNext()) {
        Circle asteroid = iter.next();
        asteroid.y -= speed * Gdx.graphics.getDeltaTime();
        if (asteroid.y + asteroid.radius * 2 < 0)
            iter.remove();
        if (Intersector.overlapCircles(shipCir, asteroid) && alive) {
            iter.remove();
            alive = false;
            if (exploding) {
                exploding = false;
                explode.start();
            }
        }       
        while (iterB.hasNext()) {
            Rectangle bullet = iterB.next();
            bullet.y += 300 * Gdx.graphics.getDeltaTime();
            if (bullet.y > Gdx.graphics.getHeight())
                iterB.remove();
        }
    }

更新: "iterB.remove();" で時折エラーが発生します。理由はわかりません。

コード:

Iterator<Circle> iter = asteroids.iterator();
    while (iter.hasNext()) {
        Circle asteroid = iter.next();
        asteroid.y -= speed * Gdx.graphics.getDeltaTime();
        if (asteroid.y + asteroid.radius * 2 < 0)
            iter.remove();
        if (Intersector.overlapCircles(shipCir, asteroid) && alive) {
            iter.remove();
            alive = false;
            if (!exploding) {
                exploding = true;
                explode.start();
            }
        }
        Iterator<Rectangle> iterB = bullets.iterator();
        while (iterB.hasNext()) {
            Rectangle bullet = iterB.next();
            bullet.y += 150 * Gdx.graphics.getDeltaTime();

            if (Intersector.overlapCircleRectangle(asteroid, bullet)) {
                iterB.remove();
                iter.remove();

            }
            if (bullet.y > Gdx.graphics.getHeight())
                iterB.remove(); // ERROR HERE
        }
    }

エラーは次のとおりです。

 Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.ArrayIndexOutOfBoundsException: -1
at  com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:111)
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at com.badlogic.gdx.utils.Array.removeIndex(Array.java:216)
at com.badlogic.gdx.utils.Array$ArrayIterator.remove(Array.java:433)
at com.chanceleachman.space.Screens.GameScreen.render(GameScreen.java:140)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.chanceleachman.space.Space.render(Space.java:37)
at     com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:190)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:108)
4

1 に答える 1

1

asteroidおよび変数は、bulletそれぞれが定義されている while ループにスコープが設定されているため、それらのスコープ外では使用できません。Java変数のスコープを確認する必要があります。

while ループ (つまり) の宣言を巻き上げbulletたり外したりすることでコンパイラ エラーを修正できますが、結果のコードが意図したとおりに動作するとは思いません (また、弾丸や小惑星がない場所ではクラッシュします)。 .asteroidCircle asteroid; Rectangle bullet;

弾丸がない場合(または小惑星がない場合)と、複数の弾丸と複数の小惑星がある場合を考慮する必要があります。すべての小惑星に対してすべての弾丸をチェックして、それらが交差するかどうかを確認する必要があります。

于 2013-01-02T05:06:17.813 に答える