这里有两个坐标系在起作用:
- box2d 坐标系,以米为单位。所有物体都有一个以米为单位的位置。
- 屏幕坐标系,以像素为单位。当您想在屏幕上显示身体的表示(例如您的精灵)时,您必须使用精灵的 setPosition 方法以像素为单位放置它。
PTM 比率是用于在两个坐标系之间移动的像素/米的比例值。使用直线比例将两个坐标系的原点放在彼此的正上方。所以屏幕上的位置只是 box2d 世界中位置的倍数。这意味着您通常不会看到具有负坐标的物体(除非它们的精灵的一部分粘在屏幕的左边缘)。
当您在 Box2d 世界和屏幕世界之间来回切换时,您可以使用 PTM_RATIO 将其中一个位置更改为另一个位置。
通常,您将按如下方式进行设置:
- 在 box2d 世界中的位置创建您的身体,位置仅以米为单位。
- 通过设置基于身体位置的位置,在屏幕系统中创建您的精灵
例如:
for(all bodies)
{
Vec2 pos = body->GetPosition();
_sprite->setPosition(ccp(pos.x*PTM_RATIO,pos.y*PTM_RATIO));
}
- 对您的身体施加力并在应用程序的每次更新(dt)时更新物理引擎。我建议使用固定的时间步长(例如 1.0/30.0),但这是一个不同的主题。
- 每个 update(dt) 调用,使用上面相同的循环更新精灵的位置。
当用户与屏幕交互时,如果您想找到最近的身体等,您必须将触摸位置转换为世界位置(除以 PTM_RATIO)。
我有一篇博客文章更详细地讨论了这一点,并展示了如何构建“视口”。这允许您查看 box2d 世界的一小部分并在视图中移动、缩放其中的对象等。帖子(以及源代码和视频)位于此处。
这个有帮助吗?