如何抓住b2Body并在屏幕上移动它? (cocos2d的,Box2D的,iphone)

时间:2011-03-12 11:37:35

标签: iphone cocos2d-iphone box2d

我想移动屏幕周围屏幕上触摸的任何b2体。我听说过鼠标关节......

我发现:http://iphonedev.net/2009/08/05/how-to-grab-a-sprite-with-cocos2d-and-box2d/

但是如果我只是将ccTouch方法复制到一个新项目中(当然也是标题中的变量),我只是给了我很多错误。例如。 world->查询< - 找不到成员

可能会有人制作一个tut /一个新项目并将其上传到此处。或者有更好的方法吗?

1 个答案:

答案 0 :(得分:6)

首先,您必须创建b2QueryCallback子类:

class QueryCallback : public b2QueryCallback
{
public:
    QueryCallback(const b2Vec2& point)
    {
        m_point = point;
        m_object = nil;
    }

    bool ReportFixture(b2Fixture* fixture)
    {
        if (fixture->IsSensor()) return true; //ignore sensors

        bool inside = fixture->TestPoint(m_point);
        if (inside)
        {
             // We are done, terminate the query.
             m_object = fixture->GetBody();
                 return false;
        }

        // Continue the query.
        return true;
    }

    b2Vec2  m_point;
    b2Body* m_object;
};

然后在你的touchBegan方法中:

    b2Vec2 pos = yourTouchPos;
// Make a small box.
b2AABB aabb;
b2Vec2 d;
d.Set(0.001f, 0.001f);
aabb.lowerBound = pos - d;
aabb.upperBound = pos + d;

// Query the world for overlapping shapes.
QueryCallback callback(pos);
world_->QueryAABB(&callback, aabb);         

b2Body *body = callback.m_object;
if (body)
    {
        //pick the body
    }

我认为有两种方法可以控制拾取的身体。第一个,你注意到 - 创建一个mouseJoint,第二个是让你的身体运动并控制它的速度(不是位置! - 它会在碰撞时提供非物理行为,因为速度将为零)。在第一种情况下,如果您将移动物体非常快,移动时会有一些延迟。我自己没有尝试第二种方式,因为在这种情况下,身体不会与其他运动和静态物体发生碰撞。

此外,您可能希望在移动时锁定身体的旋转。