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”函数不是很准确。我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sprite kit 中引用多个同名的 sprite?

Sprite-kit 主要角色选择器

在 sprite-kit 中画绳子的最佳方法是啥?

Sprite Kit 场景未呈现

Sprite-Kit 为单个接触注册多个碰撞

如何在Sprite-kit中画一条线