Libdgx Box2D - 检测碰撞
问题描述:
我正在尝试检测与传感器主体碰撞的玩家。想象一下在平台游戏中的收藏......当玩家与收藏品相撞时,我想运行一个事件。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;
}
}
答
尝试在你的代码中加入这一行(在硬币的构造函数):
bodyDef.userData = this;
而您的联系人收听者get userdata
并投射到GameObject
,然后例如调用事件冲突。
问候
答
你必须检查Sensor
身体的碰撞中被接触或Box2D的collisionlisiter方法结束联系
答
两件事情,可能是错误的:
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;
}
请解释一下什么是错的与OP的代码,为什么这通过编辑你的答案解决了问题*。 – 2014-09-14 16:54:49