所以我明白为什么会得到错误;我想知道一个可行的解决方法或替代方法!
因此,我有一个名为SpriteRenderable
的类,该类用于对屏幕上的所有对象进行排序和渲染,其中包含实例的位置和精灵。
public static ArrayList<SpriteRenderable> spriteRenderables;
SpriteRenderable
还有一个静态函数Render(SpriteBatch batch)
,该函数遍历此列表以在每个列表上调用update
函数。public static void Render() {
spriteBatch.begin();
for (ListIterator<SpriteRenderable> iter =
spriteRenderables.listIterator(); iter.hasNext();) {
SpriteRenderable spriteRenderable = iter.next();
spriteRenderable.update(delta);
spriteRenderable.sprite.draw(spriteBatch);
}
spriteBatch.end();
}
public abstract void update();
我还有另一个
Player
类,它扩展了SpriteRenderable
类,因此它会自动添加到静态ArrayList中,并在每个渲染周期更新。这也与Gun
和Bullet
类相同。Gun
类和Bullet
类也扩展了SpriteRenderable
。在Player
类更新功能中,如果(Gdx.input.isButtonPressed(Input.Buttons.LEFT))
,则调用Guns Shoot方法,然后在方法中调用Bullet shot = new Bullet();
在更新播放器之前,它可以正常工作,并且播放器开火;实例化的项目符号会在自身循环时添加到静态ArrayList中。原因:
Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
我试着用try和catch来包围foreach(SpriteRenderable)循环;但是由于异常,最终没有渲染任何精灵。
最佳答案
假设您遍历列表而不是对其进行修改,那么使用CopyOnWriteArrayList
会很好。但是,在迭代器的生命周期中进行的任何修改对于迭代器都是不可见的。