0

我在 cocos2dx 和 box2d 有两种位置

CCSprite* parent = CCSprite::create("parent.png");
parent->setPosition(ccp(100, 100));

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(self.position.x / PTM_RATIO,self.position.y / PTM_RATIO);

这两个位置有什么区别

PTM_Ratio 的值为 32 或 40。

什么是 PTM_RATIO 及其值?

4

3 回答 3

2

在 box2d 中,您使用米作为长度值,在 cocos2d-x 中,您使用像素或点。PTM 是像素到米。如果 PTM_RATIO 为 32,则表示 cocos2d-x 中的 32 个像素在 box2d 中是 1 米。

于 2013-11-13T11:51:27.103 回答
1

这里有两个坐标系在起作用:

  1. box2d 坐标系,以米为单位。所有物体都有一个以米为单位的位置。
  2. 屏幕坐标系,以像素为单位。当您想在屏幕上显示身体的表示(例如您的精灵)时,您必须使用精灵的 setPosition 方法以像素为单位放置它。

PTM 比率是用于在两个坐标系之间移动的像素/米的比例值。使用直线比例将两个坐标系的原点放在彼此的正上方。所以屏幕上的位置只是 box2d 世界中位置的倍数。这意味着您通常不会看到具有负坐标的物体(除非它们的精灵的一部分粘在屏幕的左边缘)。

当您在 Box2d 世界和屏幕世界之间来回切换时,您可以使用 PTM_RATIO 将其中一个位置更改为另一个位置。

通常,您将按如下方式进行设置:

  1. 在 box2d 世界中的位置创建您的身体,位置仅以米为单位。
  2. 通过设置基于身体位置的位置,在屏幕系统中创建您的精灵

例如:

for(all bodies)
{
   Vec2 pos = body->GetPosition();
   _sprite->setPosition(ccp(pos.x*PTM_RATIO,pos.y*PTM_RATIO)); 
}
  1. 对您的身体施加力并在应用程序的每次更新(dt)时更新物理引擎。我建议使用固定的时间步长(例如 1.0/30.0),但这是一个不同的主题。
  2. 每个 update(dt) 调用,使用上面相同的循环更新精灵的位置。

当用户与屏幕交互时,如果您想找到最近的身体等,您必须将触摸位置转换为世界位置(除以 PTM_RATIO)。

我有一篇博客文章更详细地讨论了这一点,并展示了如何构建“视口”。这允许您查看 box2d 世界的一小部分并在视图中移动、缩放其中的对象等。帖子(以及源代码和视频)位于此处

这个有帮助吗?

于 2013-11-13T12:14:20.337 回答
0

PTM_RATIO 在 box2d 约定中为 32

于 2013-11-14T11:00:19.433 回答