相交节点 ---- 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 节点的主要内容,如果未能解决你的问题,请参考以下文章

中级算法9.相交链表

图中具有特定长度的顶点不相交路径

判断两个单链表是否相交及相交的第一个节点

Leetcode 160. 相交链表

链表相交-算法练习总结

160. 相交链表