从 ArrayList 中删除项目时的 For 循环

For loop while removing items from ArrayList

我正在 Kotlin.Using Libgdx 和 Box2d

制作游戏

1.function 通过 Box2d 创建实体并将这些实体添加到 bodyArrayList:ArrayList

2.function 创建纹理并将这些纹理添加到 textureArrayList

3.function 正在匹配 bodyArrayList 的项目和 textureArrayList 的项目。函数有for循环。

4.function 正在撞墙时移除尸体。

5.function 正在撞墙时移除纹理。

所有功能都在 update() 方法中工作。 所有这些都运行良好。但是,因为在 for 循环对这些 ArrayLists 起作用时我无法删除 te ArrayLists 的项目,ArrayList 的项目正在增加并且游戏在 1 小时后开始变慢。正如您猜测的那样,ArrayLists 的大小正在增加。 如果我尝试删除 ArrayLists 的项目,我会在 matching() 函数中采取异常,如您所料。

我的问题是如何在“for 循环”以安全方式工作时从 ArrayLists 中删除这些项目。

1.function 创建实体

var body = makeBody()
 bodyArray.add(body)

2.function 创建纹理

var texture=makeTexture()
 textureArray.add(texture)

3.function 正在匹配 bodyArrayList 的项目与 textureArrayList

的项目
for (i in 0..bodyArray.size-1) {

 textureArray[i].setPosition(bodyArray[i].position.x, bodyArray[i].position.y)
}

4.funtion 正在撞墙时移除尸体。

override fun beginContact(contact: Contact?) {
        val userDataA = contact!!.fixtureA.userData.toString()
        val userDataB = contact.fixtureB.userData.toString()

            if ((userDataA == "ball" && userDataB == "wall")){
            val bodyA=contact.fixtureA.body
           Gdx.app.postRunnable(Runnable(){
                run(){
                    world.destroyBody(bodyA) } })
 }

5.function 正在撞墙时移除纹理。

for (texture: MyTextures in MyTextures.getList(Ball::class.java.canonicalName)) {
            if (ball.overlaps(wall)) {
                ball.remove() }
        }

您可以在迭代时使用 IteratorCollections 中删除项目

val list = arrayListOf<Int>()
val listIterator = list.iterator()
while(listIterator.hasNext()){
    //get item
    val item = listIterator.next() 
    //items can be removed safely using
    listIterator.remove()
}

如果你正在使用 badLogic Array class 你可以给它你的纹理 class 并在处理方法中处理它的每一个项目

private val texture = Texture("badlogic.jpg")
private val myArray = Array<Texture>()

    fun dispose(){
       myArray[i].dispose()
    }

这是 link 有关纹理的更多信息...

你也可以处理 Screen Class