SpirteKit深度複製SKSpriteNode節點及convert轉換其它Scene上的節點到當前場景座標

Playground輸出的代碼 ,注意右側打印出的SpriteNode輸出值,HAPPY_NODE的輸出信息一致.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?spa

由於咱們須用節點spritenode.copy()把其它Scene(CircleScene.sks)裏的節點拷貝一份,並把拷貝的這一份節點加到當前的scene(GameScene.sks)裏,還有一個重要的注意點,就是若是要在GameScene.sks取得 Overlay內的紅色節點的準確座標,須用convert把copy到fgNode的節點上的紅色節點座標轉爲GameScene的座標(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.comorm

相關文章
相關標籤/搜索