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)。