11.spriteKit征程——结尾篇之节点的狂欢
本文是sprite kit征程的结尾篇,当然这仅仅还只是开始。另外我已经完成一款
sprite Kit
的教学软件。希望多多支持。
小节目录:
11.spriteKit征程——结尾篇之节点的狂欢
此外我的SpriteKit Note App已经在store中上架了,免费、无内购、无广告、实时更新文档内容和代码等。欢迎下载,链接地址:https://itunes.apple.com/cn/app/spritekit-note/id973093466?mt=8
结束了入门篇,接下来是精灵进阶篇,预计要一个月开始,不过app中将提前放入,希望各位支持下载完之后给个好评。
正题:
以我们目前掌握的知识来说,可以创建多场景,多元素,以及节点各自执行动作,这看起来很棒了,起码能拿的出手喽。但在实际游戏开发中,众多节点必定彼此交互才能擦出绚烂的火花。本文将接着上面的例子来演示,具体任务是:添加新的节点(nodes
,目前来说 我相信很多从头看起的同志应该理解节点的含义了)到场景中,然后我们将采用物理系统来模拟它们的运行和执行碰撞效果。非常酷的东西!
Action和Physic World的讨论
Sprite Kit框架提供了完整一套物理引擎来模拟一个近乎真实的世界,配置好之中的节点物理属性便能自动被执行!当然之前我们也谈到了Action,通过设计一套动作让节点执行,当然也不错喽。现在有了Physic World,负担大大减轻,比如你只需要配置节点的质量,初速度等(和现实生活联系起来)属性,完了放入物理世界中即可,将自动被执行,假如节点与节点之间产生了碰撞,物理系统检测到之后能够自动演算和执行结果。 非常牛逼!
实战演示,在Spaceship 场景中增加物理模拟
- 找到
newSpaceship
方法,新增一个属性叫做physics body
,顾名思义就是物理体,有质量,速度,加速度等一系列属性,将其添加到飞船这个实例上,追根求源就是在SKNode
中有一个属性叫做physicsBody
,属于SKPhysicsBody
类。首先它是可选类型(?
),假如不初始化默认就是nil
。现在给我们的spaceship添加一个物理体吧。hull.physicsBody = SKPhysicsBody(rectangleOfSize: hull.size)
- 试着Build and Run ,你会发现”bie~”一下飞船掉落了。。。。因为添加了物理体,在重力作用下自然掉落。另外先前的Action还是在执行的,但是仍然无法阻止掉落…
- 飞船怎么能掉落呢!所以我们来阻止它。
hull.physicsBody.dynamic = false
如此当我们运行时候,太空船不再受重力影响,能够和先前一样工作了。抛一个问题:既然和先前一样,为什么还要给它添加一个物理体?好问题!因为之后我们要涉及到碰撞问题!凡是节点于节点之间交互,我们都必须赋予它们物理体(
physics body
)。这里我们迫使船体物理体为static,于dynamic相对嘛!,这样就算有碰撞也不回影响到飞船的速度拉! - 找到
createSceneContents
函数,我们来添加产生(spawn
,这个词语以后经常用到)岩石的代码,要知道宇宙中充满了危机!//SpaceshipScene 场景源源不断的产生岩石!! //先定义个动作,这个动作就是执行产生岩石函数! let makeRocks = SKAction.sequence([ SKAction.runBlock(addRock), SKAction.waitForDuration(0.10, withRange: 0.15) ]) self.runAction(SKAction.repeatActionForever(makeRocks))
场景也是一个节点。自然也能运行一套动作喽!上面
Action
代码所要执行的就是调用一个addRock
方法,而且是间隔一段时间调用一次,当然产生一块岩石,我们就需要等待一段时间,不过等待的时间是随机的(0.10±0.15).强调下!这里使用了runBlock()闭包方法,和官方文档不同 - 实现
addRock
方法//都是随机函数 没啥好看 func skRandf()->CGFloat{ return CGFloat(CGFloat(random()) / CGFloat(RAND_MAX)) } func skRand(low:CGFloat,high:CGFloat)->CGFloat{ return skRandf() * (high - low) + low } //着重看这里! func addRock(){ //设定精灵颜色 和 大小 let rock = SKSpriteNode(color: SKColor.brownColor(), size: CGSizeMake(8, 8)) //产生位置是随机的哦 rock.position = CGPointMake(skRand(0,high: self.size.width), self.size.height-50) //名字 rock.name = "rock" //设定物理体 这样就能自由落体喽 rock.physicsBody = SKPhysicsBody(rectangleOfSize: rock.size) rock.physicsBody?.usesPreciseCollisionDetection = true //添加到场景中 self 就是spaceshipScene 场景 self.addChild(rock) }
- Build and run!! 下起了岩石雨,这个我亲自运行了一个demo,可行的!
- 实现碰撞!
didSimulatePhysics
方法添加到场景中!当岩石下坠离开屏幕后从场景中移除!override func didSimulatePhysics() { self.enumerateChildNodesWithName("rock", usingBlock: { node,stop in if node.position.y < 0{ node.removeFromParent() } }) }
- 谢幕! 暂时告一段落,不懂请博客留言!