2016-11-20 47 views
0

好吧,我正在製作自己的簡單引擎,我已經實現了一個成功的ECS,現在我正在嘗試實現Box2D的物理功能,並且我有一些所以我有一個類型爲「RigidBody2D」的組件,它進行了一些物理計算,看起來像這樣(注意我使用Unity3D類似的組件,它們包含啓動,喚醒和更新功能,我不使用系統):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」,並將其落實到一類,我在控制檯中運行這個後,我得到這個消息:

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

一些測試後,我發現,造成這個問題的路線是:

Body->CreateFixture(&fixtureDef); 

當我註釋此行,程序運行時,則Visual Studio的2015年顯示了我一個消息:"Wntdll.pdb Not Loaded, wntdll.pdb contains the debug information required to find the source for the module ntdll.dll" 我我不確定是什麼導致了這個問題,或者爲什麼這是我第一次使用Box2D。

編輯: 一個MVCE必須是這一點,就需要建立的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

好吧,看起來你沒有創造世界。 b2World結構未在任何地方初始化。以下代碼適用於我無w/o問題:

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構造函數的w/o參數,所以你提供的句子('b2World physicsWorld;')是非法的。您必須使用重力參數創建世界實例對象,如[源代碼](https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Dynamics/b2World.cpp#L37)所示。另外,沒有「b2World」的縮寫,所以你不能將世界實例分配給另一個,這是沒有意義的。 – folibis

+0

使它成爲一個指針,現在一切正常,謝謝。 – kooldart