对于我正在创建的游戏,SKSpriteNode逐渐进入用户的屏幕。屏幕底部附近还有一个SKSpriteNode(位置是静态的),仅剩余一点空间供原始SKSpriteNode放入。我需要检测第一个SKSpriteNode何时位于第二个SKSpriteNode之下,而COMPLETELY有点麻烦。这是我当前正在使用的代码:

if (pos.y > barPosY) //pos.y = 1st SKSpriteNode, barPosY = 2nd SKSpriteNode
{
    touchedTooEarly = true
}

出于某种原因,当第一个SKSpriteNode移到第二个SKSpriteNode上时(不是全部),它仍然检测到它已完全结束。我是否缺少坐标空间问题?

最佳答案

逻辑

精灵a涵盖了精灵b,如果

  • b.framea.frame
  • b.zPosition低于a.zPosition

  • 扩展名

    现在让我们建立一个扩展
    extension SKSpriteNode {
        func isCoveredBy(otherSprite: SKSpriteNode) -> Bool {
            let otherFrame = CGRect(
                origin: convertPoint(otherSprite.position, fromNode: otherSprite),
                size: otherSprite.frame.size
            )
            return zPosition < otherSprite.zPosition && CGRectContainsRect(frame, otherFrame)
        }
    }
    

    问题1:透明度

    该机制完全忽略了透明度。

    问题2:相同的精灵

    如果比较两个相同类型的Sprite,则CGRectContainsRect函数仅在它们完全对齐时才返回true。通过比较精灵,您可以解决此问题,创建一个较小的矩形。

    关于ios - 检测何时SKSpriteNode完全位于另一个SKSpriteNode之下,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38127974/

    10-12 17:33