2011-01-25 20 views
1

私は最近、Allegro5と組み合わせてBox2Dバージョン2.1を使用し始めました。現在、私は地面と4箱のテストを作りました。 3つのボックスが積み重ねられ、もう1つが壊れてフリップします。このデモンストレーション中に、私は2つの不具合を認めた。Box2D衝突検出エラー

Box2Dの "SetAsBox(width、height)"にボックスを作成すると、allegroを使って画面に描画される通常ボックスのサイズの半分しか与えられません。例:Box2Dでは、(15,15)のサイズのボックスを作成します。アレグロを使って形を描くには、yに-15のオフセットをつけて、そのサイズの2倍の縮尺を変えなければなりません。

他の問題は、衝突のためにボックスが回転している間の衝突検出中です。ほとんどの正方形は地面に当たっていますが、その一部は高さの地面からオフセットして浮いています。ここで

は私の箱を作るためのコードです:

cBox2D::cBox2D(int width, int height) { 

    // Note: In Box2D, 30 pixels = 1 meter 
    velocityIterations = 10; 
    positionIterations = 10; 
    worldGravity = 9.81f; 
    timeStep = (1.0f/60.0f); 
    isBodySleep = false; 

    gravity.Set(0.0f, worldGravity); 
    world = new b2World(gravity, isBodySleep); 

    groundBodyDef.position.Set(0.0f, height); // ground location 
    groundBody = world->CreateBody(&groundBodyDef); 

    groundBox.SetAsBox(width, 0.0f); // Ground size 
    groundBody->CreateFixture(&groundBox, 0.0f); 

} 

cBox2D::~cBox2D(void) {} 

void cBox2D::makeSquare(int width, int height, int locX, int locY, float xVelocity, float yVelocity, float angle, float angleVelocity) { 

    sSquare square; 

    square.bodyDef.type = b2_dynamicBody; 
    square.bodyDef.position.Set(locX, locY); // Box location 
    square.bodyDef.angle = angle; // Box angle 
    square.bodyDef.angularVelocity = angleVelocity; 
    square.bodyDef.linearVelocity.Set(xVelocity, yVelocity); // Box Velocity 
    square.body = world->CreateBody(&square.bodyDef); 

    square.dynamicBox.SetAsBox(width, height); // Box size 
    square.fixtureDef.shape = &square.dynamicBox; 
    square.fixtureDef.density = 1.0f; 
    square.fixtureDef.friction = 0.3f; 
    square.fixtureDef.restitution = 0.0f; // Bouncyness 
    square.body->CreateFixture(&square.fixtureDef); 

    squareVec.push_back(square); 

} 

int cBox2D::getVecSize(void) { 
    return squareVec.size(); 
} 

b2Body* cBox2D::getSquareAt(int loc) { 
    return squareVec.at(loc).body; 
} 

void cBox2D::update(void) { 

    world->Step(timeStep, velocityIterations, positionIterations); 
    world->ClearForces(); 

} 

編集: は、第二の問題については、私に最初の問題を説明するためにあなたのクリス・バート・ブラウンに感謝し、それは良いアイデアは、でしたが、それはそれを解決しませんでした。私は、あなたが私に示した両方の丸め方法を試しました。

編集: 私は私の2番目の問題の答えを見つけたと思います。 AllegroはOpenGLとは異なる座標系を持っていることが分かります。その結果、重力を行う代わりに重力を加えなければならなかったため、Box2Dが不安定になり、奇妙な動作をしました。

編集: 私の悪い、私はそれが問題だと思ったが、それは事を変更していないことが判明した。

答えて

4

実際にはSetAsBox(halfwidth, halfheight)です。私はそれが奇妙に聞こえるが、SetAsBoxを見てみましょう。パラメータ15と15を渡すと、コーナー(-15、-15)と(15,15)、つまりサイズ30x30のボックスが与えられます。

私はそれが最適化を意図していると思うが、それはかなりばかげている。

あなたの他の問題の原因はわかりませんが、アレグロで箱を描くときは、座標がroundのときに修正されているかどうか試してみてください。 (それでも問題が解決しない場合は、ceilを試してください)