Java ContactListener在攻击敌人时未注册所有联系人-Box2d platformer
我的角色是一个用剑攻击的骑士,所以我认为以下是进行攻击碰撞的最简单方法:当玩家按下攻击按钮时,角色挥舞他的剑,并为挥舞创建一个新的固定装置/身体(玩家前面的一个矩形)。这是一个剑身攻击的职业:Java ContactListener在攻击敌人时未注册所有联系人-Box2d platformer,java,libgdx,box2d,Java,Libgdx,Box2d,我的角色是一个用剑攻击的骑士,所以我认为以下是进行攻击碰撞的最简单方法:当玩家按下攻击按钮时,角色挥舞他的剑,并为挥舞创建一个新的固定装置/身体(玩家前面的一个矩形)。这是一个剑身攻击的职业: public class SwordCut { private final GameScreen screen; private final World world; private Body b2body; protected Fixture fixture;
public class SwordCut {
private final GameScreen screen;
private final World world;
private Body b2body;
protected Fixture fixture;
public SwordCut(GameScreen screen) {
this.screen = screen;
this.world = screen.getWorld();
}
public void defineBody(float cutX, float cutY) {
BodyDef bdef = new BodyDef();
bdef.position.set(cutX, cutY);
bdef.type = BodyDef.BodyType.StaticBody;
b2body = world.createBody(bdef);
FixtureDef fdef = new FixtureDef();
PolygonShape shape = new PolygonShape();
shape.setAsBox(36f / 2f / Constants.PPM, 40f / 2 / Constants.PPM);
fdef.filter.categoryBits = Constants.ATTACK_COLLISION;
fdef.filter.maskBits =
Constants.ENEMY_BIT;
fdef.shape = shape;
fixture = b2body.createFixture(fdef);
fixture.setSensor(true);
fixture.setUserData(true);
}
public void destroyBody() {
world.destroyBody(b2body);
}
public Body getBody() {
return b2body;
}
}
在“接触听众”中,当敌人与剑开始接触时,我使敌人失去生命
@Override
public void beginContact(Contact contact) {
Fixture fixA = contact.getFixtureA();
Fixture fixB = contact.getFixtureB();
int cDef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits;
switch (cDef) {
...
case Constants.ATTACK_COLLISION | Constants.ENEMY_BIT:
if (fixA.getFilterData().categoryBits == Constants.ENEMY_BIT) {
((Monster) fixA.getUserData()).loseHealth(10);
Gdx.app.debug(TAG, "Enemy hit");
}
else {
((Monster) fixB.getUserData()).loseHealth(10);
Gdx.app.debug(TAG, "Enemy hit");
}
break;
然而,并不是所有的命中都被记录,当我在敌人不工作的情况下多次命中敌人时,有时与玩家撞到敌人会使敌人一次失去之前所有攻击的生命值(因此,之前所有的命中都是在触碰到敌人之后才被记录的)。有时有效,有时无效,我没有注意到任何特殊的原因或模式