从 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() }
}
您可以在迭代时使用 Iterator
从 Collections
中删除项目
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
我正在 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() }
}
您可以在迭代时使用 Iterator
从 Collections
中删除项目
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