SpriteKit游戏如何一步一步重构在场景中增加金币动画(一)

一个类似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,我们运行游戏看看效果:

这里写图片描述

基本效果已经成型了,但是我们的小飞机现在还不能“吃”金币,否则自己会爆炸哦!而且那些“丑陋”的长方体很难让人把它和金币挂上钩吧?我们将在下一篇中继续我们激动人心的重构之旅。是滴,看着自己的成果逐渐成型的确很热血澎湃,下篇见喽。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值