【问题标题】:LibGDX Making a single bullet kill only one enemy when enemies are overlappingLibGDX 当敌人重叠时,用一颗子弹只杀死一个敌人
【发布时间】:2014-02-02 15:29:31
【问题描述】:

我正在使用 LibGDX 制作射击游戏。当一颗子弹击中一个敌人时,我的代码有效。当多个敌人堆叠并且子弹的碰撞盒击中多个敌人碰撞盒时,游戏会崩溃并出现 线程“LWJGL Application”中的异常 java.lang.ArrayIndexOutOfBoundsException: -1

如果我错了,请纠正我,但我认为这是因为迭代器试图从子弹数组中移除与在该碰撞中杀死的敌人一样多的对象,而只有一颗子弹杀死三个敌人项目符号数组索引低于零导致异常。

我的问题是:如何修改循环/代码,即使有许多敌人“堆叠”并且一颗子弹同时击中多个敌人,一个敌人也会死于一颗子弹。谢谢。

bIter = bullets.iterator();
        while(bIter.hasNext()){
            b = bIter.next();           
            mIter = monsters.iterator();
            while(mIter.hasNext()){
                m = mIter.next();

                if(m.getBounds().overlaps(b.getBounds())){

                    mIter.remove();
                    bIter.remove();

                }
            }
        }

【问题讨论】:

    标签: java iterator libgdx collision indexoutofboundsexception


    【解决方案1】:

    添加休息对您有帮助吗?一旦一颗子弹击中敌人,它就会停止循环。两者都被移除(但只有一个敌人),我们从下一个子弹开始。

    bIter = bullets.iterator();
    while(bIter.hasNext()){
        b = bIter.next();           
        mIter = monsters.iterator();
        while(mIter.hasNext()){
            m = mIter.next();
            if(m.getBounds().overlaps(b.getBounds())){
                mIter.remove();
                bIter.remove();
                break; // <-- this is new
            }
        }
    }
    

    【讨论】:

    • 嗯,但是确实如此。再次感谢。我先暂时修复了它,在循环中添加了一个小计时器,但到目前为止这是更微妙和有效的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多