代码之家  ›  专栏  ›  技术社区  ›  Billybonks

Box2d C++访问冲突使用b2fixture超出方法

  •  1
  • Billybonks  · 技术社区  · 14 年前

    在创建box2d多边形时,我想在将夹具连接到主体的方法之外创建夹具,但当我这样做时,我会遇到访问冲突。

    我已经逐步完成了代码,box2d肯定会得到fixture对象。

    当我把固定装置连接到身体内部的方法,它工作得很好。当我尝试调用方法时,它会抛出访问冲突错误

        b2FixtureDef* LineSegment::GenerateFixture(b2Vec2 vertices[4],b2Body* body,b2World* world){
        b2BodyDef bodyDef;
        //bodyDef.type = b2_kinematicBody;
        bodyDef.position.Set(_currentStepStartPosition.x,_currentStepStartPosition.y);
        body =world->CreateBody(&bodyDef);
        int32 count = 4;
        b2PolygonShape polygon;
        polygon.Set(vertices, count);
        b2FixtureDef fixtureDef2;
        fixtureDef2.shape = &polygon;
        fixtureDef2.density = 1.0f;
        fixtureDef2.friction = 0.3f;
        body->CreateFixture(&fixtureDef2);/// works if i attatch the fixture here here
        return &fixtureDef2;
    }
    

    调用方法,当我在这里附加fixture时它失败了

        bool LineSegment::GenerateNextBody(b2Body* retBody){
        b2BodyDef bodyDef;
        bodyDef.type = b2_staticBody;
        bodyDef.position.Set(_currentStepStartPosition.x,_currentStepStartPosition.y);
        retBody =world->CreateBody(&bodyDef);
        _currentStep++;
        b2Vec2 vertices[4];
        if(_inclinePerStep != 0){
        GetVertsInclineSquare(vertices,_stepWidth,_thickness,_inclinePerStep);
        }else{
            GetVertsSquare(vertices,_stepWidth,_thickness);
        }
        if(_currentStep == 1){
            _GameWorldVerticies[0] =b2Vec2((_currentStepStartPosition.x+vertices[0].x)*PTM_RATIO,(_currentStepStartPosition.y+vertices[0].y)*PTM_RATIO);
            _GameWorldVerticies[3] =b2Vec2((_currentStepStartPosition.x+vertices[3].x)*PTM_RATIO,(_currentStepStartPosition.y+vertices[3].y)*PTM_RATIO);
    
        }
        b2FixtureDef* fixture = GenerateFixture(vertices,retBody,world);
    
        //retBody->CreateFixture(fixture); throws a access violation if i attatch the fixture here
        _currentStepStartPosition.x += vertices[2].x+(vertices[2].x);
        _currentStepStartPosition.y +=(_inclinePerStep/2);
        if(_steps <= _currentStep){
            _GameWorldVerticies[1] =b2Vec2((_currentStepStartPosition.x+vertices[1].x)*PTM_RATIO,(_currentStepStartPosition.y+vertices[1].y)*PTM_RATIO);
            _GameWorldVerticies[2] =b2Vec2((_currentStepStartPosition.x+vertices[2].x)*PTM_RATIO,(_currentStepStartPosition.y+vertices[2].y)*PTM_RATIO);
            return false;
        }
        return true;
    }
    

    更新

    新代码段

            b2FixtureDef* fixtureDef2 = new b2FixtureDef();
        fixtureDef2->shape = &polygon;
        fixtureDef2->density = 1.0f;
        fixtureDef2->friction = 0.3f;
        //body->CreateFixture(&fixtureDef2);/// works if i attatch the fixture here here
        return fixtureDef2;
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Some programmer dude    14 年前

    问题是在中返回一个指向局部变量的指针 GenerateFixture ,即 未定义的行为 .变量 fixtureDef2 在堆栈上,并且当函数返回时,堆栈的该区域不再有效。当你迟到时打电话给 CreateFixture 函数,指针现在将指向 那个 作用

    为了解决这个问题,你可以用例如在堆上创建它。 new

    推荐文章