如何不允许运动物理物体穿过静态物体?
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。
我的游戏场景由四面墙组成,它们是静态物体,还有一个平台板,它是运动类型的,只能水平滑动,如下图。
平台体根据加速度传感器移动,见此代码
@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。