用Swift做个游戏Lecture08 —— Show Me 得分面板!

用Swift做个游戏Lecture08 —— Show Me 得分面板!,第1张

概述课时7中实现了得分机制,当你越战越勇,得分也蹭蹭地往上加,不过马有失蹄,人有失足,总会不小心失败,这时候就要结算你的劳动成果了:通常都是告知游戏结束,得分几何,最好成绩等等信息。咱们游戏是这么设计的: 本文任务: 当游戏结束时呈现上图的内容。 思路: 简单来说就是实例化几个特定纹理(你可以理解为照片image)的精灵,然后按照特定布局放置到屏幕中,是不是灰常简单呢? 01.使用NSUserDefa

课时7中实现了得分机制,当你越战越勇,得分也蹭蹭地往上加,不过马有失蹄,人有失足,总会不小心失败,这时候就要结算你的劳动成果了:通常都是告知游戏结束,得分几何,最好成绩等等信息。咱们游戏是这么设计的:

本文任务:

当游戏结束时呈现上图的内容。

思路:

简单来说就是实例化几个特定纹理(你可以理解为照片image)的精灵,然后按照特定布局放置到屏幕中,是不是灰常简单呢? 01.使用NSUserDefaults来保存数据

使用NSUserDefaults用于持久性的保存得分记录是一个明智的决定,我们不可能为了存一个数据而使用诸如Core Data或者sqlite等数据库。

1-1 从NSUserDefault中读取分数

请在GameScene类中添加一个新方法,用于读取游戏记录得分:

func bestscore()->Int{    return NSUserDefaults.standardUserDefaults().integerForKey("Bestscore")}

可以看到方法中为最高得分设置了名为”Bestscore”的键。

1-2 在NSUserDefault中设置分数

有读取自然有写,请在bestscore()方法下方添加一个新方法:

func setBestscore(bestscore:Int){    NSUserDefaults.standardUserDefaults().setInteger(bestscore,forKey: "Bestscore")    NSUserDefaults.standardUserDefaults().synchronize()}
02.构建得分面板

得分面板如文中给出图片布局,工程量还是蛮大的,不过我会一步一步讲解,无需担心一口吃撑的情况。

首先请找到setupLabel方法,在它下方声明咱们的设置得分面板的函数,取名为setupscorecard():

