因為我們須用節點spritenode.copy()把其它Scene(CircleScene.sks)里的節點拷貝一份,並把拷貝的這一份節點加到當前的scene(GameScene.sks)里,還有一個重要的註意點,就是如果要在GameScene.sks取得 Overlay內的紅色節點的準確坐標,須用... ...
Playground輸出的代碼 ,註意右側列印出的SpriteNode輸出值,HAPPY_NODE的輸出信息一致.
SpriteNode
//MARK:- 擴展SkSpriteNode屬性
extension SKSpriteNode {
func copyWithPhysicsBody()->SKSpriteNode{
let spriteNode = self.copy() as! SKSpriteNode
spriteNode.physicsBody = self.physicsBody
return spriteNode
}
}
那麼我們為何要進行節點的複製呢?WHY? WHY? WHY?
WHY?
因為我們須用節點spritenode.copy()把其它Scene(CircleScene.sks)里的節點拷貝一份,並把拷貝的這一份節點加到當前的scene(GameScene.sks)里,還有一個重要的註意點,就是如果要在GameScene.sks取得 Overlay內的紅色節點的準確坐標,須用convert把copy到fgNode的節點上的紅色節點坐標轉為GameScene的坐標(<code>let pos = fgNode.convert(sprite.position, from: sprite.parent!)</code>),好像有點兒深奧,其實不複雜的,具體查看以下代碼;
節點copy及坐標轉換
//取得CircelScene.sks上的Overlay節點
var circleAcross: SKSpriteNode!
let overlayScene = SKScene(fileNamed: "CircelScene.sks")!
let overlayNode = overlayScene.childNode(withName: "Overlay")
circleAcross = overlayNode
//複製一份節點的拷貝,並加在fgNode節點上
let initialPlatform = circleAcross.copy() as! SKSpriteNode
fgNode.addChild(initialPlatform)
//取得CircelScene.sks上內的Overlay節點的子節點名稱為 "red"的所有節點
animateCoinsInOverlay(overlayNode)
func animateCoinsInOverlay(_ overlay: SKSpriteNode) {
overlay.enumerateChildNodes(withName: "*", using: { (node, stop) in
if node.name == "red" {
node.run(SKAction.repeatForever(self.coinSpecialAnimation))
} else {
node.run(SKAction.repeatForever(self.coinAnimation))
}
})
}
//節點發生碰撞時 didBegin(:)添加節點的特效,須用convert把子節點坐標coordinate轉到fgNode的坐標上
func emitParticles(name: String, sprite: SKSpriteNode) {
// name 發生碰撞的特效名稱;
// sprite 發生碰撞的的節點 ,如"red"圓形節點;
// sprite.parent 為overlay
// fgNode.convert 把coin在cicleScene.sks的坐標轉為fgNode上的坐標
let pos = fgNode.convert(sprite.position, from: sprite.parent!)
let particles = SKEmitterNode(fileNamed: name)!
particles.position = pos
particles.zPosition = 3
fgNode.addChild(particles)
}
更多游戲教學:http://www.iFIERO.com