【问题标题】:I need Collision to make an object sit on another in AndEngine我需要碰撞使一个对象坐在 AndEngine 中的另一个对象上
【发布时间】:2013-03-21 15:46:10
【问题描述】:

我有一个游戏,我用陀螺仪控制几个街区。现在的问题是我已经在我的 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(实体)中。从它的实体中访问每个玩家的身体。然后每隔几次更新(代码有点长,但我取出了与物理无关的东西)我创建了一个新玩家。然后对于我的数组列表中的每个玩家(玩家),我在加速度计之后设置线速度,以使其移动。问题是,如果一名球员击中另一名球员,他们会重叠,并且不会在撞击时做出反应。

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

【问题讨论】:

  • 为什么要检查碰撞?当它们碰撞时会发生什么特别的事情。 box2dphysichsenxtension 应该能够让您创建在碰撞时停止的盒子,而无需手动代码来检查。
  • 在寻找答案时,我听说过很多关于 box2dphysichs 的信息,但是如何将它集成到我的程序中呢?
  • 您对每个玩家使用相同的身体。这意味着所有玩家都连接到同一个身体。由于您的代码有点混乱。你创造了不止一名球员吗?在 updateHandler 中,您再次将所有玩家添加到玩家集合中,我不确定这就是您想要的。一个实体,除非被移除,否则只能在场景和物理世界中添加一次。
  • 我在回答中添加了一些修改过的代码。试试看是否有帮助。
  • 您可能需要询问我在代码中使用的 MASKBIT。虽然我记得默认行为是身体碰撞。

标签: android andengine physics collision touch-event


【解决方案1】:

您可以从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;

}

【讨论】:

  • 我设法将 box2dextension 包含到我的项目中,但仍然没有发生冲突,我将编辑问题并发布我当前的代码,希望您比我更了解它
  • 它工作正常,但我的代码有错误,我没有放置墙壁,而是有一个代码,如果玩家走出画布,它会将他吸引到那部分画布,靠近墙壁。这就是为什么它确实绘制了覆盖在那里的每个对象。相反,我创建了墙壁,现在,图标反弹并具有物理效果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多