1

我想创造像跳球一样的弹力球。示例游戏链接是 https://itunes.apple.com/us/app/bouncy-ball-free/id581876745?mt=8

我正在使用 box2d 连续跳跃,但想在左右方向移动我如何在 box2d 中处理这些东西,有人请分享这种类型的 box2d 示例链接来处理 cocos2dx 中的球

4

2 回答 2

4

在 b2Body 上使用 setTransform(...) 将主体从左向右移动是很诱人的。

过去当我这样做时,如果每帧都这样做(例如将身体向左移动),碰撞检测将开始失败,并且身体不会像我想要的那样表现。我能够偶尔“跳”一个身体从一个位置到另一个位置(这对于“门户”效果很方便),但不是每一帧......它只是让事情“不像预期的那样工作”。

我认为最好的解决方案是使用物理引擎并对身体施加力,使其向您想要的方向移动。这是一种“寻找”行为,向左或向右移动。

下面是 MovingEntity 类的 ApplyThrust(...) 方法的代码。

   void ApplyThrust()
   {
      // Get the distance to the target.
      Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter();
      toTarget.Normalize();
      Vec2 desiredVel = GetMaxSpeed()*toTarget;
      Vec2 currentVel = GetBody()->GetLinearVelocity();
      Vec2 thrust = desiredVel - currentVel;
      GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust);
   }

此类模拟移动和旋转的实体。在这种情况下,您只想通过将目标的位置设置在球的左侧或右侧来向左或向右“移动”。

该方法应用推力使 b2Body 向目标方向移动。它具有可以行进的最大速度 (GetMaxSpeed()) 和最大线性加速度 (GetMaxLinearAcceleration()) 作为类的属性。

如果您按照代码绘制矢量,您会看到它的作用是应用推力来驱动您的速度,使其指向目标的位置。

另一种看待它的方式: 它就像(在向量中)中的反馈循环,以保持您的速度与所需的速度相匹配。如果你只是从标量的角度来考虑它,它会更容易看到。

如果您以 5 m/s 向右移动 (currentVel) 并且您的最大速度 (desiredVel) 为 6 m/s,则推力将向右为正,将您更快地推向右侧 (desiredVel - currentVel = +1 )。也就是说,你会向右加速。

如果您以 7 m/s 向右移动 (currentVel) 并且您的最大速度 (desiredVel) 为 6 m/s,则推力将为负,指向左侧,使您减速(desiredVel - currentVel = -1) .

从物理更新到更新,这使您的身体以您想要的速度朝着目标的方向移动。

在你的情况下,你只想左右移动,让重力把你的身体拉下来。所有这些都应该在物理学的背景下运作良好。您可以通过控制线性加速度来控制代理加速/减速的速度。

此代码库可在此处获得。YouTube 上还有一段视频(这里)展示了它在导弹上的作用。这是一个更大框架的一部分,但它被设计成模块化的,所以你可以随心所欲地使用它。

这个有帮助吗?

于 2013-11-09T13:16:26.500 回答
2

您可以通过首先让球在其起始位置上下不断跳跃来达到相同的效果。然后,您可以使用 setTransform 更改球的起始位置,将其移动到您想要的任何方向。例如:

void moveRight(b2Body* ball) { 
    ball->setTransform(b2Vec2(ball->getPosition().x + 100, 0), 0.0f);
}

void moveLeft(b2Body* ball) { 
    ball->setTransform(b2Vec2(ball->getPosition().x - 100, 0), 0.0f);
}
于 2013-11-09T06:37:02.410 回答