大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


本篇blog在DinoDefense塔防游戏基础之上做一处小的修改,如果不知道该游戏是啥,请自行度娘或谷哥补脑…

该游戏在用户点击防御塔基座时会弹出购买菜单:

游戏HUD界面上方有用户剩余金币数量,每个防御塔有其自己的价格,如果用户持有的金币数量小于塔的价格,应该阻止用户购买并且在这之前用明显的视觉提示用户:钱不够了!

上图中显示的是我对游戏代码做了修改之后的效果,所以你可以看到如果钱不够,塔的价格会显示为红色.

DinoDefense是一个非常吸引人的塔防游戏,不过在这一点上把修改的机会留给了我们.下面就简单谈谈如何做这样一处小的修改,也非常简单,希望大家可以坚持看完,希望可以帮助大家一点点 ;]

首先想到的一种做法是在显示防御塔购买菜单的时候比较塔的价格和剩余金币的数量,不过这样做有2个问题:

  1. TowerSelectorNode类中没有引入GameScene类的实例,意味着你无法读取到剩余的金币数量,你只有添加GameScreen实例作为其属性,因此你要修改你的初始化方法,比较繁琐…差评!
  2. 当你弹出防御塔购买菜单后,价格标签的颜色也就不会改变了,如果此时剩余金币数量发生了变化,价格标签无法做对应的改变,这显然是很差的用户体验…还是差评!

那么如果既做到较少修改原有代码又有完美的用户体验呢?我们可以用通知!

思考之后的解决办法如下:首先TowerSelectNode注册一个GoldChangedNotification通知,当在GameScene中用户剩余金币发生变化时则向其发出通知消息,然后TowerSelectNode做出对应处理…完美!

首先在GameScene.swift中添加通知消息名称:

let goldChangedNotification = "kGoldChangedNotification"

然后给GaneScene添加实例方法:

func goldDidChanged(){
        NSNotificationCenter.defaultCenter().postNotificationName(goldChangedNotification, object: nil, userInfo: ["gold":gold])
    }

然后在金币发生变化之后立即调用该方法:

gold -= towerType.cost
        goldDidChanged()
        updateHUD()

然后打开TowerSelectorNode.swift,在init初始化器中添加如下代码:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(goldChanged), name: goldChangedNotification, object: nil)

同样需要在析构方法中调用解除监听:

deinit{
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

最后添加以下2个方法:

func changeTextColorByLeftGold(goldLeft:Int){
        let towerCost = Int(costLabel.text!)

        if towerCost > goldLeft{
            costLabel.fontColor = SKColor.redColor()
        }else{
            costLabel.fontColor = SKColor.whiteColor()
        }
    }

    func goldChanged(notification:NSNotification){
        let goldLeft = notification.userInfo!["gold"] as! Int
        changeTextColorByLeftGold(goldLeft)
    }

再次运行游戏,发现第一次弹出防御塔购买菜单时,标签颜色是错误的,但剩余金币发生变化后标签的颜色都是正确.

原因很简单,因为你在防御塔购买菜单初始化的时候没有考虑到剩余金币数量的问题!为了修改这一bug,首先我们在GameSceneHelper.swift(GameSceneHelper是GameScene的超类,gold定义在其中)中添加一个全局变量:

let InitGold = 75
//并且修改gold为该值
var gold:Int = InitGold

然后回到TowerSelectorNode.swift的setTower方法中添加如下一行:

changeTextColorByLeftGold(InitGold)

这时防御塔购买弹出菜单在任何时候的状态都是正确的了:

注意看,当剩余金币大于50时,木塔的价格标签颜色实时变为白色表示此时可以再次购买了,而且购买弹出菜单初始的颜色也是正确的,因为开始石塔是红色的!

如果哪位童鞋由于学习需要源代码的可以找我,也可以自行在网上搜索,最后感谢观赏,See you next time ;]

SpriteKit塔防游戏动态改变防御塔价格标签的颜色的更多相关文章

  1. [译]终极塔防——运用HTML5从头创建一个塔防游戏

    翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...

  2. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  3. 使用unity创建塔防游戏(原译)(part1)

    塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...

  4. 使用Unity创建塔防游戏(Part3)—— 项目总结

    之前我们完成了使用Unity创建塔防游戏这个小项目,在这篇文章里,我们对项目中学习到的知识进行一次总结. Part1的地址:http://www.cnblogs.com/lcxBlog/p/60759 ...

  5. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)

    一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l  说说关于塔防游戏的想法和思路 l  实现一个简单的塔防游戏 ...

  6. 使用Unity创建塔防游戏(Part2)

    How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...

  7. 制作一个塔防游戏 Cocos2d-x 2.1.4 (一)

    在这篇文章,将会学习到怎样制作一个塔防游戏.在这其中,学习怎样在设定的时间内出现一波波的敌人,使这些敌人沿着指定的路点前进.怎样在地图上指定的位置创建炮塔.怎样使炮塔射击敌人,怎样可视化调试路点和炮塔 ...

  8. cocos2dx塔防游戏逻辑

    cocos2dx 塔防游戏逻辑 1.欢迎界面 2.tield制作游戏地图,空块设置cantouch属性为1 3.设置地图锚点,把锚点增加一个锚点容器,给怪物的行走函数传入 该锚点容器參数,让怪物依照锚 ...

  9. 远古守卫/cocos2d-x 源代码/塔防游戏/高仿王国保卫战

    下载地址:spm=686.1000925.0.0.j3MZhz&id=550780702354" style="color:rgb(224,102,102)"&g ...

随机推荐

  1. python3全栈开发-socket编程

    一. 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视 ...

  2. “百度杯”CTF比赛 十二月场_blog(kindeditor编辑器遍历,insert注入,文件包含)

    题目在i春秋的ctf训练营中能找到 首先先是一个用户登录与注册界面,一般有注册界面的都是要先让你注册一波,然后找惊喜的 那我就顺着他的意思去注册一个号 注册了一个123用户登录进来看到有个文本编辑器, ...

  3. [测试题]神在夏至祭降下了神谕(oracle)

    Description 我们村子在过去的 400 年中, 断绝与下界的接触, 过着自给自足的生活.夏至祭是一场迎接祖灵于夏季归来, 同时祈求丰收的庆典.村里的男人会在广场上演出夏之军和冬之军的战争. ...

  4. [SDOI2016]生成魔咒

    题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...

  5. 洛谷P2050 [NOI2012]美食节

    动态加边网络流 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...

  6. bzoj 4919: [Lydsy六月月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  7. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)

    Time Limit: 10 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...

  8. SpringCloud学习之Zuul统一异常处理及回退

    一.Filter中统一异常处理 其实在SpringCloud的Edgware SR2版本中对于ZuulFilter中的错误有统一的处理,但是在实际开发当中对于错误的响应方式,我想每个团队都有自己的处理 ...

  9. Object 类

  10. Tomcat的安装与配置

    Windows安装Tomcat与启动 安装版安装 安装版长这个样子,下载到电脑上后双击开始安装 双击后出现如下页面,点击 Next> 之后是这个页面,点击 I Agree 之后出现如下页面,点击 ...