在Android中使用AndEngine和Box2d扩展,我使用以下代码创建精灵并设置其属性(物理等):
mPlayer1_Sprite = new Sprite(0, BASELINE_Y, mResourcesManager.mPlayer1_TextureRegion, mVertexManager) {
@Override
protected void preDraw(GLState pGLState, Camera pCamera) {
super.preDraw(pGLState, pCamera);
pGLState.enableDither();
}
};
Body body = PhysicsFactory.createBoxBody(mPhysicsWorld, mPlayer1_Sprite, BodyType.DynamicBody, PhysicsFactory.createFixtureDef(10.0f, 0.0f, 0.5f));
body.setUserData(BODY_TYPE_PLAYER_1);
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(mPlayer1_Sprite, body, true, false));
mPlayer1_Sprite.setUserData(body);
(其他玩家和游戏对象的代码相同)
现在,对于碰撞,我使用这段代码:
private boolean isCollision(final Fixture x1, final Fixture x2, final String type1, final String type2) {
return (x1.getBody().getUserData() != null && x2.getBody().getUserData() != null) && ((x1.getBody().getUserData().equals(type1) && x2.getBody().getUserData().equals(type2)) || (x1.getBody().getUserData().equals(type2) && x2.getBody().getUserData().equals(type1)));
}
@Override
public void beginContact(Contact contact) {
final Fixture x1 = contact.getFixtureA();
final Fixture x2 = contact.getFixtureB();
if (isCollision(x1, x2, BODY_TYPE_PLAYER_1, BODY_TYPE_PLAYER_2)) {
((Body) mPlayer1_Sprite.getUserData()).applyForce(3.0f, 1.0f, 0, 0);
}
if (isCollision(x1, x2, BODY_TYPE_PLAYER_1, BODY_TYPE_WALL)) {
((Body) mPlayer1_Sprite.getUserData()).applyForce(3.0f, 1.0f, 0, 0);
}
if (isCollision(x1, x2, BODY_TYPE_PLAYER_2, BODY_TYPE_WALL)) {
((Body) mPlayer1_Sprite.getUserData()).applyForce(3.0f, 1.0f, 0, 0);
}
}
@Override
public void endContact(Contact contact) { }
@Override
public void preSolve(Contact contact, Manifold oldManifold) { }
@Override
public void postSolve(Contact contact, ContactImpulse impulse) { }
到目前为止应该是正确的,对吗?但是如果我在这里发现碰撞怎么办呢?对身体施加力是否正确?如果我需要,我需要使用什么值:
Box2d无论如何都在应用物理更新(碰撞,摩擦,重力等),对吗?那么,如果要添加自定义物理计算,您会怎么做?您是否必须关闭Box2d的计算并仅将其用于碰撞检测?
答案 0 :(得分:1)
因为你不希望box2d在物理上计算碰撞(至少对于某些组合)你应该过滤这些碰撞并计算它们(就像你已经做的那样)。对于碰撞过滤,请参阅this tutorial。
物理计算碰撞将起作用,物理工作;-) - >两个物体碰撞并获得一个脉冲(线性+角度),取决于它们的重量/密度,碰撞点,它们的速度和表面摩擦 - 这意味着你的反弹效果可能导致旋转等。
因为我认为(并从你的其他帖子中读取),你的世界边界是静态的,你的玩家可以移动,我建议你使用碰撞过滤(如上所述)。