如何不允许运动物理机构通过静态物体?

时间:2015-02-06 16:11:57

标签: android box2d andengine game-physics

我的游戏场景包括四个静止的墙体和一个平台板,它是运动类型并且只能水平滑动,如下图所示。

enter image description here

平台主体基于加速度传感器移动,请参阅此代码

@Override
public void onAccelerationChanged(AccelerationData pAccelerationData) {
    mPlatformBody.setLinearVelocity(pAccelerationData.getX() * 10, 0);
}

我的问题是当平台离开边界墙时,它不应该。为了解决这个问题,我试图打破边界时将其速度设置为零。看到这个代码

Rectangle rect = new Rectangle(camWidth / 2 - 40, camHeight / 2 - 5,
        80, 10, mEngine.getVertexBufferObjectManager()) {
    @Override
    protected void onManagedUpdate(float pSecondsElapsed) {

        if (this.getX() <= 1) {
            mPlatformBody.setLinearVelocity(0, 0);
        }

        if ((this.getX() + 80 >= camWidth - 1)) {
            mPlatformBody.setLinearVelocity(0, 0);
        }

        super.onManagedUpdate(pSecondsElapsed);
    }
};

使用上面的代码,仍然此平台可以离开屏幕。

有谁可以帮助我如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

正如@ LearnCocos2D所述,我应该在尝试离开屏幕时将平台主体重置为合法位置。为此,我应该使用setTransformBody方法(如@ iforce2d所述)。

处理setTransform时,有两个要点。

  • AndEngine使用左上角作为精灵的锚点,但Box2d使用 center 作为主体的锚点。
  • Box2d使用作为单位,因此我们必须将所有像素单位转换为米单位。

示例:假设我们要将body body 移动到(3,4)点(以像素为单位)。

    float x = 3; // in pixels (AndEngine unit)
    float y = 4; // in pixels (AndEngine unit)
    float wD2 = sprite.getWidth()  / 2;
    float hD2 = sprite.getHeight() / 2;
    float angle = body.getAngle(); // preserve original angle

    body.setTransform((x + wD2) / PIXEL_TO_METER_RATIO_DEFAULT, 
                      (y + hD2) / PIXEL_TO_METER_RATIO_DEFAULT,
                      angle);

请注意PIXEL_TO_METER_RATIO_DEFAULT为32。