2016-11-20 5 views
0

그래요. 아주 단순한 엔진을 만들고 있습니다. ECS를 구현했습니다. 이제 물리학을 위해 Box2D를 구현하려고하고 있습니다. 문제는 그것입니다. 그래서 저는 타입 구성 요소를 가지고 있습니다 : "RigidBody2D"는 물리 계산을합니다. (예 : Unity3D는 Start, Awake 및 Update 함수를 보유한 구성 요소와 같이 시스템을 사용하지 않습니다.)Box2D : 어설 션이 실패하고 Wntdll.pdb가로드되지 않았습니다.

모든 것이 잘 보이는 좋아 있도록
'RigidBody.h' 
    #pragma once 
    #include "Component.h"  

class RigidBody2D : public Component 
{ 
private: 
    float Density = 1.f; 
    float Friction = 1.f; 
    b2BodyDef bodyDef; 
    b2FixtureDef fixtureDef; 
    b2PolygonShape dynamicBox; 
public: 
    Transfrm* Trans; 
    b2Body* Body; 

    RigidBody2D() : Component("RigidBody2D") { 
     Trans = new Transfrm(b2Vec2(0.f, 0.f), 0.f, b2Vec2(1.f, 1.f)); 
     bodyDef.type = b2_dynamicBody; 
     bodyDef.position.Set(Trans->Position.x, Trans->Position.y); 
     Body = CurrentPhysicsWorld->CreateBody(&bodyDef); 
     dynamicBox.SetAsBox(1.0f, 1.0f); 
     fixtureDef.shape = &dynamicBox; 
     fixtureDef.density = GetDensity(); 
     fixtureDef.friction = GetFriction(); 
     Body->CreateFixture(&fixtureDef); // The Line That Causes trouble 
    }; 

    ~RigidBody2D(); 
}; 

, 난 기본적으로 Box2D의 예에서 예 복사 : "HelloWorld.cpp를"내가 내 콘솔에서이 작업을 실행 한 후 나는이 메시지를 얻을 클래스로 구현 :

을 내가이 줄을 언급 할 때, 프로그램이 실행

Body->CreateFixture(&fixtureDef); 

, 다음 비주얼 스튜디오 2015 디스플레이 나에게 메시지 : "Wntdll.pdb Not Loaded, wntdll.pdb contains the debug information required to find the source for the module ntdll.dll"가 나 '를

"Assertion failed: m_nodeCount == m_nodeCapacity, file ..\..\Box2D\Collision\b2DynamicTree.cpp, line 58" 

일부 테스트 후 나는이 문제를 일으키는 라인이 있음을 발견 이 문제를 일으키는 원인이 무엇인지 또는 왜 Box2D로 처음 작업한지 알 수 없습니다.

편집 : 당신이 만들어지지했다고 본다,

#include <Box2D.h> 

b2World CurrentWorld; 

class World { 
public: 
    b2World physicsWorld; 
    World() { CurrentWorld = this->physicsWorld; }; 
    ~World() {}; 
}; 

class RigidBody2D 
{ 
public: 
    b2Body* Body; 
    b2BodyDef bodyDef; 
    b2FixtureDef fixtureDef; 
    b2PolygonShape dynamicBox; 

    RigidBody2D() { 
     bodyDef.type = b2_dynamicBody; 
     bodyDef.position.Set(Trans->Position.x, Trans->Position.y); 
     Body = CurrentWorld->CreateBody(&bodyDef); 
     dynamicBox.SetAsBox(1.0f, 1.0f); 
     fixtureDef.shape = &dynamicBox; 
     Body->CreateFixture(&fixtureDef); 
    } 
    ~RigidBody2D() {}; 
}; 

int main() { 
    World wrld = World(); 
    RigidBody2D body = RigidBody2D(); 
    return 0; 
} 
+0

아마도 메모리가 손상되었을 수 있습니다. [mvce] (http://stackoverflow.com/help/mcve)를 제공하면 코드를 컴파일하고 실행할 수 있습니다. – folibis

+0

@folibis 내 게시물을 편집하고 MVCE를 추가했는지 확인하십시오. – kooldart

답변

1

확인 : MVCE는이 코드를 실행할 수 있도록 프로젝트와 Box2D의를 설정해야합니다,이 일해야 할 것 세계. b2World 구조체가 초기화되지 않습니다. 다음 코드는 나를 제외하고 문제가 발생합니다.

static b2World *CurrentWorld = nullptr; 

class RigidBody2D 
{ 
public: 
    b2Body* Body; 
    b2BodyDef bodyDef; 
    b2FixtureDef fixtureDef; 
    b2PolygonShape dynamicBox; 

    RigidBody2D() { 
     bodyDef.type = b2_dynamicBody; 
     bodyDef.position.Set(1.0, 1.0); 
     Body = CurrentWorld->CreateBody(&bodyDef); 
     dynamicBox.SetAsBox(1.0f, 1.0f); 
     fixtureDef.shape = &dynamicBox; 
     Body->CreateFixture(&fixtureDef); 
    } 
    ~RigidBody2D() {} 
}; 

int main(int argc, char** argv) 
{ 
    b2Vec2 gravity(0.0f, -10.0f); 
    CurrentWorld = new b2World(gravity); // <- you missed that 

    RigidBody2D *body = new RigidBody2D(); 

    float32 timeStep = 1.0f/60.0f; 
    int32 velocityIterations = 6; 
    int32 positionIterations = 2; 
    for (int32 i = 0; i < 60; ++i) 
    { 
     CurrentWorld->Step(timeStep, velocityIterations, positionIterations); 
     b2Vec2 position = body->Body->GetPosition(); 
     float32 angle = body->Body->GetAngle(); 
     printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle); 
    } 

    return 0; 
} 
+0

안녕하세요, 저는 월드 클래스의 코드를 보여주지 않았지만 기본적으로 b2world 변수를 보유하고 있으며 월드 클래스의 생성자에서 새로운 b2World (중력 벡터)에 할당되고 논리는 동일하며, 하지만 저는 세상을 포인터로 만들려고합니다. 왜냐하면 지금 당장은 정상적인 변수이기 때문입니다. – kooldart

+0

제공 한 문장 ('b2World physicsWorld;')은 불법입니다. 따라서 매개 변수가없는 b2World 생성자가 없습니다. [소스 코드] (https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Dynamics/b2World.cpp#L37)에서 볼 수 있듯이 중력 매개 변수를 사용하여 월드 인스턴스 객체를 만들어야합니다. 또한 'b2World'의 복사체는 존재하지 않으므로 월드 인스턴스를 다른 인스턴스에 할당 할 수 없으므로 의미가 없습니다. – folibis

+0

이 포인터가되어 모든 것이 작동합니다. – kooldart