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

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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. 系统引导修复 ---- Windows 和 Ubuntu

    Windows: 1.准备windows相应镜像盘,u盘启动该系统 (以下均为windows10安装界面) 2.进入安装界面<语言,时间,键盘格式>,点击"下一步" 3 ...

  2. [ Java学习基础 ] 浅析Java方法调用

     先看一个示例,读者可先自行阅读判断输出结果: public class TestClass { private static void testMethod(){ System.out.printl ...

  3. [HAOI 2008]木棍分割

    Description 题库链接 有 \(n\) 根木棍,第 \(i\) 根木棍的长度为 \(L_i\) , \(n\) 根木棍依次连结了一起,总共有 \(n-1\) 个连接处.现在允许你最多砍断 \ ...

  4. [NOIp 2015]斗地主

    Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...

  5. APIO dispatching

    题目描述 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增 ...

  6. empty()和size()的优劣

    通常下面代码: if(c.size() == 0) if(c.empty()) 我们会觉得它们是是等价的. 为何empty()比较好? 主要是他们之间的效率有一定差距: empty对任意的容器都是常数 ...

  7. ●BZOJ 1767 [Ceoi2009]harbingers

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1767 题解: 斜率优化DP,单调栈,二分 定义 DP[i] 表示从 i 节点出发,到达根所花 ...

  8. poj 2960 S-Nim

    S-Nim Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4113   Accepted: 2158 Description ...

  9. bzoj3038上帝造题的七分钟2

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1679  Solved: 713[Submit][Status][Dis ...

  10. Python中文件的操作

    文件的操作介绍 文件打开的方法 主要有两种: no with 格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, new ...