0

私はゲームを持っています。ジャイロスコープを使って、いくつかのブロックを制御します。問題は、andengineコードにbox2dを追加したことですが、実際に物理的な処理を行う代わりに、ボディが互いに反応してオーバーラップしているようには見えません。

私のonCreateSceneには、次のものがあります。

@Override
protected Scene onCreateScene() {
    this.mMainScene = new Scene();
    backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion, getVertexBufferObjectManager());

physicsWorld = new PhysicsWorld(new Vector2(0, 0), false);

final Player oPlayer = new Player(centerX, centerY, this.goodTiledTextureRegion, this.getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
    player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);
    body = PhysicsFactory.createBoxBody(physicsWorld, oPlayer, BodyType.DynamicBody, player_fix);
    oPlayer.setBody(body);
    playerID++;
    players.add(oPlayer);
    for (Player player : players) {
        player.setPlayers(players);
        mMainScene.attachChild(player);
        physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
        mMainScene.registerTouchArea(player);
    }

this.mMainScene.registerUpdateHandler(physicsWorld);
this.mMainScene.registerUpdateHandler(new TimerHandler(0.1f, true, new ITimerCallback() {
        @Override
        public void onTimePassed(final TimerHandler pTimerHandler) {
                       Player player = new Player(random, 5, goodTiledTextureRegion, getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
                body = PhysicsFactory.createBoxBody(physicsWorld, player, BodyType.DynamicBody, player_fix);
                            player.setBody(body);
                            players.add(player);
mMainScene.detachChildren();
                    mMainScene.attachChild(backgroundSprite);
                    for (Player player : players) {
                        player.setPlayers(players);
                        mMainScene.attachChild(player);
                        player.body.setLinearVelocity(AccelerometerHelper.TILTX * 5, AccelerometerHelper.TILTY * 5);
                        physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
                        mMainScene.registerTouchArea(player);
                    }
 }

return this.mMainScene;

}

今、私はシーンを作成し、物理学の世界を作成します。次に、最初の「プレーヤー」を作成します(これはスプライトであり、移動します)。そのためのボディを作成し、そのボディをPlayer.class(エンティティ)に設定します。エンティティからすべてのプレーヤーのボディにアクセスできます。次に、2、3回の更新ごとに(コードは少し長くなりますが、物理とは関係のないものを取り出しました)、新しいプレーヤーを作成します。次に、アレイリスト内のすべてのプレーヤー(プレーヤー)に対して、加速度計の後に線形速度を設定して、加速度計を動かします。問題は、プレイヤーが別のプレイヤーにヒットした場合、それらはオーバーラップし、インパクトに反応しないことです。

プレーヤーのフィクスチャはどこでも同じでありplayer_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);、BodyTypeは常にDynamicBodyです。誰かが私が欠けているものを教えてもらえますか?

4

1 に答える 1

0

http://code.google.com/p/andenginephysicsbox2dextension/からダウンロードできます。

Eclipseを使用して、プロジェクトとして追加しました。次に、それをプロジェクトに含めました。また、プロジェクトAndEngineExamplesをお勧めします。これは、あらゆる種類の優れたツールを示しています。

これが私が壁を追加する方法です:

final Rectangle wall = new Rectangle(pX, pY, pWidth, pHeight,  pVman); // pvman is the ObjectVertexBufferManager 
wall.setIgnoreUpdate(true);


Body body = PhysicsFactory.createBoxBody(
    pParent.mPhysicsWorld,
    wall, 
    BodyType.StaticBody,
    Environment.WALL_FIXTURE_DEF
  );
  pScene.getFirstChild().attachChild(wall);
  pParent.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(wall, body, true, true));
  // pParent is of type GameActivity.

WALL_FIXTURE_DEFは次のとおりです。

     /* The categories. */
public static final short CATEGORYBIT_WALL = 1;
public static final short CATEGORYBIT_MONNING = 2;
public static final short CATEGORYBIT_WHEEL = 4;

/* And what should collide with what. */
public static final short MASKBITS_WALL = CATEGORYBIT_WALL + CATEGORYBIT_MONNING + CATEGORYBIT_WHEEL;
public static final short MASKBITS_MONNING = CATEGORYBIT_WALL; 
public static final short MASKBITS_WHEEL = CATEGORYBIT_WALL; 

public static final FixtureDef WALL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0f, 0.9f, false, CATEGORYBIT_WALL, MASKBITS_WALL, (short)0);
public static final FixtureDef MONNING_FIXTURE_DEF = PhysicsFactory.createFixtureDef(10, 0f, 0f, false, CATEGORYBIT_MONNING, MASKBITS_MONNING, (short)0);
public static final FixtureDef WHEEL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(20, 0f, 10f, false, CATEGORYBIT_WHEEL, MASKBITS_WHEEL, (short)0);
public static final float GRAVITY_MONNINGS = 2*SensorManager.GRAVITY_EARTH;

これは、MASK_BITSを使用した衝突も処理します。MonningsとWheelsは互いに衝突してはなりませんが、Wallsと衝突する必要があります。

物理学の世界は、createScene関数で次のように作成されます。

this.mPhysicsWorld = new FixedStepPhysicsWorld(Environment.FPS, new Vector2(0, Environment.GRAVITY_MONNINGS), false);

ここでも、AndEngineExamplesプロジェクト(http://code.google.com/p/andengineexamples/)をインストールする必要があります。

これはあなたが必要とするコードかもしれません。コードを実行していないため、エラーが含まれている可能性がありますが、アイデアが得られることを願っています:(インデントして申し訳ありません)

@Override
protected Scene onCreateScene() {
   this.mMainScene = new Scene();
   backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion,   getVertexBufferObjectManager());

    physicsWorld = new PhysicsWorld(new Vector2(0, 0), false);

   final Player oPlayer = new Player(centerX, centerY, this.goodTiledTextureRegion, this.getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
   player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);

   oPlayer.setBody(body);
   playerID++;
   players.add(oPlayer);
   for (Player player : players) {

      Body body = PhysicsFactory.createBoxBody(physicsWorld, oPlayer, BodyType.DynamicBody, player_fix);
      player.setPlayers(players);
      mMainScene.attachChild(player);
      physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
      mMainScene.registerTouchArea(player);
}

this.mMainScene.registerUpdateHandler(physicsWorld);
this.mMainScene.registerUpdateHandler(new TimerHandler(0.1f, true, new ITimerCallback()  {
    @Override
    public void onTimePassed(final TimerHandler pTimerHandler) {
             Player player = new Player(random, 5, goodTiledTextureRegion, getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
             Body body = PhysicsFactory.createBoxBody(physicsWorld, player, BodyType.DynamicBody, player_fix);
             player.setBody(body);
             players.add(player);
             player.setPlayers(players);
             mMainScene.attachChild(player);

             /* This might have to be in the loop */
             player.body.setLinearVelocity(AccelerometerHelper.TILTX * 5, AccelerometerHelper.TILTY * 5);
            physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
            mMainScene.registerTouchArea(player);
       }
   }

 return this.mMainScene;

}
于 2013-03-25T08:43:07.293 に答える