【问题标题】:Sprite Kit's 'didBeginContact' function is not very accurate. What should I do?Sprite Kit 的“didBeginContact”函数不是很准确。我该怎么办?
【发布时间】: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 方法来打开/关闭效果。这应该可以解决问题。
  • 好的。我将其添加为答案

标签: ios objective-c xcode collision-detection sprite-kit


【解决方案1】:

您可以使用精灵的allContactedBodies 属性来检查您的车轮与地面之间的当前接触。轮询 this 可能不如事件驱动的方法高效,但可能更可靠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多