Я недавно начал использовать Box2D версии 2.1 в сочетании с Allegro5. В настоящее время я построил тест с грунтом и 4 ящиками. 3 коробки сложены, а другая разбивает, заставляя их перевернуться. Во время этой демонстрации я заметил два глюка.
Во-первых, создание в Box2D блока «SetAsBox (ширина, высота)» дает только половину размера обычного блока, отображаемого на экране с помощью allegro. Пример: в Box2D я создаю ящик размером (15, 15). Когда я прихожу, чтобы нарисовать форму, используя allegro, я должен сделать смещение -15 по оси y и масштабировать форму вдвое больше ее размера.
Другая проблема связана с обнаружением столкновений, когда мои ящики вращаются из-за удара. Большинство квадратов ударяются о землю, но некоторые из них имеют смещение от высоты земли, что делает его плавающим.
Вот код для изготовления моих коробок:
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();
}
Edit:
Спасибо, Крис Берт-Браун, за то, что объяснил мне первый вопрос. Что касается второго вопроса, это была хорошая идея, но она не решила ее. Я попробовал оба метода округления, которые вы мне показали.
Edit:
Я думаю, что нашел ответ на свой второй вопрос. Оказывается, что Allegro имеет другую систему координат, чем OpenGL. В результате вместо гравитации я должен был сделать гравитацию, которая заставила Box2D работать нестабильно и вести себя странно.
Edit:
Плохо, я думал, что это проблема, но оказалось, что это ничего не изменило.