繁体   English   中英

LibGDX中的碰撞

[英]Collision in LibGDX

我正在尝试使该游戏正常运行。 不是。

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)

asteroidbullet变量的作用域为while循环,它们分别在其中定义,因此不能在这些作用域之外使用。 您应该查看Java 变量作用域

您可以通过在while循环外提升bulletasteroid的声明(即Circle asteroid; Rectangle bullet; )来解决编译器错误,但是我认为结果代码不会达到您的预期(并且会崩溃到哪里)没有子弹或小行星)。

您需要考虑没有子弹(或小行星)的情况,并且需要考虑有多个子弹和小行星的情况。 您需要针对每个小行星检查每个子弹,以查看它们是否相交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM