2016-11-20 10 views
0

私は自分のシンプルなエンジンを作っています.ECSを成功させました。今は物理学のBox2Dを実装しようとしています。私は、物理的な計算を行う "RigidBody2D"というタイプのコンポーネントを持っています。(これはStart、Awake、Updateの各機能を持つコンポーネントのような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を」とクラスにそれらを実装私は「 "Wntdll.pdb Not Loaded, wntdll.pdb contains the debug information required to find the source for the module ntdll.dll" :私は、この行をコメントする場合、プログラムが実行さ

Body->CreateFixture(&fixtureDef); 

、その後のVisual Studio 2015は私のことを示すメッセージが表示されます。私はこの問題を引き起こしてラインがあることが分かったいくつかのテストをした後

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

この問題を引き起こしているのか、なぜBox2Dで初めての作業なのかは分かりません。

EDIT: A 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

[OK]を、それはあなたが作成していなかったということになります世界。 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コンストラクタにw/oパラメータがないので、あなたが提供した文( 'b2World physicsWorld;')は不正です。 [ソースコード](https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Dynamics/b2World.cpp#L37)に表示されているように、ワールドインスタンスオブジェクトを重力パラメータで作成する必要があります。また、 'b2World'のコピーコンストリクターはありませんので、ワールドインスタンスを別のインスタンスに割り当てることはできません。それは理にかなっていません。 – folibis

+0

はそれをポインタにしました。 – kooldart

関連する問題