cocos2d box2d粉丝 - 影响没有碰撞的精灵

时间:2014-01-15 12:05:06

标签: cocos2d-iphone box2d collision-detection

我正在使用cocos2d / box2d进行游戏,让一切运行良好,移动精灵,碰撞等。

我想添加一些影响我的移动精灵的元素,而没有精灵接触或碰撞它们,并且不知道如何做到这一点。

我的精灵可以与物体碰撞,我可以做到这一点没有问题 - 但是我正在寻找一个影响我的精灵的物体而不会发生碰撞 - 例如风扇会吹风将精灵推开,或者磁铁式设备,可以吸引我的精灵。

如果我的精灵与这些物体碰撞,那么它应该记录一次碰撞并死亡,但如果它只是移动到物体附近,那么它应该被吸引或击退。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以随时将力(如F = ma)应用于对象以使其移动。

如果你定义了一个重力矢量,box2d中的重力就会一直这样做,以使物体“向下”落下。

所以,你的粉丝不一定是一个真正的“对象”,因为它有一个身体。您可以使用box2d中的方法随时将来自风扇的力施加到您希望风扇吹的东西上。我有一些代码用于“EntityController”,它应用推力使其沿某个方向(目标方向)移动。这是它的代码:

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

在这种情况下,身体朝向目标移动。但它可能很容易就是目标是风扇吹向的方向,现在“正在被吹的东西”的质量中心被推离风扇。

我的所有物体都有最大速度(GetMaximumSpeed(...)),所以此功能只会在物体以最大速度移动之前施加力,然后不再应用(这是一个自然的反馈循环)。

欢迎您查看代码库here on git hub的其余部分。它也被讨论in this post。请注意,这是在cocos2d-x(C ++)中,但如果您将文件声明为.mm(允许c ++代码),则相同的c ++代码将在cocos2d中运行。或者只是在没有代码的情况下使用该技术。

这有用吗?