2011-03-12 82 views
1

我想在屏幕上移动任何在屏幕上触摸的b2body。我听说过一些关于鼠标接头..如何抓住b2Body并在屏幕上移动? (cocos2d,box2d,iphone)

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

,但我只是给了我很多的错误,如果我只是在该ccTouch方法复制到一个新的项目(当然变量头也是)。例如。世界 - >查询< - 没有成员发现

有人可以做一个啧啧/一个新项目并在这里上传。或者,还有更好的方法?

回答

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 
    } 

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

你也可能想要在移动时锁定身体的旋转。

+0

+1将在稍后尝试此操作,因为我现在没有马上使用 – cocos2dbeginner 2011-03-12 15:13:30

+1

@cocos:b2World正在持有所有物体指针。所以你可以迭代它们并使它们的运动类型。在box2d手册第6.2段中,所谓静态物体永远不会碰撞,但对运动学没有任何说法。其实我不知道,但我想他们不能,因为物理行为是不确定的。但是你可以设计你自己的类,它将一个动态物体(实际上是一个传感器)绑定到你的运动物体(具有相同的形状)并测试这些物体是否碰撞。不知道这是最好的方式 – Andrew 2011-03-12 16:20:12

+0

@cocos:我不能。这只是一个想法。我从来没有尝试过。我会尝试设置一个身体的速度,如vel = cft * diff(fingerPos,bodyPos) – Andrew 2011-03-12 16:24:10