如何在cocos2d中使用box2d反弹球

时间:2013-11-08 20:59:51

标签: box2d cocos2d-x bounce

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

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

2 个答案:

答案 0 :(得分: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米/秒的速度向右移动(currentVel)并且您的最大速度(desiredVel)为6米/秒,则推力将向右推动,向右推动更快(所需尺寸 - 当前尺寸= +1)。也就是说,你会加速到右边。

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

从物理的更新到更新,这会让你的身体以你想要的速度向目标方向移动。

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

此代码库可用here。 YouTube(here)上还有一个视频,展示了导弹的实际情况。这是一个更大的框架的一部分,但它是模块化的,所以你可以随心所欲地使用它。

这有用吗?

答案 1 :(得分: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);
}