ContactListener не регистрирует все контакты при атаке врага - платформер Box2d - PullRequest
1 голос
/ 16 июня 2020

Мой персонаж - рыцарь, который атакует мечом, поэтому я решил, что следующий способ будет самым простым способом создания столкновений атак: когда игрок нажимает кнопку атаки, персонаж взмахивает мечом и создается новое приспособление / тело для качелей (прямоугольник перед игроком). Это класс с телом атаки мечом:

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;

Однако , не все попадания регистрируются, и когда я несколько раз ударяю врага, когда он не работает, иногда при столкновении с противником с игроком он теряет здоровье сразу для всех предыдущих атак (так что это похоже на все предыдущие удары регистрируются только после касания врага). Иногда работает, иногда нет, я не заметил какой-либо конкретной причины или закономерности.

enter image description here

...