func setupscorecard() {   //1   if score > bestscore() {     setBestscore(score)   }    //...等下添加其他内容}
首先调用bestscore()取到历史最高得分,与本回合得分比较,倘若这次“走狗屎运”得了高分,咱们就要更新历史最高纪录,也就是调用setBestscore(score)方法。

接着,着手添加得分面板的精灵,内容有点多,请注意别码错:

func setupscorecard() {   if score > bestscore() {     setBestscore(score)   }   // 1 得分面板背景   let scorecard = SKSpriteNode(imagenamed: "scoreCard")   scorecard.position = CGPoint(x: size.wIDth * 0.5,y: size.height * 0.5)   scorecard.name = "Tutorial"   scorecard.zposition = Layer.UI.rawValue   worldNode.addChild(scorecard)   // 2 本次得分   let lastscore = SKLabelNode(Fontnamed: kFontname)   lastscore.Fontcolor = SKcolor(red: 101.0/255.0,green: 71.0/255.0,blue: 73.0/255.0,Alpha: 1.0)   lastscore.position = CGPoint(x: -scorecard.size.wIDth * 0.25,y: -scorecard.size.height * 0.2)   lastscore.text = "\(score)"   scorecard.addChild(lastscore)   // 3 最好成绩   let bestscoreLabel = SKLabelNode(Fontnamed: kFontname)   bestscoreLabel.Fontcolor = SKcolor(red: 101.0/255.0,Alpha: 1.0)   bestscoreLabel.position = CGPoint(x: scorecard.size.wIDth * 0.25,y: -scorecard.size.height * 0.2)   bestscoreLabel.text = "\(self.bestscore())"   scorecard.addChild(bestscoreLabel)   // 4 游戏结束   let gameOver = SKSpriteNode(imagenamed: "GameOver")   gameOver.position = CGPoint(x: size.wIDth/2,y: size.height/2 + scorecard.size.height/2 + kmargin + gameOver.size.height/2)   gameOver.zposition = Layer.UI.rawValue   worldNode.addChild(gameOver)   // 5 ok按钮背景以及ok标签   let okbutton = SKSpriteNode(imagenamed: "button")   okbutton.position = CGPoint(x: size.wIDth * 0.25,y: size.height/2 - scorecard.size.height/2 - kmargin - okbutton.size.height/2)   okbutton.zposition = Layer.UI.rawValue   worldNode.addChild(okbutton)   let ok = SKSpriteNode(imagenamed: "OK")   ok.position = CGPoint.zeroPoint   ok.zposition = Layer.UI.rawValue   okbutton.addChild(ok)   // 6 share按钮背景以及share标签   let sharebutton = SKSpriteNode(imagenamed: "button")   sharebutton.position = CGPoint(x: size.wIDth * 0.75,y: size.height/2 - scorecard.size.height/2 - kmargin - sharebutton.size.height/2)   sharebutton.zposition = Layer.UI.rawValue   worldNode.addChild(sharebutton)   let share = SKSpriteNode(imagenamed: "Share")   share.position = CGPoint.zeroPoint   share.zposition = Layer.UI.rawValue   sharebutton.addChild(share)}

当你码完了这一段超长代码之后,你会松一口气,现在还有一步就能享受胜利的果实了!!
想想我们时候什么需要显示这个得分面板。Player掉落失败的时候,对吗?请找到switchToShowscore()方法,在最下方调用setupscorecard(),点击运行,过几个障碍物,然后自由落体,看看是否良好地显示了得分面板。

Good Job!显示本次得分,历史最高纪录以及选项按钮——不过此时并没有什么卵用。

你有木有发现得分面板“毫无征兆”地就出现在了场景中央,来加个动画吧!!!

03.为得分面板添加动画

请回到原先的setupscorecard()方法,继续再下方添加动画代码:

//=== 添加一个常量 用于定义动画时间 ====let kAnimDelay = 0.3func setupscorecard() {    //。。。。。。    //==== 以下是新添加的内容 =====    gameOver.setScale(0)    gameOver.Alpha = 0    let group = SKAction.group([       SKAction.fadeInWithDuration(kAnimDelay),SKAction.scaleto(1.0,duration: kAnimDelay)       ])    group.timingMode = .EaseInEaSEOut    gameOver.runAction(SKAction.sequence([       SKAction.waitForDuration(kAnimDelay),group       ]))    scorecard.position = CGPoint(x: size.wIDth * 0.5,y: -scorecard.size.height/2)    let moveto = SKAction.moveto(CGPoint(x: size.wIDth/2,y: size.height/2),duration: kAnimDelay)    moveto.timingMode = .EaseInEaSEOut    scorecard.runAction(SKAction.sequence([       SKAction.waitForDuration(kAnimDelay * 2),moveto       ]))    okbutton.Alpha = 0    sharebutton.Alpha = 0    let fadeIn = SKAction.sequence([       SKAction.waitForDuration(kAnimDelay * 3),SKAction.fadeInWithDuration(kAnimDelay)       ])    okbutton.runAction(fadeIn)    sharebutton.runAction(fadeIn)    let pops = SKAction.sequence([       SKAction.waitForDuration(kAnimDelay),popAction,SKAction.waitForDuration(kAnimDelay),SKAction.runBlock(switchToGameOver)       ])    runAction(pops)}

点击运行,玩耍吧!

注意: 我发现了一个BUG,倘若游戏一开始就使得它下落触碰地面,d出的得分面板share标签放置位置是错误的,因为它的背景以let sharebutton = SKSpriteNode(imagenamed: "button") 返回的是一个精灵size=0,让我百思不得其解。希望找到问题的朋友可以告知我。

总结

以上是内存溢出为你收集整理的用Swift做个游戏Lecture08 —— Show Me 得分面板!全部内容,希望文章能够帮你解决用Swift做个游戏Lecture08 —— Show Me 得分面板!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存