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! SKSpriteNodefgNode.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)}
更多游戏教学: