如何不让运动物理机构通过静态物体?(How to not allow kinematic physi

2019-10-21 18:50发布

我的游戏场景包括四个墙壁,这是静态物体,和一个平台板,它的类型的运动,只有水平滑动,像下面的图片。

基于加速度传感器的平台身体动作,看到这个代码

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

通过上面的代码, 仍然在这个平台可以熄灭屏幕。

任何人都可以请帮我我该怎么解决这个问题?

Answer 1:

正如@ LearnCocos2D说,我要当它试图离开屏幕平台身体恢复到一个法律地位。 对于这一点,我应该使用setTransform方法Body类(如@ iforce2d说的)。

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

  • AndEngine使用左上角作为精灵的锚,但Box2D中使用中心为主体的锚。
  • Box2D中使用作为单位,所以我们必须变换分析所有的像素为单位计量单位。

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



文章来源: How to not allow kinematic physics bodies to pass through static bodies?