gpt4 book ai didi

java - Android 游戏中的列表迭代器

转载 作者:行者123 更新时间:2023-12-02 08:14:06 25 4
gpt4 key购买 nike

我正在使用两个 ArrayList,一个用于敌人 Sprite ,另一个用于子弹。当我运行该应用程序时,它偶尔会在模拟器上崩溃,并且在几个级别内它会在发生碰撞时在设备上崩溃。日志不断告诉我有一个简单的 ListIterator 错误。我想知道如何实现 ListIterator。我没有使用过 ListIterator,我四处寻找信息和示例,但我对如何实际操作感到有点困惑。 add() 函数在我的 View 类的 onTouch 方法中调用,并且碰撞发生在我的线程类内部其自己的碰撞方法中。

日志:

07-20 19:57:46.604: ERROR/AndroidRuntime(234): Uncaught handler: thread Thread-9 exiting due to uncaught exception
07-20 19:57:46.613: ERROR/AndroidRuntime(234): java.util.ConcurrentModificationException
07-20 19:57:46.613: ERROR/AndroidRuntime(234): at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64)
07-20 19:57:46.613: ERROR/AndroidRuntime(234): at com.android.hitmanassault.HitmanView$HitmanThread.startGame(HitmanView.java:333)
07-20 19:57:46.613: ERROR/AndroidRuntime(234): at com.android.hitmanassault.HitmanView$HitmanThread.gameStart(HitmanView.java:290)
07-20 19:57:46.613: ERROR/AndroidRuntime(234): at com.android.hitmanassault.HitmanView$HitmanThread.updateGame(HitmanView.java:393)
07-20 19:57:46.613: ERROR/AndroidRuntime(234): at com.android.hitmanassault.HitmanView$HitmanThread.run(HitmanView.java:237)

检查碰撞:

private void startGame(){
synchronized(mSurfaceHolder){
for(Beam bullet: beam){
for(Sprite sprite: sprites){
if(checkCollision(sprite, bullet)){
sprites.remove(sprite);
beam.remove(bullet);
mScore = mScore + 1;
break;
}
}
}
}
}

碰撞方法:

public boolean checkCollision(Sprite sprite, Beam bullet){

boolean retValue = false;
int SpriteX = sprite.getX();
int SpriteY = sprite.getY();
int SpriteXS = sprite.getX() + sprite.getWidth();
int SpriteYS = sprite.getY() + sprite.getHeight();
int BeamX = bullet.getX();
int BeamY = bullet.getY();
int BeamXS = bullet.getX() + bullet.getBitmap().getWidth();
int BeamYS = bullet.getY() + bullet.getBitmap().getHeight();


if ((BeamX >= SpriteX && BeamX <= SpriteXS) || (BeamXS >= SpriteX && BeamXS <= SpriteXS)) {
if ((BeamY >= SpriteY && BeamY <= SpriteYS) || (BeamYS >= SpriteY && BeamYS <= SpriteYS)) {
retValue = true;
}
}
return retValue;
}

最佳答案

如果在另一个线程迭代列表时向列表添加元素,您将得到 ConcurrentModificationException .

您可以尝试ConcurrentLinkedQueue ,但是根据您对游戏一致性模型的要求,您应该重新考虑架构。

这就是问题所在。

for(Sprite sprite: sprites) { <------- Iterate
if(checkCollision(sprite, bullet)) {
sprites.remove(sprite); <-------- Modify
...

快速修复是您可以收集要删除的所有元素,然后在 for 循环后删除它们。

ArrayList<Beam> toBeRemoveBeams = new ArrayList<Beam>();
ArrayList<Sprite> toBeRemoveSprites = new ArrayList<Sprite>();
for(Beam bullet: beam){
for(Sprite sprite: sprites){
if(checkCollision(sprite, bullet)){
toBeRemoveBeams.add(beam);
toBeRemoveSprites.add(sprite);
mScore = mScore + 1;
break;
}
}
}
beam.removeAll(toBeRemoveBeams);
sprites.removeAll(toBeRemoveSprites );

关于java - Android 游戏中的列表迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com