【问题标题】:cocos2d box2d fan - influence sprite without collisioncocos2d box2d fan - 无碰撞影响精灵
【发布时间】:2014-01-15 12:05:05
【问题描述】:

我正在开发 cocos2d / box2d 中的游戏,并且一切正常,移动精灵、碰撞等。

我想添加一些元素来影响我的移动精灵而不让精灵接触或碰撞它们,但不知道该怎么做。

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

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

有什么想法吗?

【问题讨论】:

  • 您可以制作将产生接触事件但没有碰撞响应的传感器主体,允许您对任何接触的物体施加固定的脉冲
  • 您可以定义区域,当您的精灵身体进入该区域时,您可以更改与动作相关的重力 - FAN 或 MAGNET。

标签: cocos2d-iphone box2d collision-detection


【解决方案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 中工作。或者只使用您认为合适的技术而不使用代码。

这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多