一个类似flappy bird的游戏,作者基本为我们实现了所有有趣的东东,不过为了更富趣味性,我们再加点料:在场景中自动生成一些金币。
运行原来的游戏画面如下:
下面我来带领大家一步一步把功能完善成型 ;)
首先我们写一个小的coinsCreate方法,简单测试一下原型是否可行。在写这个方法之前请允许我先明确两件事:
1.金币的位置需要和岩石(rock)位置相呼应,你没道理把金币放到岩石里面去,那个太反人类。一种办法是在rocksCreate方法里创建金币,不过由于我想把创建金币放在单独的方法里,所以只有在创建rock时将岩石位置保存起来以备不时之需,So,打开createRocks方法在计算rock位置的代码后面添加如下代码:
rockYPos = yPos + frame.midY
2.因为在游戏进行中我们实际上是把场景中所有东东向左移动来造成,玩家向右飞行的错觉,所以金币同样也要向左移动,但是这个移动速度要和rock相匹配,否则玩家就会觉得金币自己在空中飞呀飞,而不是“悬停”在空中。因为我们不是在crateRocks里创建金币,所以必须想办法计算出金币移动的速度。这其实比你想象的简单,如果你还没忘了初中的数学公式:距离 = 时间 x 速度。我们已知rock的移动距离和时间,所以可以很方便的计算出其移动的速度,在createRocks移动代码前面添加以下一句:
rockSpeed = (topRock.position.x - -endPos)/5.8
好了,现在在GameScene中添加上面三个实例变量:
var rockYPos:CGFloat?
var rockSpeed:CGFloat?
OK!我们可以写创建金币的原型了,下面是代码:
func createCoins(){
if let yPos = rockYPos,let speed = rockSpeed{
let coin = SKSpriteNode(color: .orange, size: CGSize(width: 20, height: 60))
let xPos = frame.width + coin.frame.width
coin.physicsBody = SKPhysicsBody(rectangleOf: coin.size)
coin.physicsBody?.isDynamic = false
coin.position = CGPoint(x: xPos, y: yPos - 100)
coin.name = coinName
addChild(coin)
let endPos = frame.width + (coin.frame.width * 2)
let duration = (endPos - -endPos) / speed
let moveAction = SKAction.moveBy(x: -endPos, y: 0, duration: TimeInterval(duration))
let moveSeq = SKAction.sequence([moveAction,SKAction.removeFromParent()])
coin.run(moveSeq)
}
}
我们需要源源不断的金币,所以再写一个包装器调用createCoins方法:
func spawnCoins(){
let create = SKAction.run {[unowned self ] in
self.createCoins()
}
let wait1s = SKAction.wait(forDuration: 1)
let wait2s = SKAction.wait(forDuration: 2)
let seq = SKAction.sequence([create,wait2s,create,wait1s])
let repeatForever = SKAction.repeatForever(seq)
run(repeatForever)
}
有人可能会问,为什么要煞费苦心的创建2个不同的时间间隔(1s和2s),这是因为创建rock间隔是3s,为了不在rock主体中创建金币,我们用了如上间隔。
在游戏开始的闭包中添加我们刚创建的方法:
let activatePlayer = SKAction.run {[unowned self] in
self.player.physicsBody?.isDynamic = true
self.createScore()
self.spawnRocks()
//新加如下一行
self.spawnCoins()
}
OK,我们运行游戏看看效果:
基本效果已经成型了,但是我们的小飞机现在还不能“吃”金币,否则自己会爆炸哦!而且那些“丑陋”的长方体很难让人把它和金币挂上钩吧?我们将在下一篇中继续我们激动人心的重构之旅。是滴,看着自己的成果逐渐成型的确很热血澎湃,下篇见喽。