【发布时间】: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