Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么';box2d中的t重力秤工作_Iphone_Xcode_Box2d_Gravity - Fatal编程技术网

Iphone 为什么';box2d中的t重力秤工作

Iphone 为什么';box2d中的t重力秤工作,iphone,xcode,box2d,gravity,Iphone,Xcode,Box2d,Gravity,我正试图关闭我身体上的重力。我使用了bodyDef.gravityScale=0.0f,但我运气不好。在这里你可以看到我的代码如下。请帮忙 b2BodyDef monkey1BodyDef; monkey1BodyDef.position.Set(0, 200/PTM_RATIO); monkey1BodyDef.type = b2_dynamicBody; monkey1BodyDef.userData = monkey1; monkey1BodyDef

我正试图关闭我身体上的重力。我使用了bodyDef.gravityScale=0.0f,但我运气不好。在这里你可以看到我的代码如下。请帮忙

    b2BodyDef monkey1BodyDef;
    monkey1BodyDef.position.Set(0, 200/PTM_RATIO);
    monkey1BodyDef.type = b2_dynamicBody;
    monkey1BodyDef.userData = monkey1;
    monkey1BodyDef.bullet = true;
    monkey1BodyDef.gravityScale = 0.0f; //Why doesn't this work I get an error that says no member named 'gravityScale' in 'b2BodyDef'
    b2Body *monkey1Body = world->CreateBody(&monkey1BodyDef);

更改世界的重力定义,因为它是具有重力的世界,如下所示:

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
bool doSleep = false;
world = new b2World(gravity, doSleep);

世界是
b2World

改变重力对世界的定义,因为有重力的是世界,如下所示:

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
bool doSleep = false;
world = new b2World(gravity, doSleep);

World是b2World,因为“b2BodyDef”中不存在名为“gravityScale”的成员:(


与代码相比,文档已过时,因为“b2BodyDef”中不存在名为“gravityScale”的成员:(


与代码相比,文档已经过时了

我也遇到了这个问题。经过一点挖掘,我发现稳定的Cocos2D版本不包括最新版本的Box2D,因此b2BodyDef中缺少gravityScale。这解释了与Box2D文档的差异

有一些解决办法,但我选择将我的Box2D更新为2.2.1(目前是最新版本)。在这样做的过程中,我遇到了以下问题(包括解决方案):

  • b2PolygonShape.SetAsEdge方法已不存在。如果使用该方法来定义屏幕边界,则需要对每个屏幕边缘使用类似“myPolygonShape.Set(lowerLeftCorner,lowerRightCorner);”的内容。在上对此进行了很好的讨论

  • b2DebugDraw已被b2Draw取代。只需将对b2DebugDraw的任何调用替换为b2Draw,您就应该进行设置。例如,如果像我一样,您正在使用Cocos2D Box2D模板,则需要替换此模板:

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    _world->SetDebugDraw(m_debugDraw);
    
    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    flags += b2DebugDraw::e_centerOfMassBit;
    m_debugDraw->SetFlags(flags);
    
  • 为此:

        // Debug Draw functions
        m_debugDraw = new GLESDebugDraw( PTM_RATIO );
        _world->SetDebugDraw(m_debugDraw);
    
        uint32 flags = 0;
        flags += b2Draw::e_shapeBit;
        flags += b2Draw::e_centerOfMassBit;
        m_debugDraw->SetFlags(flags);
    
  • b2Transform具有不同的位置和旋转属性名称。例如,myTransform.position现在是myTransform.p(但仍然是b2Vec2).myTransform.R(定义为b2Mat22)已替换为myTransform.q(定义为b2Rot)。同样,如果您使用的是Cocos2D Box2D模板,请在GLES-Render.mm中替换以下内容:

    void GLESDebugDraw::DrawTransform(const b2Transform& xf)
    {
    b2Vec2 p1 = xf.position, p2;
    const float32 k_axisScale = 0.4f;
    
    p2 = p1 + k_axisScale * xf.R.col1;
    DrawSegment(p1,p2,b2Color(1,0,0));
    
    p2 = p1 + k_axisScale * xf.R.col2;
    DrawSegment(p1,p2,b2Color(0,1,0));
    }
    
  • …与:

        void GLESDebugDraw::DrawTransform(const b2Transform& xf)
        {
        b2Vec2 p1 = xf.p, p2;
        const float32 k_axisScale = 0.4f;
    
        p2 = p1 + k_axisScale * xf.q.GetXAxis();
        DrawSegment(p1,p2,b2Color(1,0,0));
    
        p2 = p1 + k_axisScale * xf.q.GetXAxis();
        DrawSegment(p1,p2,b2Color(0,1,0));
        }
    

    我希望这能有所帮助!

    我也遇到了这个问题。经过一点挖掘,我发现稳定的Cocos2D版本不包括最新版本的Box2D,因此b2BodyDef中缺少gravityScale。这解释了与Box2D文档的差异

    有一些解决办法,但我选择将我的Box2D更新为2.2.1(目前是最新版本)。在这样做的过程中,我遇到了以下问题(包括解决方案):

  • b2PolygonShape.SetAsEdge方法已不存在。如果使用该方法来定义屏幕边界,则需要对每个屏幕边缘使用类似“myPolygonShape.Set(lowerLeftCorner,lowerRightCorner);”的内容。在上对此进行了很好的讨论

  • b2DebugDraw已被b2Draw取代。只需将对b2DebugDraw的任何调用替换为b2Draw,您就应该进行设置。例如,如果像我一样,您正在使用Cocos2D Box2D模板,则需要替换此模板:

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    _world->SetDebugDraw(m_debugDraw);
    
    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    flags += b2DebugDraw::e_centerOfMassBit;
    m_debugDraw->SetFlags(flags);
    
  • 为此:

        // Debug Draw functions
        m_debugDraw = new GLESDebugDraw( PTM_RATIO );
        _world->SetDebugDraw(m_debugDraw);
    
        uint32 flags = 0;
        flags += b2Draw::e_shapeBit;
        flags += b2Draw::e_centerOfMassBit;
        m_debugDraw->SetFlags(flags);
    
  • b2Transform具有不同的位置和旋转属性名称。例如,myTransform.position现在是myTransform.p(但仍然是b2Vec2).myTransform.R(定义为b2Mat22)已替换为myTransform.q(定义为b2Rot)。同样,如果您使用的是Cocos2D Box2D模板,请在GLES-Render.mm中替换以下内容:

    void GLESDebugDraw::DrawTransform(const b2Transform& xf)
    {
    b2Vec2 p1 = xf.position, p2;
    const float32 k_axisScale = 0.4f;
    
    p2 = p1 + k_axisScale * xf.R.col1;
    DrawSegment(p1,p2,b2Color(1,0,0));
    
    p2 = p1 + k_axisScale * xf.R.col2;
    DrawSegment(p1,p2,b2Color(0,1,0));
    }
    
  • …与:

        void GLESDebugDraw::DrawTransform(const b2Transform& xf)
        {
        b2Vec2 p1 = xf.p, p2;
        const float32 k_axisScale = 0.4f;
    
        p2 = p1 + k_axisScale * xf.q.GetXAxis();
        DrawSegment(p1,p2,b2Color(1,0,0));
    
        p2 = p1 + k_axisScale * xf.q.GetXAxis();
        DrawSegment(p1,p2,b2Color(0,1,0));
        }
    

    我希望这有帮助!

    如果
    body.setGravityScale(0);
    不起作用,您可以将其与第二行的
    body.setAwake(false);
    一起使用。

    如果
    body.setGravityScale(0);
    不起作用,您可以与第二行的
    body.setAwake(false);
    一起使用