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


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

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

    那么我们为何要进行节点的复制呢?WHY? 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及坐标转换
    节点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

  • 相关阅读:
    第1章 1.4计算机网络概述--数据包和数据帧
    第1章 1.3计算机网络概述--规划IP地址介绍MAC地址
    sql生成随机字符串
    bootstrap手风琴效果
    C#-java RSA加密解密
    正则表达式验证手机号 身份证号 银行卡号 姓名输入
    微服务在微信后台的架构实践
    react学习
    datatables .fnDraw is not a function
    给当前页或者跳转后页面的导航栏添加选中样式
  • 原文地址:https://www.cnblogs.com/apiapia/p/9350701.html
Copyright © 2020-2023  润新知