ios - Sprite Kit 的 'didBeginContact' 函数不是很准确。我应该怎么办?

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

好的,这是交易: 我正在 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你的 Sprite 的属性来检查你的轮子和地面之间的当前接触。轮询这可能不如事件驱动方法有效,但它可能更可靠。

关于ios - Sprite Kit 的 'didBeginContact' 函数不是很准确。我应该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23485232/

相关文章:

android - iOS 和 Android 中的选择器

ios - 如何处理 iPhone 上的键盘麦克风按钮事件

ios - 在 iOS 键盘上方添加 UITextField

ios - 在 ViewController 中快速更改导航栏

ios - 如何加载 UIProgressView 状态?

objective-c - 将 HTML 加载到子 UIWebView 时,我可以保持平滑滚动吗?

javascript - iOS 自动化 JavaScript 是否支持 substring 功能?

objective-c - 带有来自 Amazon S3 的 urlPath 的 TTImageView

ios - UIImageView 螺旋动画

ios - 如何在 iOS 项目中集成 MuPDF 1.3