我正在编写一个球类游戏,我希望球不能跳两次,或者不接触地板就跳。
我正在使用 ContactListener
中的方法 beginContact()
和 endContact()
来检测球何时接触 地板。我实现了一个状态(FLYING
或 LANDED
),并在 beginContact()
中将球状态设置为 LANDED
方法,并在 endContact()
方法中将其重置为 FLYING
。我在施加跳跃力之前检查此状态。
问题是在主渲染循环中调用了 jump()
方法,而 box2D 有时在调用 endContact()
方法之前花费了两次循环迭代。所以在 box2D 模拟与地板的接触结束之前调用了两次 jump()
方法。
ContactListener
的部分代码(这不是libGDX的ContactListener
,而是方法beginContact()
和 endContact()
直接调用这些方法,传递碰撞对象:
@Override
public void beginContact(Contact contact, Object objetB) {
if(objetB instanceof Floor){
System.out.println("Begin");
ball.floorBeginContact(contact);
}
}
@Override
public void endContact(Contact contact, Object objetB) {
if(objetB instanceof Floor){
System.out.println("End");
ball.floorEndContact(contact);
}
}
小球Actor
部分代码:
public void floorBeginContact(Contact contact){
state = State.LANDED;
}
public void floorEndContact(Contact contact){
state = State.FLYING;
}
private void jump(){
if(state == State.LANDED){
body.applyForceToCenter(0f, 30f);
System.out.println(i++ + " - Jump!");
}
}
public void act(float delta){
...
if(Gdx.input.isKeyPressed(Keys.SPACE)){
jump();
}
}
控制台输出是这样的:
Begin
0 - Jump!
1 - Jump!
End
Begin
2 - Jump!
End
我不知道为什么会这样,也不知道这是否是最好的方法。
最佳答案
public void floorBeginContact(Contact contact){
state = State.LANDED;
canApplyForce = true;
}
public void floorEndContact(Contact contact){
state = State.FLYING;
}
boolean canApplyForce = true;
private void jump(){
if(state == State.LANDED){
if(canApplyForce)
body.applyForceToCenter(0f, 30f);
canApplyForce = false;
System.out.println(i++ + " - Jump!");
}
}
public void act(float delta){
...
if(Gdx.input.isKeyPressed(Keys.SPACE)){
jump();
}
}
我认为这应该可以解决您的问题。
关于java - libGDX、Box2D、碰撞和禁止空中跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331961/