如何抓住b2Body并在屏幕上移动? (cocos2d,box2d,iphone)
问题描述:
我想在屏幕上移动任何在屏幕上触摸的b2body。我听说过一些关于鼠标接头..如何抓住b2Body并在屏幕上移动? (cocos2d,box2d,iphone)
我发现:http://iphonedev.net/2009/08/05/how-to-grab-a-sprite-with-cocos2d-and-box2d/
,但我只是给了我很多的错误,如果我只是在该ccTouch方法复制到一个新的项目(当然变量头也是)。例如。世界 - >查询< - 没有成员发现
有人可以做一个啧啧/一个新项目并在这里上传。或者,还有更好的方法?
答
首先,你必须创建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
}
有两种方式我看你可以控制挑体。第一个,你注意到 - 创建一个鼠标连接,第二个是让你的身体运动并控制它的速度(不是位置!) - 当碰撞时它会提供非物理行为,因为速度将为零)。在第一种情况下,如果您将快速移动物体,移动时会有一些延迟。我没有尝试自己的第二种方式,因为在这种情况下,身体不会与其他运动和静态物体碰撞。
你也可能想要在移动时锁定身体的旋转。
+1将在稍后尝试此操作,因为我现在没有马上使用 – cocos2dbeginner 2011-03-12 15:13:30
@cocos:b2World正在持有所有物体指针。所以你可以迭代它们并使它们的运动类型。在box2d手册第6.2段中,所谓静态物体永远不会碰撞,但对运动学没有任何说法。其实我不知道,但我想他们不能,因为物理行为是不确定的。但是你可以设计你自己的类,它将一个动态物体(实际上是一个传感器)绑定到你的运动物体(具有相同的形状)并测试这些物体是否碰撞。不知道这是最好的方式 – Andrew 2011-03-12 16:20:12
@cocos:我不能。这只是一个想法。我从来没有尝试过。我会尝试设置一个身体的速度,如vel = cft * diff(fingerPos,bodyPos) – Andrew 2011-03-12 16:24:10