我想移动屏幕周围屏幕上触摸的任何b2体。我听说过鼠标关节......
我发现:http://iphonedev.net/2009/08/05/how-to-grab-a-sprite-with-cocos2d-and-box2d/
但是如果我只是将ccTouch方法复制到一个新项目中(当然也是标题中的变量),我只是给了我很多错误。例如。 world->查询< - 找不到成员
可能会有人制作一个tut /一个新项目并将其上传到此处。或者有更好的方法吗?
答案 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,第二个是让你的身体运动并控制它的速度(不是位置! - 它会在碰撞时提供非物理行为,因为速度将为零)。在第一种情况下,如果您将移动物体非常快,移动时会有一些延迟。我自己没有尝试第二种方式,因为在这种情况下,身体不会与其他运动和静态物体发生碰撞。
此外,您可能希望在移动时锁定身体的旋转。