标签:sprite spritekit 节点 视图 swift
本文是sprite kit征程的结尾篇,当然这仅仅还只是开始。另外我已经完成一款
sprite Kit
的教学软件。希望多多支持。
小节目录:
01.关于sprite_kit
02.SpriteKit前瞻之视图场景
03.sprite_kit前瞻之节点树
04.sprite_kit前瞻之纹理
05.sprite_kit前瞻之节点的动画
06.sprite_kit前瞻之创造“真实”的世界
07.spritekit征程——创建第一个场景
08.spritekit征程——场景中的动画
09.spritekit征程——场景的切换
10.spritkit征程——使用nodes来新增内容
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,负担大大减轻,比如你只需要配置节点的质量,初速度等(和现实生活联系起来)属性,完了放入物理世界中即可,将自动被执行,假如节点与节点之间产生了碰撞,物理系统检测到之后能够自动演算和执行结果。 非常牛逼!
找到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()
}
})
}
标签:sprite spritekit 节点 视图 swift
原文地址:http://blog.csdn.net/colouful987/article/details/44172207