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;
}