SpirteKit深度复制SKSpriteNode节点及convert转换其它Scene上的节点到当前场景坐标

Playground输出的代码 ,注意右侧打印出的SpriteNode输出值,HAPPY_NODE的输出信息一致.


//MARK:- 扩展SkSpriteNode属性
extension SKSpriteNode {
  func copyWithPhysicsBody()->SKSpriteNode{
    let spriteNode = self.copy() as! SKSpriteNode
    spriteNode.physicsBody = self.physicsBody
    return spriteNode
  }
}

那么我们为何要进行节点的复制呢?WHY? WHY? WHY?

因为我们须用节点spritenode.copy()把其它Scene(CircleScene.sks)里的节点拷贝一份,并把拷贝的这一份节点加到当前的scene(GameScene.sks)里,还有一个重要的注意点,就是如果要在GameScene.sks取得 Overlay内的红色节点的准确坐标,须用convert把copy到fgNode的节点上的红色节点坐标转为GameScene的坐标(let pos = fgNode.convert(sprite.position, from: sprite.parent!)),好像有点儿深奥,其实不复杂的,具体查看以下代码;


//取得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
initialPlayform.isPaused = false // 一定记得要设置为false,一定记得要设置为false,一定记得要设置为false
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)
}
打赏

One comment

  1. 注意:根据When an overlay node with actions is copied there is currently a SpriteKit bug where the node’s isPaused property might be set to true提示,SpriteKit有一个Bug,
    在复制copy()节点时给开发者留了一个巨坑,即节点在被复制时会自动设置为暂停,也就是节点的所有Action全部不可用,如果需要使用node.run(SKAction.run{//code})需要把复制后的节点设置为isPaused=false,需要把复制后的节点设置为isPaused=false,需要把复制后的节点设置为isPaused=false,重要的事情说三遍;

Leave a Reply