Swift 检查SKSpriteNode何时通过某个点或线

Swift 检查SKSpriteNode何时通过某个点或线,swift,sprite-kit,skspritenode,Swift,Sprite Kit,Skspritenode,在我的游戏中,有一个SKSpriteNode,我们称之为“门”,它在场景中向上移动。当闸门到达屏幕顶部时,它会向下移动到底部,并再次开始向上移动 如果角色位于朝向场景顶部的恒定y位置,则玩家会丢失该角色,并与门碰撞。我已经解决了碰撞和“死亡”的问题,但是现在我需要检查角色是否成功地“通过”了大门(意味着大门没有击中角色)基本上,我需要知道如何检查一个移动节点何时穿过某个y位置(在本例中,该位置是角色的y位置)。如果出现这种情况,我想将分数增加1 以下是情况的大致情况: 我尝试过的一件事是在更新

在我的游戏中,有一个SKSpriteNode,我们称之为“门”,它在场景中向上移动。当闸门到达屏幕顶部时,它会向下移动到底部,并再次开始向上移动

如果角色位于朝向场景顶部的恒定y位置,则玩家会丢失该角色,并与门碰撞。我已经解决了碰撞和“死亡”的问题,但是现在我需要检查角色是否成功地“通过”了大门(意味着大门没有击中角色)基本上,我需要知道如何检查一个移动节点何时穿过某个y位置(在本例中,该位置是角色的y位置)。如果出现这种情况,我想将分数增加1

以下是情况的大致情况:

我尝试过的一件事是在更新方法中,如果门的y位置曾经等于角色的y位置,我知道两个节点已经交叉,所以我应该增加分数。看起来是这样的:

override func update(currentTime: CFTimeInterval) {
    if gate.position.y == character.position.y {
        print("score")
        score++

    }
}
但似乎不起作用。当闸门穿过角色的y位置时,是否有其他方法进行检查


谢谢

可能发生的是y坐标不一样。例如,如果
gate.position.y=100
,并且
字符。position.y=101
,它将不起作用。试试这个:

override func update(currentTime: CFTimeInterval) {

let minY = gate.position.y - 10
let maxY = gate.position.y + 10
if character.position.y > minY && character.position.y < maxY {
    print("score")
    score++

}
}
覆盖函数更新(currentTime:CFTimeInterval){
设minY=gate.position.y-10
设maxY=gate.position.y+10
如果character.position.y>minY&&character.position.y

您可以调整数字10,以查看什么效果最好。希望这有帮助

这应该很容易。如果gate的锚点(以及角色的锚点)没有改变(例如,它是0.5,0.5),那么您需要执行如下操作:If(character.position.y-character.size.height/2>gate.position.y+gate.size.height/2){完成您的任务}还需要注意更新:方法在一秒钟内执行多次,因此,您可能应该在分数增加后重新定位节点。否则,分数将以您可能不期望的方式增加。非常感谢。这正是我需要的。简单,但效果很好。