我想在马里奥比赛中跳起来。当你在平台下跳跃时,你可以穿过对撞机。
当玩家的速度下降时,碰撞者应该醒来。我知道我应该使用ContactListener
,但是当我使用contact.setEnable(false)
方法时,没有任何反应。
我的联系人听众(地面检查员工作正常)
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker"){
character.isGrounded = true;
System.out.println(" Colliding");
}
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
我应该用什么以及在哪里实现这样的效果。
Collider应该只有一方,有人处理它吗?
答案 0 :(得分:2)
找到一个解决方案,我希望它会有所帮助。
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
//setting isGrounded boolean variable in our character class, but we need to check "player" velocity, because we don't want to enable jumping when only ground will passed througt
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker" && (contact.getFixtureB().getBody().getLinearVelocity().y < 0 || contact.getFixtureB().getBody().getLinearVelocity().y == 0)){
character.isGrounded = true;
}
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
//we have to disable contact when our "player" fixture collide with "ground" fixture
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "player"){
contact.setEnabled(false);
}
//and we need to disable contact when our "groundChecker" will collide with "ground" and we need to check what velocity.y of player body is, when it is bigger than 0 contact should be falsed
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker" && contact.getFixtureB().getBody().getLinearVelocity().y > 0){
contact.setEnabled(false);
}
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
当我们的“玩家”夹具与“地面”夹具碰撞时,我们必须禁用接触。 像这样。
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "player"){
contact.setEnabled(false);
}
当我们的“groundChecker”与“地面”发生碰撞时我们需要禁用接触,我们需要检查玩家身体的速度是什么,当它大于0时,接触应该被愚弄。
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker" && contact.getFixtureB().getBody().getLinearVelocity().y > 0){
contact.setEnabled(false);
}
以下是上述解决方案的演示: