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();
}