好的,这是交易: 我正在 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/