以我们目前掌握的知识来说,可以创建多场景,多元素,以及节点各自执行动作,这看起来很棒了,起码能拿的出手喽。但在实际游戏开发中,众多节点必定彼此交互才能擦出绚烂的火花。本文将接着上面的例子来演示,具体任务是:添加新的节点(nodes
,目前来说 我相信很多从头看起的同志应该理解节点的含义了)到场景中,然后我们将采用物理系统来模拟它们的运行和执行碰撞效果。非常酷的东西!
找到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()
}
})
}
- 谢幕! 暂时告一段落,不懂请博客留言!