java - libgdx中box2d检测动态体和静态体碰撞的正确方法

标签 java box2d libgdx

这是我使用的一个简单代码,我认为它是有效的,我不知道是否有更好的解决方案。

// this code is in render part of my game world class
public void checkCollision(){
    int contacts = world.getContactCount();

    if(contacts > 0){
        for(Contact contact : world.getContactList()){
            Fixture fa = contact.getFixtureA();
            Fixture fb = contact.getFixtureB();
            boolean collideOnce  = false;
            if(fa.getBody().getType() == BodyType.DynamicBody){
                collideOnce = fa.getUserData()==null? true : false;
                fa.setUserData("t");
            }else if(fb.getBody().getType() == BodyType.DynamicBody){
                collideOnce = fb.getUserData()==null? true: false;
                fb.setUserData("t");
            }

            if((fa.getBody().getType() == BodyType.DynamicBody && fb.getBody().getType() == BodyType.StaticBody) || (fb.getBody().getType() == BodyType.DynamicBody && fa.getBody().getType() == BodyType.StaticBody)){
                if(collideOnce ){
                                   // play some sound or score or something in your game that would benefit to collision between static and dynamic bodies
                                    }

            }
        }
    }
}

我希望有一种比上面的代码更好的方法,因为我遍历世界上的所有尸体并设置 userData("t") => 在清扫世界上的尸体时会出现问题。

更新这是我的新碰撞检测器,感谢您的回答

 GameWorld implements ContactListener, ...
 ... //ommitted many codes just to be clear on the solution

 // this code is in render part of my game world class
 public void checkCollision(){
    if(contacts.isEmpty() ) return;
    while(!contacts.isEmpty()){
        Contact contact = contacts.pop();
        Fixture fa = contact.getFixtureA();
        Fixture fb = contact.getFixtureB();

        if(fa == null || fb == null){ return ;}

        boolean collideOnce  = false;
        if(fa.getBody().getType() == BodyType.DynamicBody){
            collideOnce = fa.getUserData()==null? true : false;
            fa.setUserData("t");
        }else if(fb.getBody().getType() == BodyType.DynamicBody){
            collideOnce = fb.getUserData()==null? true: false;
            fb.setUserData("t");
        }

        if((fa.getBody().getType() == BodyType.DynamicBody && fb.getBody().getType() == BodyType.StaticBody) || (fb.getBody().getType() == BodyType.DynamicBody && fa.getBody().getType() == BodyType.StaticBody)){
            if( collideOnce ){
                SoundManager.play(SoundType.DROP , 0.5f);
            }
        }
    }
}

...
// 
    private Stack<Contact> contacts = new Stack<Contact>();
    @Override
public void beginContact(Contact contact) {
    // TODO Auto-generated method stub
    contacts.push(contact);
}

@Override
public void endContact(Contact contact) {
    // TODO Auto-generated method stub

}

@Override
public void preSolve(Contact contact, Manifold oldManifold) {
    // TODO Auto-generated method stub

}

非常感谢, 戴夫

最佳答案

也许你可以看看PeaWorld demo code 。我相信它几乎可以解决同样的问题。

关于java - libgdx中box2d检测动态体和静态体碰撞的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19031112/

相关文章:

java - 检查Java中的二叉树是否已满?

ios - Cocos2D Box2D 错误?

java - 为 float[] 中的值生成与 long 相同的唯一 ID/Hash 的算法

java - 通用 TweenEngine 一次多个值

java - libGDX - 通过 SpriteBatch 结果翻转绘制纹理

java - 如何使用 jToggleButton 停止 Java 中用于使用 WatchService 监视文件夹中文件的以下类型的线程

java - 在 OS X 上设置默认 JRE

java - 找不到 org.apache.thrift7.TBase 类

java - 在 Libgdx 中创建水

ios - 动画时,CCSprite在其他CCSprite之上的定位问题吗?