AndEngine と Box2d 拡張機能を備えた Android では、次のコードを使用してスプライトを作成し、それらの属性 (物理など) を設定します。
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 の計算をオフにして、衝突検出のみに使用する必要がありますか?