【问题标题】:Stop body from moving. Chipmunk on iPhone阻止身体移动。 iPhone 上的花栗鼠
【发布时间】:2012-06-13 10:29:20
【问题描述】:

我有一个带有单个 cpShape 的 cpBody,它漂浮在我的场景中,与其他物体碰撞等。我怎样才能轻松地让这个物体停留在一个地方,并像一个静止的障碍物一样呆在一个地方,让它不再移动,但仍然与其他物体发生碰撞。

我只想在用户点击时阻止身体移动。这就是我问的原因。我不是 Chipmunk 方面的专家,但我认为这一定很容易。

【问题讨论】:

  • 我没有使用Chipmunks,但应该有一个选项可以在某处指定静态主体。
  • 您可以添加静态正文,而不是将动态的转换为静态的。我不想删除动态体,然后添加具有相同参数的静态体。我只是在问,因为也许有一种我不知道的快速方法。

标签: iphone ios cocoa-touch chipmunk


【解决方案1】:

使用公共 API 执行此操作的方式是从空间中移除主体和形状。创建一个与旧动态体具有相同位置/旋转的新静态体。使用 cpShapeSetBody() 将 body 更改为新的静态,然后将 shape 读取到空间中。

【讨论】:

  • Slembcke 制作了 Chipmunk,所以希望这个解决方案能够奏效。 :-) +1
【解决方案2】:

您可以将cpBodySetMass 调用到INFINITY,并使用cpBodySleep 强制对象进入睡眠状态。这就是静态对象在内部实现的方式(至少与质量有关)。

编辑

我不确定你是否需要在此之后拨打cpBodySleep,但我认为拨打电话不痛。

修改cpBody.h,把#define CP_ALLOW_PRIVATE_ACCESS 1放在开头。然后从cpBody* 访问->node.idleTime 并将其设置为INFINITY。

编辑 2

上述解决方案是一个可行的解决方案,但在 SE 实践方面不是很好。最好定义一个使对象静态或动态的函数,这样您就可以在不禁用整个对象的私有属性的情况下调用。

【讨论】:

  • 我认为这是个好主意。但是那重力呢。我的物体开始下落是因为我的空间中有重力吗?
  • @RafałSroka:您想要修改源代码的解决方案吗?反正修改不多。
  • 好吧,我不想修改花栗鼠的代码。有什么办法可以在不改变花栗鼠代码的情况下做到这一点。
  • @RafałSroka:恐怕没有其他选择(除非我忽略了一些 API)。 nodecpBody 成员被声明为私有,我看到 node.idleTime 在静态对象的初始化代码 (cpBody.cpp) 中设置为 INFINITY。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多