2012-04-09 112 views
1

我正在尝试检测与传感器主体碰撞的玩家。想象一下在平台游戏中的收藏......当玩家与收藏品相撞时,我想运行一个事件。Libdgx Box2D - 检测碰撞

正如您将从我的代码中看到的那样,我将一个动态物体附加到收藏对象以及一个传感器主体,我希望当玩家与传感器发生碰撞时,我希望将一个玩家碰撞“事件”附加到传感器主体上。看起来有一个“ContactListener”接口,但实现这些方法似乎没有任何作用。我会如何去做这件事?

如果没有做任何的下方的一个更好的办法,任何意见,将不胜感激:)

import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.Contact; 
import com.badlogic.gdx.physics.box2d.ContactImpulse; 
import com.badlogic.gdx.physics.box2d.ContactListener; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.Manifold; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 

public class CoinCollectible extends GameObject{ 

    public CoinCollectible(Vector2 position, float angle){ 
     bodyDef.type = BodyType.DynamicBody; 
     bodyDef.position.x = position.x; 
     bodyDef.position.y = position.y; 
     bodyDef.angle = angle; 

     PolygonShape poly = new PolygonShape(); 
     poly.setAsBox(1, 1); 
     FixtureDef itemFixture = new FixtureDef(); 
     itemFixture.shape = poly; 
     itemFixture.density = 1; 
     itemFixture.filter.categoryBits = PhysicsLayers.LAYER_ITEM; 
     itemFixture.filter.maskBits = PhysicsLayers.MASK_PLAYER; 
     fixtureArray.add(itemFixture); 

     massData.mass = 1f; 

     // Attach a collision sensor 
     FixtureDef sensorFixture = new FixtureDef(); 
     sensorFixture.shape = poly; 
     sensorFixture.isSensor = true; 
     sensorFixture.filter.maskBits = PhysicsLayers.LAYER_PLAYER; 

     fixtureArray.add(sensorFixture); 

     // Clean up 
     poly.dispose(); 

    } 
} 

import java.util.ArrayList; 
import java.util.List; 

import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.MassData; 
import com.badlogic.gdx.physics.box2d.World; 

public class GameObject{ 

    public Body body = null; 
    public BodyDef bodyDef = new BodyDef(); 
    public MassData massData = new MassData(); 

    protected List<FixtureDef> fixtureArray = new ArrayList<FixtureDef>(); 

    public GameObject(){} 

    public Body addToWorld(World world){ 
     if(bodyDef == null) 
      return null; 

     body = world.createBody(bodyDef); 

     while(fixtureArray.size() > 0){ 
      body.createFixture(fixtureArray.remove(0)); 
     } 

     body.setMassData(massData); 

     return body; 
    } 

} 

回答

0

尝试在你的代码中加入这一行(在硬币的构造函数):

bodyDef.userData = this;

而您的联系人收听者get userdata并投射到GameObject,然后例如调用事件冲突。

问候

0

你必须检查Sensor身体的碰撞中被接触或Box2D的collisionlisiter方法结束联系

0

两件事情,可能是错误的:
1)OP没有正确设置ContactListener在实例化box2d.World后
2)类别和屏蔽位未正确设置,因此它不会触发ContactListener

解决方案:
1)在实例化示例中缺少的物理世界 之后放置此。这将为您的box2d.World设置ContactListener,因此它会触发一些东西。

physicsWorld = new World(new Vector2(0,-9),true); 
physicsWorld.setContactListener(
    new ContactListener() { 
     @Override 
     public void beginContact(Contact contact) { 
      Fixture fA = contact.getFixtureA(); 
      Fixture fB = contact.getFixtureB(); 
      Gdx.app.log("beginContact", "between " + fA.toString() + " and " + fB.toString()); 
     } 

     @Override 
     public void endContact(Contact contact) { 
      Gdx.app.log("endContact", "between "); 
     } 

     @Override 
     public void preSolve(Contact contact, Manifold oldManifold) { 
      //you can leave this empty 
     } 

     @Override 
     public void postSolve(Contact contact, ContactImpulse impulse) { 
      //you can leave this empty 
     } 
    }); 

2)设定的类别和屏蔽位这种方式,所以你可以测试它,如果工程(OP没有表现出他的PhysicsLayers使用的特定值)

public CoinCollectible(Vector2 position, float angle){ 
    // ... 
    itemFixture.filter.categoryBits = 1; 
    itemFixture.filter.maskBits = 2; 
    sensorFixture.filter.categoryBits = 2; 
    sensorFixture.filter.maskBits = 1; 
} 
+0

请解释一下什么是错的与OP的代码,为什么这通过编辑你的答案解决了问题*。 – 2014-09-14 16:54:49