在box2d和sprite中的位置

时间:2013-11-13 08:43:33

标签: box2d cocos2d-x

我在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及其值?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这里有两个坐标系:

  1. box2d坐标系,以米为单位。所有机构都有一个以米为单位的位置。
  2. 屏幕坐标系,以像素为单位。当你想在屏幕上显示正文的表示(例如你的精灵)时,你必须使用精灵的setPosition方法将其放在像素中。
  3. PTM比率是您用于在两个坐标系之间进行的像素/米的比例值。使用直线比例将两个坐标系的原点相互叠加。因此,屏幕上的位置只是box2d世界中位置的倍数。这意味着你不会看到一般具有负坐标的物体(除非它们的一部分精灵粘在屏幕的左边缘上)。

    当您在Box2d世界和屏幕世界之间往返时,您可以使用PTM_RATIO将一个位置更改为另一个位置。

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

    1. 在box2d世界的位置创建你的身体,位置只有几米。
    2. 通过根据身体姿势设置位置
    3. 在屏幕系统中创建精灵

      例如:

      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. 每次更新(dt)调用,使用上面相同的循环更新精灵的位置。
      3. 当用户与屏幕交互时,如果要查找最近的身体等,则必须将触摸位置转换为世界位置(通过除以PTM_RATIO)。

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

        这有用吗?

答案 2 :(得分:0)

在box2d惯例中,PTM_RATIO是32