Sprite Kit 的“didBeginContact”函数不是很准确。我该怎么办?
Posted
技术标签:
【中文标题】Sprite Kit 的“didBeginContact”函数不是很准确。我该怎么办?【英文标题】:Sprite Kit's 'didBeginContact' function is not very accurate. What should I do? 【发布时间】:2014-05-06 02:54:01 【问题描述】:好的,下面是交易: 我正在为 ios 的 Sprite Kit 开发一个 2D 汽车游戏(类似于 Hill Climb Racing)。我目前正在研究灰尘颗粒,每当轮胎接触到具有此效果的表面时,它们就会出现。为此,我显然需要“didBeginContact”和“didEndContact”功能,以便我可以根据轮胎是否接触地面来打开/关闭效果。 这是我想做的:
/* ---- very dirty pseudocode ---- */
didBeginContact
if (contact.bodyA is one of the wheels &&
contact.bodyB is the surface that should make a dust effect)
engage dust effect
didEndContact
if (contact.bodyA is one of the wheels &&
contact.bodyB is the surface that should make a dust effect)
disable the dust effect
这适用于大多数情况。但问题是: 如果一个或两个车轮在很短的时间内离开地面(假设车辆撞到某物导致突然停止或在高速行驶时驶过一些颠簸),则效果趋于停止,并且即使***实际接触到表面,在***离开地面并再次接触到它之前,效果也不会出现。 我觉得 Sprite Kit 跟不上快速变化的事物,如果发生突然和快速的事情,它会弄乱这些函数调用。我确实尝试过:
leftWheel.physicsBody.usesPreciseCollisionDetection = YES;
rightWheel.physicsBody.usesPreciseCollisionDetection = YES;
但这没有帮助。 Sprite Kit 中的碰撞检测仍然遗漏了一些发生非常快的碰撞。
有解决办法吗?问题是 Sprite Kit 仅在碰撞开始或结束时调用此函数。因此,如果它弄乱了其中一个函数调用,那么它会让其余的代码相信***没有接触地面。是否有解决方案来检查每一帧的碰撞?这会很有帮助!
Here's an image visualizing the problem
我希望我清楚地描述了这个问题。提前感谢您的帮助!
【问题讨论】:
当您遇到问题时,您的地面/车轮allContactedBodies
包含什么内容?
哇,到目前为止我还不知道这种方法。即使缺少粒子效果,***的 allContactedBodies 实际上也包含 ground 对象。多谢,伙计!我将使用它而不是 didBeginContact 方法来打开/关闭效果。这应该可以解决问题。
好的。我将其添加为答案
【参考方案1】:
您可以使用精灵的allContactedBodies
属性来检查您的车轮与地面之间的当前接触。轮询 this 可能不如事件驱动的方法高效,但可能更可靠。
【讨论】:
以上是关于Sprite Kit 的“didBeginContact”函数不是很准确。我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章