java - 池回收错误 2 个 Sprite 同时碰撞到一个 Sprite

标签 java android andengine

我有一个射击游戏,你向相反的方向发射两颗子弹,所以如果敌人接近子弹的起点(敌人在子弹起点的区域),就会发生错误,

这是我的代码:

if((_target.collidesWith(bullet))){

                    resourcesManager.enemyPool.recyclePoolItem(_target);
                    targets.remove();
                    score=score+1;

                }
                if((_target.collidesWith(bullet2))){
                    resourcesManager.enemyPool.recyclePoolItem(_target);
                    targets.remove();
                    score=score+1;
                    break;
                }

错误日志:

09-30 09:47:23.530: E/AndroidRuntime(1167): in writeCrashedAppName, pkgName :com.www.tangent
09-30 09:47:23.550: I/Process(1167): Sending signal. PID: 1167 SIG: 9
09-30 09:47:23.550: E/AndroidRuntime(1167): FATAL EXCEPTION: UpdateThread
09-30 09:47:23.550: E/AndroidRuntime(1167): java.lang.IllegalStateException
09-30 09:47:23.550: E/AndroidRuntime(1167):     at java.util.LinkedList$LinkIterator.remove(LinkedList.java:164)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at com.www.scene.WeaponSelectScene$1.onUpdate(WeaponSelectScene.java:318)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.engine.handler.UpdateHandlerList.onUpdate(UpdateHandlerList.java:47)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1395)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.entity.Entity.onUpdate(Entity.java:1167)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:288)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.entity.Entity.onUpdate(Entity.java:1167)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.engine.Engine.onUpdateScene(Engine.java:591)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.engine.Engine.onUpdate(Engine.java:586)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.engine.LimitedFPSEngine.onUpdate(LimitedFPSEngine.java:56)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.engine.Engine.onTickUpdate(Engine.java:548)
09-30 09:47:23.550: E/AndroidRuntime(1167):     at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)
09-30 09:47:23.570: I/BstWindowOrientationListener(521): getCurrentRotation(0)
09-30 09:47:23.570: I/ActivityManager(521): Process com.www.tangent (pid 1167) has died.
09-30 09:47:23.570: I/WindowManager(521): WIN DEATH: Window{b4846b48 SurfaceView paused=false}
09-30 09:47:23.590: E/InputDispatcher(521): channel 'b472fa40 com.www.tangent/com.www.tangent.GameActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
09-30 09:47:23.590: E/InputDispatcher(521): channel 'b472fa40 com.www.tangent/com.www.tangent.GameActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
09-30 09:47:23.590: I/WindowManager(521): WIN DEATH: Window{b472fa40 com.www.tangent/com.www.tangent.GameActivity paused=false}

最佳答案

我刚刚遇到了同样的问题,你的问题没有答案让我找到了我的问题。

事实上,这里您对 recyclePoolItem 进行了并发删除,因为在一帧中,您删除了同一个对象两次(当您的 _target 与两个对象碰撞时发生)。要纠正此问题,只需在“if”语句下使用“else if”编写代码,而不仅仅是“if”:

if((_target.collidesWith(bullet))){
    resourcesManager.enemyPool.recyclePoolItem(_target);
    targets.remove();
    score=score+1;
} else if((_target.collidesWith(bullet2))){
    resourcesManager.enemyPool.recyclePoolItem(_target);
    targets.remove();
    score=score+1;
}

关于java - 池回收错误 2 个 Sprite 同时碰撞到一个 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085358/

相关文章:

android - andengine activity bg 不适合屏幕

java - JUnit 为什么/如何通过带有编译器错误的测试?

Java 字符串在打印时终止

java - 在java android中使用两个比较器

Android Studio 未处理的异常警告

javascript - 在 Android HTML5 播放器中开始播放所需的用户手势

java - AndEngine:只是黑色背景,字体不显示

android - AndEngine如何搭建多层场景?

java - 获取MPEG-TS流媒体信息

java - 如果测试失败,则重试 TestNG 代码中的特定代码段,而不是整个测试