对于我正在创建的一款游戏,SKSpriteNode会逐渐沿着用户屏幕向下移动。在屏幕底部附近有另一个SKSpriteNode(位置是静态的),只留下一点点空间给原来的SKSpriteNode。我需要检测第一个SKSpriteNode何时完全低于第二个SKSpriteNode,我遇到了一点麻烦。下面是我目前使用的代码:
if (pos.y > barPosY) //pos.y = 1st SKSpriteNode, barPosY = 2nd SKSpriteNode
{
touchedTooEarly = true
}
由于某种原因,当第一个SKSpriteNode只超过第二个SKSpriteNode一点点时(不是全部),它仍然检测到它完全结束了。我是不是漏掉了坐标空间的问题?
逻辑
如果
一个精灵a
覆盖一个精灵b
-
b.frame
在a.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:相同的精灵如果你比较两个相同类型的精灵,函数CGRectContainsRect
只会在它们完全对齐时返回true。虽然你可以在比较精灵时创建一个更小的矩形来解决这个问题。