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

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

  1. [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型

    [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 目录 [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 0x00 摘要 0x01 前言 1.1 改 ...

  2. 深入探讨JavaScript如何实现深度复制(deep clone)

    在代码复用模式里面有一种叫做“复制属性模式”(copying properties pattern).谈到代码复用的时候,很有可能想到的是代码的继承性(inheritance),但重要的是要记住其最终 ...

  3. 使用结构化克隆在 JavaScript 中进行深度复制

    在很长一段时间内,您不得不求助于变通方法和库来创建 JavaScript 值的深层副本.现在js提供 「structuredClone()」 一个用于深度复制的内置函数. 浏览器支持: 浅拷贝 在 J ...

  4. 【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】

    一.移动.复制页的逻辑实现 移动.复制页的功能是在设计调查页面的时候需要实现的功能.规则是如果在同一个调查中的话就是移动,如果是在不同调查中的就是复制. 无论是移动还是复制,都需要注意一个问题,那就是 ...

  5. js对象/数组深度复制

    今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...

  6. javascript 数组的深度复制

    javascript 数组的深度复制 一般情况下,使用 "=" 可以实现赋值.但对于数组.对象.函数等这些引用类型的数据,这个符号就不好使了. 1. 数组的简单复制 1.1 简单遍 ...

  7. 转载---Java集合对象的深度复制与普通复制

    原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复 ...

  8. .NET基础之深度复制和浅度复制

    之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumo ...

  9. 【Stack Overflow -- 原创加工、原创整理、生产实战】-- 深度复制

    一.说明 1.本程序的核心代码不是我原创的,是我在Stack Overflow上搜集后加工出来的,原作者已忘记了~ 2.这段程序是我在上海携程(2014年左右)上班时整理并在生产环境应用的,先后经历了 ...

随机推荐

  1. drupal7 profile2模块获取个人信息

    一.问题背景: 用profile2模块,扩展个人信息,增加了“手机号”等信息,一些地方想要获取当前用户的手机号 二.解决办法: 用profile2自带的方法:profile2_load_by_user ...

  2. .net reflector+reflexil修改编译后的dll文件

    1.用reflector打开相关的dll文件. 2.如果reflector中没有reflexil插件,点击工具栏中的Tools->Add-Ins 3.找到需要修改的文件,双击打开该文件:点击To ...

  3. 安装使用jupyter

    介绍 jupyter是IPython剥离出来成为一个语言无关的独立软件包. jupyter已经支持50多种语言的内核,包括Lisp.R.F#.Perl.Ruby.Scala等.事实上即使IPython ...

  4. python单下划线、双下划线、头尾双下划线说明:

      单下划线.双下划线.头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的. _foo: 以单下划线开头的表示的是 protected 类 ...

  5. 【转】使用expect实现shell自动交互

    原文地址:http://www.nginx.cn/1934.html shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用 ...

  6. react常用命令

    npm install -g create-react-appcreate-react-app my-appcd my-app/ 启动项目:npm start 安装依赖:npm install 编译: ...

  7. 沉淀,再出发:python中的pandas包

    沉淀,再出发:python中的pandas包 一.前言 python中有很多的包,正是因为这些包工具才使得python能够如此强大,无论是在数据处理还是在web开发,python都发挥着重要的作用,下 ...

  8. 把bootstrap4 dropdown 的导航下拉菜单触发方式改为鼠标浮动触发

    方法1: 原文: https://zzll.org/article/bootstrap4-xialacaidan 很简单,css中加入如下代码 .dropdown:hover>.dropdown ...

  9. 用valgrind检测php扩展内存泄露

    原文:https://bugs.php.net/bugs-getting-valgrind-log.php 前提 1,编译php的时候,必须要带上--enable-debug选项. 2,禁用php的内 ...

  10. 【转】用instruments来检验你的app

    一篇非常好的关于instruments使用的文章! 连接在此