Libgdx Box2d 跳转
Libgdx Box2d Jumping through
我想像马里奥游戏一样跳跃。当你在平台下跳跃时,你可以通过对撞机。
当玩家的速度下降时,碰撞器应该唤醒。我知道我应该使用 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) {
}
});
我应该在什么地方放什么才能达到这样的效果。
enter image description here
enter image description here
对撞机应该只有一侧,有人处理过吗?
已找到解决方案,希望对您有所帮助。
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) {
}
});
当我们的 "player" 夹具与 "ground" 夹具碰撞时,我们必须禁用接触。
像这样。
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "player"){
contact.setEnabled(false);
}
当我们的 "groundChecker" 与 "ground" 发生碰撞时,我们需要禁用接触,我们需要检查玩家 body 的 velocity.y 是什么,当它更大时大于 0,联系应该是假的。
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker" && contact.getFixtureB().getBody().getLinearVelocity().y > 0){
contact.setEnabled(false);
}
下面是上述解决方案的演示:
我想像马里奥游戏一样跳跃。当你在平台下跳跃时,你可以通过对撞机。
当玩家的速度下降时,碰撞器应该唤醒。我知道我应该使用 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) {
}
});
我应该在什么地方放什么才能达到这样的效果。
enter image description here
enter image description here
对撞机应该只有一侧,有人处理过吗?
已找到解决方案,希望对您有所帮助。
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) {
}
});
当我们的 "player" 夹具与 "ground" 夹具碰撞时,我们必须禁用接触。 像这样。
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "player"){
contact.setEnabled(false);
}
当我们的 "groundChecker" 与 "ground" 发生碰撞时,我们需要禁用接触,我们需要检查玩家 body 的 velocity.y 是什么,当它更大时大于 0,联系应该是假的。
if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker" && contact.getFixtureB().getBody().getLinearVelocity().y > 0){
contact.setEnabled(false);
}
下面是上述解决方案的演示: