Java libgdx中box2d中动静体碰撞检测的正确方法

Java libgdx中box2d中动静体碰撞检测的正确方法,java,box2d,libgdx,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()){

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

// 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”)=>在清扫世界上的尸体时会产生问题

更新这是我的新碰撞检测器thx,以获取您的答案

 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

}
GameWorld实现了ContactListener。。。
... //我写了很多代码只是为了弄清楚解决方案
//这段代码是我的游戏世界类的渲染部分
公共无效检查冲突(){
if(contacts.isEmpty())返回;
而(!contacts.isEmpty()){
Contact=contacts.pop();
Fixture fa=contact.getFixtureA();
Fixture fb=contact.getFixtureB();
如果(fa==null | | fb==null){return;}
布尔碰撞一次=假;
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?真:假;
fb.设置用户数据(“t”);
}
if((fb.getBody().getType()==BodyType.DynamicBody&&fb.getBody().getType()==BodyType.StaticBody)| |(fb.getBody().getType()==BodyType.DynamicBody&&fa.getBody().getType()==BodyType.StaticBody)){
如果(碰撞一次){
SoundManager.play(SoundType.DROP,0.5f);
}
}
}
}
...
// 
私有堆栈联系人=新堆栈();
@凌驾
public void beginContact(联系人){
//TODO自动生成的方法存根
触点。推(触点);
}
@凌驾
公共无效endContact(联系人){
//TODO自动生成的方法存根
}
@凌驾
公共无效预解(触点触点、歧管、歧管){
//TODO自动生成的方法存根
}
非常感谢,
Dave

使用联系人侦听器,您可以避免自己遍历所有身体。box2d online文档包含有关如何使用联系人侦听器的信息


您将能够像现在一样从联系人本身访问身体类型。

也许您可以查看一下。我相信它基本上解决了同样的问题