我需要碰撞让一个物体坐在AndEngine的另一个物体上

时间:2013-03-21 15:46:10

标签: android andengine physics collision ontouchevent

我有一个游戏,在那里使用陀螺仪,我控制了几个街区。现在的问题是我在我的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(实体)中设置了该主体。从它的实体访问每个玩家的身体。然后在每一次更新(代码有点长,但我拿出与物理没有任何关系的东西)我创建一个新的播放器。然后对于我的arraylist(玩家)中的每个玩家,我在加速度计之后设置线速度,使其移动。问题在于,如果玩家击中另一个玩家,他们会重叠,并且不会对此产生反应。

播放器夹具在任何地方都是相同的player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);并且BodyType始终是DynamicBody。有人能告诉我我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您可以从http://code.google.com/p/andenginephysicsbox2dextension/下载。

我使用Eclipse,并将其添加为项目。然后我把它包含在我的项目中。 我还推荐项目AndEngineExamples,它向您展示各种不错的工具。

以下是我添加Walls的方法:

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;

}