码迷,mamicode.com
首页 > 其他好文 > 详细

SpriteKit小球被旋涡吞噬动画的进一步改进

时间:2017-04-28 17:15:46      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:att   调用   rom   地图   cocos2d   play   game   运行   fill   

App首先找到map文件,然后将场景地图载入游戏。map是一个人可读的ASCII字符文件,每个单元是一个“瓦块”,在cocos2d中对瓦块地图有非常好的的支持,不过在SpriteKit中,至少目前为止瓦块地图功能还不是那么太丰富。

不管怎样把,地图中游戏元素分为star,旋涡和终点几种。当player碰到终点则游戏过关;如果碰到star则player得分;若是player不幸碰到了旋涡,对不起GAME OVER!

这时哪能没有酷炫的动画呢?我们制作一个player被吸入旋涡,并且不断旋转被侵蚀的动画吧。

游戏原来的动画代码如下:

func playerCollidedWith(node:SKNode){
       if node.name == "vortex"{
           player.physicsBody!.isDynamic = false
           player.physicsBody!.allowsRotation = true
           gameOver = true
           score -= 1

           let move = SKAction.move(to: node.position, duration: 0.25)
           let scale = SKAction.scale(to: 0.0001, duration: 0.25)
           let remove = SKAction.removeFromParent()
           let seq = SKAction.sequence([move,scale,remove])

           player.run(seq) {[unowned self] in
               self.createPlayer()
               self.gameOver = false
           }
       }else if node.name == "star"{
           node.removeFromParent()
           score += 1
       }else if node.name == "finish"{
           //???
       }
   }

但这样有一个问题:当玩家挂掉游戏重新开始后,player还是受上一次的重力影响,这可不太妙啊。我们来重构一下!首先将didMove中初始化重力的代码放到一个新方法中:

func initGame(){
        physicsWorld.gravity = CGVector(dx: 0, dy: 0)
}

然后在player.run的结束闭包中调用:

player.run(seq) {[unowned self] in
    initGame()
    self.createPlayer()
    self.gameOver = false
}

OK!下面把主要注意了集中到小球旋转进入旋涡的动画上来,注意一开始我“一不小心”写了一个错误的代码:


let rotate = SKAction.rotate(byAngle: CGFloat(Double.pi), duration: 0.25)
let forever = SKAction.repeatForever(rotate)

let grp = SKAction.group([scale,forever])
let remove = SKAction.removeFromParent()
let seq = SKAction.sequence([move,grp,remove])

player.run(seq) {[unowned self] in
    //do org stuff...
}

各位有没有看出错误在哪里?

对了!就是我在grp一个包装中用了永远重复动作,如果这样的话你后面的run闭包永远不会被执行,因为你的动画永远不会停止啊!

所以下面是稍加修改后的代码:

let move = SKAction.move(to: node.position, duration: 0.25)
let scale = SKAction.scale(to: 0.0001, duration: 1.0)
let rotate = SKAction.rotate(byAngle: CGFloat(Double.pi), duration: 0.25)
let actRepeat = SKAction.repeat(rotate, count: 4)
let grp = SKAction.group([scale,actRepeat])
let remove = SKAction.removeFromParent()
let seq = SKAction.sequence([move,grp,remove])

player.run(seq) {[unowned self] in
   //do org staff...
}

注意我将缩放动作时间延长到1秒,而旋转动画时间是0.25秒,这样重复四次正好1秒,从而组成一个动画组!

运行App效果如下:

技术分享

比原来的动画生动了不少,各位觉得呢? ;)

SpriteKit小球被旋涡吞噬动画的进一步改进

标签:att   调用   rom   地图   cocos2d   play   game   运行   fill   

原文地址:http://blog.csdn.net/mydo/article/details/70914776

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!