私は最近、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が不安定になり、奇妙な動作をしました。
編集: 私の悪い、私はそれが問題だと思ったが、それは事を変更していないことが判明した。