检测SKSpriteNode何时完全低于另一个SKSpriteNode



对于我正在创建的一款游戏,SKSpriteNode会逐渐沿着用户屏幕向下移动。在屏幕底部附近有另一个SKSpriteNode(位置是静态的),只留下一点点空间给原来的SKSpriteNode。我需要检测第一个SKSpriteNode何时完全低于第二个SKSpriteNode,我遇到了一点麻烦。下面是我目前使用的代码:

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

由于某种原因,当第一个SKSpriteNode只超过第二个SKSpriteNode一点点时(不是全部),它仍然检测到它完全结束了。我是不是漏掉了坐标空间的问题?

逻辑

如果

一个精灵a覆盖一个精灵b
  1. b.framea.frame
  2. 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:相同的精灵

如果你比较两个相同类型的精灵,函数CGRectContainsRect只会在它们完全对齐时返回true。虽然你可以在比较精灵时创建一个更小的矩形来解决这个问题。

最新更新