【发布时间】:2014-09-15 08:51:30
【问题描述】:
所以基本上我在尝试销毁不在屏幕范围内的实体时遇到错误。当其他类型的主体被破坏时,我的一种类型的主体也开始表现得很奇怪(例如子弹开始向后移动)这里是代码示例:
主游戏循环类:
Array<Body> bodies = new Array<Body>(world.getBodyCount());
world.getBodies(bodies);
for (Body body : bodies) {
check = 0;
if (BodyUtils.bodyIsEnemy(body)){
update(body);
check = 1;
}
if (BodyUtils.bodyIsBullet(body) && check == 0){
update1(body);
check = 0;
}
}
private void update(Body body) {
if (!BodyUtils.bodyInBounds(body)) {
if (BodyUtils.bodyIsEnemy(body) && !player.isHit()) {
createEnemy();
}
world.destroyBody(body);
}
}
private void update1(Body body) {
if (!BodyUtils.bulletInBounds(body))
world.destroyBody(body);
}
其他类:
public static boolean bodyInBounds(Body body) {
UserData userData = (UserData) body.getUserData();
switch (userData.getUserDataType()) {
case ENEMY:
return body.getPosition().x + userData.getWidth() / 2 > 0;
}
return true;
}
public static boolean bulletInBounds(Body body) {
UserData userData = (UserData) body.getUserData();
switch (userData.getUserDataType()) {
case BULLET:
return body.getPosition().x + userData.getWidth() < 20;
}
return true;
}
【问题讨论】:
-
您是否在
world.step运行时执行此操作?这意味着例如在回调中? -
是的,世界步骤的运行方法与我正在执行循环的方法相同
-
是同一个方法,还是并行运行?
-
您可以尝试延迟删除:
Gdx.app.postRunnable(new Runnable() {@Override public void run () {world.destroyBody(toRemove);}}); -
同样的方法,“postRunnable”没有用,更清楚的问题是:情况是这样我有3种类型的身体:敌人,玩家和子弹,敌人有-10f速度和子弹的速度为 10f,当敌人越界(小于 0 坐标)时它被摧毁,但如果我在敌人被摧毁的同时射击(并在 2-3 秒后)我的子弹速度从 10f 变为 0(甚至不知道为什么),在第二次点击后,我的程序因致命错误而崩溃:EXCEPTION_ACCESS_VIOLATION (0xc0000005)。