2013-03-21 35 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