相交节点 ---- Objective-C - Swift - iOS - SpriteKit 节点
Posted
技术标签:
【中文标题】相交节点 ---- Objective-C - Swift - iOS - SpriteKit 节点【英文标题】:Intersect Nodes ---- Objective-C - Swift - iOS - SpriteKit Node 【发布时间】:2014-02-19 18:29:44 【问题描述】:我想知道为什么下面的事情不能正常工作。
在绘制节点之前,我通过使用分析两个特定节点是否相交:
[[self playerSpriteNode] intersectsNode: [self pSKLabelNode]]
当 pSKLabelNode 接触到 desiredSpriteNode 时,它会完美运行! (通过在不相交时返回 true 或 false)
但是当它“经过”距离 SKLabel 几个像素时,它仍然相交并返回 true。
是否有一些推荐的设置来修复节点的帧大小,或者您认为可以解决问题的解决方案?
【问题讨论】:
其中一个物体旋转了吗? 您可以尝试继承 SKLabelNode 并覆盖“calculateAccumulatedFrame”方法。 【参考方案1】:当我尝试将静态节点(位于左侧)与具有旋转(并从右侧飞行)的节点相交时,我遇到了同样的问题。我这样修复它
if ([ninja intersectsNode:node] &&
CGRectGetMinX(node.frame) <= CGRectGetMaxX(ninja.frame) &&
CGRectGetMaxX(node.frame) >= CGRectGetMinX(ninja.frame))
//and here I have intersects
所以我通过添加额外的参数来修复它
【讨论】:
【参考方案2】:intersectNode 方法经过优化,可在每秒进行大量迭代的设备上快速运行。因此,它实际上是基于数学“估计”碰撞,有时会在几个像素的边缘出错,特别是当我们谈到 PNG 的方角时。
我也遇到过这个问题,因为我使用了圆圈,所以我计算了圆圈之间的距离作为第二次验证。
因此,您可以做的是在 intersectsNode 内部进行自定义验证(如果情况)。假设您处理正方形,您可以验证 x 或 y 在 intersectNode 之后是否发生碰撞。可能是这样的:
if([[self playerSpriteNode] intersectsNode: [self pSKLabelNode]])
if(distance between x1 and x2 < size1.width/2 + size2.width/2 || distance between y1 y2 < size1.height/2 + size2.height/2)
//Your code goes here
请注意,我们将中心 x 距离与每个宽度之和的一半进行比较。这只是一个适用于正方形和大多数通用精灵的示例。
我想指出,虽然 intersectsNode 有点不精确,但为了快速运行您的游戏,这是必需的,因为每次更新的完美和精确计算对您的设备来说可能非常详尽。 因此,如果您进行自定义验证,请始终在 intersectsNode 返回 true 后调用它,作为第二次验证,而不是唯一一次。
Roman 上面提供的答案与我所说的差不多,代码更短;我只是想解释一下原因。
【讨论】:
【参考方案3】:斯威夫特 2.1:
为了增加结果,请在update( _:)
循环中检查,是下一张图之前发生的事情:
override func update(currentTime: CFTimeInterval)
/* Called before each frame is rendered */
if goodDude.intersectsNode(badDude)
print("bad dude v.s. Ninja")
else
print("not dude at all")
【讨论】:
以上是关于相交节点 ---- Objective-C - Swift - iOS - SpriteKit 节点的主要内容,如果未能解决你的问题,请参考以下文章