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;
然而,并不是所有的命中都被记录,当我在敌人不工作的情况下多次命中敌人时,有时与玩家撞到敌人会使敌人一次失去之前所有攻击的生命值(因此,之前所有的命中都是在触碰到敌人之后才被记录的)。有时有效,有时无效,我没有注意到任何特殊的原因或模式