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

coc*_*ner 1 iphone box2d cocos2d-iphone

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

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

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

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

And*_*rew 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;
};
Run Code Online (Sandbox Code Playgroud)

然后在你的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
    }
Run Code Online (Sandbox Code Playgroud)

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

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