我使用 SpriteKit 还不到 1 年,所以直到最近我才使用 SKNodes 作为图层。
我有一个 SKNode 层,用于保存所有鱼和用户的位置,例如:
var layerMainGame = SKNode()
layerMainGame.zPosition = 50
layerMainGame.addChild(userPosition)
layerMainGame.addChild(pipFish)
addChild(layerMainGame)
用户是否触摸鱼的交互是通过此函数处理的,这基本上是检查它们的帧是否交叉:
if CGRectIntersectsRect(CGRectInset(node.frame, delta.dx, delta.dy), self.userPosition.frame) {
print("You got hit by \(name).")
gameOver()
}
有用。 userPosition 和 pipFish 之间的交互有效。不起作用的是随着游戏的进行而添加的鱼。我有一个函数,每隔一段时间产卵不同类型的鱼,如下所示:
func spawnNew(fish: SKSpriteNode) {
layerMainGame.addChild(fish)
}
用户和游戏中稍后添加到同一层的鱼之间的交互不起作用。我可以直接穿过它们,游戏不会结束。当我完全删除整个 layerMainGame 变量并像平常一样将它们添加到场景中时,所有交互都会起作用。将它们全部添加到同一 SKNode 层是行不通的。
这是为每条鱼创建碰撞碰撞的函数。
func createHitCollisionFor(name: String, GameOver gameOver: String!, delta: (dx: CGFloat, dy: CGFloat), index: Int = -1) {
enumerateChildNodesWithName(name) { [unowned me = self] node, _ in
if CGRectIntersectsRect(CGRectInset(node.frame, delta.dx, delta.dy), self.userPosition.frame) {
me.gameOverImage.texture = SKTexture(imageNamed: gameOver)
didGetHitActions()
me.runAction(audio.playSound(hit)!)
if index != -1 {
me.trophySet.encounterTrophy.didEncounter[index] = true
}
print("You got hit by \(name).")
}
}
}
我这样称呼它:
createHitCollisionFor("GoldPiranha", GameOver: model.gameOverImage["Gold"], delta: (dx: 50, dy: 50), index: 1)
当鱼不在图层中时它起作用,但当它们添加到图层中时不起作用。