Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Box2D World.destroyBody真的有车吗_Java_Libgdx_Box2d - Fatal编程技术网

Java Box2D World.destroyBody真的有车吗

Java Box2D World.destroyBody真的有车吗,java,libgdx,box2d,Java,Libgdx,Box2d,我有一个角色,当按下按钮时就会射击。当子弹击中墙壁或敌人时,它应该被摧毁。我的问题是,有时子弹击中墙壁时不会被摧毁,这会导致或诸如此类的事情出错。有什么办法让它变得更好吗 编辑:我意识到问题是,如果子弹到达墙壁需要很长时间,它会摧毁新的子弹,而不是刚刚击中墙壁的子弹。一个临时的解决办法是让角色射击变慢,这样在前一颗子弹击中墙壁之前就不会产生新的子弹。但是有没有更好的方法 这是我销毁项目符号或创建新项目符号的更新方法: shootTimer += dt; if(setToDestroy){

我有一个角色,当按下按钮时就会射击。当子弹击中墙壁或敌人时,它应该被摧毁。我的问题是,有时子弹击中墙壁时不会被摧毁,这会导致或诸如此类的事情出错。有什么办法让它变得更好吗

编辑:我意识到问题是,如果子弹到达墙壁需要很长时间,它会摧毁新的子弹,而不是刚刚击中墙壁的子弹。一个临时的解决办法是让角色射击变慢,这样在前一颗子弹击中墙壁之前就不会产生新的子弹。但是有没有更好的方法

这是我销毁项目符号或创建新项目符号的更新方法:

shootTimer += dt;
    if(setToDestroy){
        world.destroyBody(b2Body);
        setToDestroy = false;
    }
   else if(currentStateShooting == State.NORTH  && shootTimer >= SHOOT_WAIT_TIME){
        shootTimer = 0;
        defineBullet(isaac.ISAACX, isaac.ISAACY);
        b2Body.applyLinearImpulse(0, 3, b2Body.getWorldCenter().x, b2Body.getWorldCenter().y, true);
   }
这是worldContactListener方法的主要功能:

public class worldContactListener implements ContactListener {
@Override
public void beginContact(Contact contact) {
    Fixture fixA = contact.getFixtureA();
    Fixture fixB = contact.getFixtureB();

    int cDef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits;

    if("head".equals(fixA.getUserData()) || "head".equals(fixB.getUserData())){
        Fixture body = fixA.getUserData() == "head" ? fixA : fixB;
        Fixture object = body == fixA ? fixB : fixA;

        if(object.getUserData() != null && interactiveTileObject.class.isAssignableFrom(object.getUserData().getClass())){
            ((interactiveTileObject) object.getUserData()).onBodyHit();
        }
    }
    else if("body".equals(fixA.getUserData()) || "body".equals(fixB.getUserData())){
        Fixture body = fixA.getUserData() == "body" ? fixA : fixB;
        Fixture object = body == fixA ? fixB : fixA;

        if(object.getUserData() != null && interactiveTileObject.class.isAssignableFrom(object.getUserData().getClass())){
            ((interactiveTileObject) object.getUserData()).onBodyHit();
        }
    }


    switch (cDef) {
        case icsGame.BULLET_BIT | icsGame.ENEMY_BIT:
            if (fixA.getFilterData().categoryBits == icsGame.ENEMY_BIT) {
                ((enemy) fixA.getUserData()).hit();
                ((isaacHead) fixB.getUserData()).destroyBullet();
            } else if (fixB.getFilterData().categoryBits == icsGame.ENEMY_BIT) {
                ((enemy) fixB.getUserData()).hit();
                ((isaacHead) fixA.getUserData()).destroyBullet();
            }
            break;
        case icsGame.BULLET_BIT | icsGame.DEAFAULT_BIT:
            if (fixA.getFilterData().categoryBits == icsGame.BULLET_BIT) {
                ((isaacHead) fixA.getUserData()).destroyBullet();
            } else if (fixB.getFilterData().categoryBits == icsGame.BULLET_BIT) {
                ((isaacHead) fixB.getUserData()).destroyBullet();
            }
            break;
        case icsGame.ISAAC_BIT | icsGame.ENEMY_BIT:
            Gdx.app.log("ISAAC", "DIED");
            break;
        case icsGame.ENEMY_BIT | icsGame.DEAFAULT_BIT:
            if (fixA.getFilterData().categoryBits == icsGame.ENEMY_BIT) {
                ((enemy) fixA.getUserData()).reverseVelocity(true, true);
            } else if (fixB.getFilterData().categoryBits == icsGame.ENEMY_BIT) {
                ((enemy) fixB.getUserData()).reverseVelocity(true, true);
            }
            break;
        case icsGame.ENEMY_BIT | icsGame.ENEMY_BIT:
                ((enemy) fixA.getUserData()).reverseVelocity(true, false);
                ((enemy) fixB.getUserData()).reverseVelocity(true, false);
                break;
    }
}
这就是销毁子弹的方法:

public void destroyBullet(){
    setToDestroy = true;
}