Sprite Kit的“didBeginContact”函数不是很准确。 我该怎么办?

好吧,这里的协议是:我正在开发一个2D的汽车游戏(类似于Hill Climb Racing),用于iOS的Sprite Kit。 我目前正在研究尘埃颗粒,当轮胎碰到一个具有这种效应的表面时就会出现。 为此,我显然需要function“didBeginContact”和“didEndContact”,以便根据轮胎是否接触地面来打开/closures效果。 这是我想要做的:

/* ---- 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只在碰撞开始或结束时才调用这个函数。 所以如果它弄乱了一个函数调用,那么就会让代码的其余部分相信轮子没有触及地面。 有没有解决scheme来检查每一帧的碰撞? 这将有很大的帮助!

这是一个图像可视化的问题

我希望我能清楚地描述这个问题。 提前感谢您的帮助!

你可以使用你的精灵的allContactedBodies属性来检查你的车轮和地面之间的当前接触。 轮询这可能不像事件驱动的方法那样有效,但它可能更可靠。