public class Contact implements ContactListener {

    @Override
    public void beginContact(Contact contact) {
        Fixture fa = contact.getFixtureA();
        Fixture fb = contact.getFixtureB();
        if (fa.getFilterData().categoryBits==16){

            ((Gamescreen)fa.getUserData()).starttouch(fa,fb);
        }
 @Override
    public void endContact(Contact contact) {
        Fixture fa = contact.getFixtureA();
        Fixture fb = contact.getFixtureB();
        if (fa.getFilterData().categoryBits==16)
        {
            ((Gamescreen)fa.getUserData()).endtouch();
        }


当只有一个物体要触摸时,此代码可以正常工作,但有时我需要使另一个物体像拖曳物体一样。例如,当玩家在彼此旁边的两个物体上行走时(没有跳跃),调用了第二种方法(endcontact),但是第一种方法(begincontact)不再被调用。

最佳答案

您确定未调用beginContact()吗?尝试打印出一些东西。我非常确定这更像是这样:您的对象与对象A和对象B碰撞,并且当其中一个对象结束联系时,您的对象会像没有对象碰撞到对象一样进入状态。

为了防止这种情况,您应该计算冲突。

您可以在游戏屏幕上添加两个功能:incCollision()decCollision()
分别在beginContact()endContact()中调用它们。
假设fa始终是Gamescreen的实例也可能有风险。

@Override
public void beginContact(Contact contact){
    Fixture fa = contact.getFixtureA();
    Fixture fb = contact.getFixtureB();

    if(fa == null || fb == null) return;

    handleGamescreenContact(fa, fb, true);
}

@Override
public void endContact(Contact contact){
    Fixture fa = contact.getFixtureA();
    Fixture fb = contact.getFixtureB();

    if(fa == null || fb == null) return;

    handleGamescreenContact(fa, fb, false);
}

private void handleGamescreenContact(Fixture fixA, Fixture fixB, boolean inc){
    Fixture gamescreen = fixA.getUserData() instanceof Gamescreen ? fixA : fixB;
    Fixture something = fixA.getUserData() instanceof Gamescreen ? fixB : fixA;

    if(gamescreen.getFilterData().categoryBits==16){
        if(inc)
            ((Gamescreen)gamescreen.getUserData()).incCollision();
        else
            ((Gamescreen)gamescreen.getUserData()).decCollision();
    }
}


以及inc / dec函数的外观:

public void incCollision(Fixture fa, Fixture fb){
    collisionCounter++;
    startTouch(fa, fb);
}

public void decCollision(){
    collisionCounter--;
    if(collisionCounter <= 0)
        endTouch();
}

10-07 22:24