如何不允许运动物理物体穿过静态物体?

How to not allow kinematic physics bodies to pass through static bodies?

我的游戏场景由四面墙组成,它们是静态物体,还有一个平台板,它是运动类型的,只能水平滑动,如下图。

平台体根据加速度传感器移动,见此代码

@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);
    }
};

使用上面的代码,仍然这个平台可以关闭屏幕。

谁能帮我解决这个问题?

正如@LearnCocos2D 所说,我应该在它试图离开屏幕时将平台主体重置到合法位置。为此,我应该使用 Body class 的 setTransform 方法(如@iforce2d 所说)。

对于setTransform的处理,有两点很重要。

  • AndEngine 使用 top-left 作为 sprite 的锚点,但是 Box2d 使用 center 作为 bodies 的锚点。
  • Box2d使用作为单位,所以我们必须将所有像素单位转换为米单位。

例子:假设我们要移动bodybody到(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。