2013-03-21 36 views
0

我有一個遊戲,與陀螺儀,我控制幾塊。現在問題是我已經在我的andengine代碼中使用了box2d,但是這些物體似乎並沒有對另一個做出反應,導致它們重疊,而不是真正做物理的東西。我需要碰撞,使一個對象坐在另一個AndEngine

在我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; 

} 

現在,我創建了現場,我創建了物理世界。 然後我創建我的第一個「玩家」,(這是一個精靈,我移動)。我爲它創建了一個body,並且在我的Player.class(entity)中設置了這個body。從其實體訪問每個玩家身體。然後在每一次更新中(代碼稍微長一點,但是我拿出了與物理學沒有關係的東西),我創建了一個新玩家。然後對於我的數組列表中的每個玩家(玩家),我在加速度計之後設置線速度,以使其移動。問題是,如果一個玩家擊中另一個玩家,它們會重疊,並且不會對此產生反應。

玩家夾具到處都是一樣的player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f); BodyType總是DynamicBody。有人能告訴我我缺少什麼嗎?

+0

爲什麼你檢查碰撞?碰撞時會發生什麼特別的事情。 box2dphysichsenxtension應該能夠讓你創建一些盒子,這些盒子在碰撞時會停下來,而不需要手動代碼來檢查它。 – CodeTower 2013-03-23 20:37:57

+0

尋找答案,我聽到很多關於box2dphysichs,但我如何將它整合到我的程序中? – 2013-03-25 07:32:13

+0

你爲每個玩家使用相同的身體。這意味着所有玩家都會連接到同一個身體。 你的代碼有點混亂。你創造了多個球員嗎? 在updateHandler中,你再次添加了玩家集合中的所有玩家,我不確定那是你想要的。一個實體除非被移除,否則應該只添加一次到場景和物理世界。 – CodeTower 2013-03-25 10:33:12

回答

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; 

} 
+0

我設法將box2dextension包含到我的項目中,但仍然沒有發生碰撞,我將編輯問題,併發布我的當前代碼,希望您比我更瞭解它 – 2013-03-25 10:00:20

+0

它工作正常,但我在代碼中出錯,我沒有放置牆壁,而是有一個代碼,如果一個玩家出去畫布,它會將他吸引到靠近牆壁的那部分畫布上。這就是爲什麼它確實繪製了覆蓋在那裏的每個對象。相反,我創造了牆壁,現在,圖標反彈,並具有phychics – 2013-03-25 15:09:49