1

我最近开始将 Box2D 2.1 版与 Allegro5 结合使用。目前,我用一个地面和 4 个盒子构建了一个测试。3 个箱子堆叠在一起,另一个被砸碎,导致它们翻转。在这个演示过程中,我注意到有两个故障。

一个是在 Box2D“SetAsBox(width, height)”中创建一个盒子,只给出使用 allegro 绘制到屏幕上的普通盒子的一半大小。示例:在 Box2D 中,我创建了一个大小为 (15, 15) 的框。当我开始使用 allegro 绘制形状时,我必须在 y 上偏移 -15,并将形状缩放两倍。

另一个问题是在碰撞检测期间,我的盒子因撞击而旋转。大多数方格都撞到地面,但其中一些方格与地面的高度有偏差,使其漂浮。

这是制作我的盒子的代码:

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();

 }

编辑:感谢 Chris Burt-Brown 向我解释第一个问题,至于第二个问题,这是个好主意,但没有解决。我尝试了您向我展示的两种舍入方法。

编辑:我想我找到了第二个问题的答案。事实证明,Allegro 的坐标系与 OpenGL 不同。结果,我不得不做 +gravity 而不是做 -gravity,这导致 Box2D 变得不稳定并且行为怪异。

编辑:我的错,我认为这是问题所在,但事实证明它并没有改变任何事情。

4

1 回答 1

4

它实际上是SetAsBox(halfwidth, halfheight)。我知道这听起来很奇怪,但看看里面SetAsBox。传入参数 15 和 15 将给出一个带有角 (-15,-15) 和 (15,15) 的框,即大小为 30x30 的框。

我认为这是一种优化,但它是一个非常愚蠢的优化。

我不知道是什么导致了您的其他问题,但是当您使用 Allegro 绘制框时,请尝试查看round坐标是否已修复。(如果这不起作用,请尝试ceil。)

于 2011-01-25T20:37:26.430 回答