Мой персонаж - рыцарь, который атакует мечом, поэтому я решил, что следующий способ будет самым простым способом создания столкновений атак: когда игрок нажимает кнопку атаки, персонаж взмахивает мечом и создается новое приспособление / тело для качелей (прямоугольник перед игроком). Это класс с телом атаки мечом:
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](https://i.stack.imgur.com/lBoLE.png)