【发布时间】:2013-06-24 07:03:29
【问题描述】:
我正在编写一个球类游戏,我希望球不能跳两次,或者在不接触地板的情况下跳跃。
我正在使用来自ContactListener 的方法beginContact() 和endContact() 来检测球何时接触地板。我实现了一个状态(FLYING 或LANDED)并在beginContact() 方法中将球状态设置为LANDED,并在endContact() 方法中将其重置为FLYING。我在施加跳跃力之前检查了这个状态。
问题在于 jump() 方法在主渲染循环中被调用,而 box2D 有时会在调用 endContact() 方法之前花费两次循环迭代。所以jump()方法在box2D模拟与地板的接触结束之前被调用了两次。
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
我不知道为什么会发生这种情况,也不知道这是否是最好的方法。
【问题讨论】:
-
在允许另一次跳转之前有 0.2 秒或其他时间的超时怎么样。
-
来自 ifroce2d 的解决方案:iforce2d.net/b2dtut/jumpability
标签: java box2d libgdx collision