Libgdx销毁多个实体
所以基本上,当我试图摧毁不在屏幕范围内的物体时,会出现一个错误。另外,当其他类型的实体被销毁时,我的一种类型的实体开始表现出奇怪的行为(示例项目符号开始向后移动),下面是代码示例: 主游戏循环类:Libgdx销毁多个实体,libgdx,destroy,bullet,Libgdx,Destroy,Bullet,所以基本上,当我试图摧毁不在屏幕范围内的物体时,会出现一个错误。另外,当其他类型的实体被销毁时,我的一种类型的实体开始表现出奇怪的行为(示例项目符号开始向后移动),下面是代码示例: 主游戏循环类: Array<Body> bodies = new Array<Body>(world.getBodyCount()); world.getBodies(bodies); for (Body body : bodies) { check = 0;
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);
}
数组体=新数组(world.getBodyCount());
世界卫生组织(机构);
用于(主体:主体){
检查=0;
if(BodyUtils.bodyisnemy(body)){
更新(正文);
检查=1;
}
if(BodyUtils.bodyIsBullet(body)和&检查==0){
更新1(正文);
检查=0;
}
}
私有无效更新(正文){
如果(!BodyUtils.bodyInBounds(body)){
if(BodyUtils.bodyisnemy(body)&&!player.isHit()){
创建敌人();
}
世界。毁灭体(body);
}
}
私有无效更新1(正文){
如果(!BodyUtils.bulletInBounds(body))
世界。毁灭体(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;
}
公共静态布尔bodyInBounds(Body){
UserData UserData=(UserData)body.getUserData();
开关(userData.getUserDataType()){
案例敌人:
返回body.getPosition().x+userData.getWidth()/2>0;
}
返回true;
}
公共静态布尔bulletInBounds(正文){
UserData UserData=(UserData)body.getUserData();
开关(userData.getUserDataType()){
案例要点:
返回body.getPosition().x+userData.getWidth()<20;
}
返回true;
}
修复了它,create敌方()方法放在world.destroyBody(body)方法之后。在运行world.step
时,您是否正在执行此操作?例如,这意味着在回调中?是的,world步骤在我为loopit所做的相同方法中运行,它在相同的方法中运行,或者它并行运行?您可以尝试延迟删除:Gdx.app.postRunnable(new Runnable(){@Override public void run(){world.destroyBody(toRemove);})代码>同样的方法,“postRunnable”不起作用,为了更清楚地说明问题:情况是,我得到了3种类型的尸体:敌人、玩家和子弹,敌人的速度为-10f,子弹的速度为10f,当敌人越界(小于0坐标)时,它被摧毁,但如果我在敌人被摧毁的同时射击(和2-3秒后)我的子弹速度从10f变为0(甚至不知道为什么),第二次点击后,我的程序崩溃,出现致命错误:异常\访问\违规(0xc0000005)。