【游戏客户端】5分钟看懂商店&拍卖系统
大家好,我是Lampard~~
最近刚研究完图的最短路径算法【20分钟回顾四大寻路算法】,现在终于有空腾出时间写一篇游戏系统的分享了。
之前的博客中,我和大家分享了如何做:
- 商业化的充值活动 :【商业化充值活动博客】
- 抽卡系统:【抽奖,抽卡系统博客】
- 装备系统:【装备系统博客】
- 红点系统:【红点系统博客】
今天要给大家分享如何完成一个商店&&拍卖行系统(纯流程思路,无代码)。
【dnf冒险团商店】
【dnf拍卖行系统】
看到这些图片有没有换起一些童年回忆,想当年我还在玩DNF早期版本的时候,频道6线是交易区,我乐此不疲的在6线里面倒买倒卖。后来拍卖行出现,方便的交易模式让6线变得名存实亡,从直接的人人交易到变成了人-拍卖行-人的交易。今天我们就剖析一下如何做好一个商店和拍卖行。
(1)巧用Toggle组件创建页签
对于一个商店或者拍卖行来说,肯定有不同类别的商品。那么不同类别的商品,就需要在不同的页签中显示,我们如何实现不同的页签呢?此时我们可以用到一个控件toggle。对于Toggle组件不熟悉的同学可以看看这篇博客【Toggle组件】(稍微看原理即可,不需要研读代码,太老了)。简单来说,其实就是封装了一个类,这个类管理着手底下的几个按钮。我们只需要给每个按钮声明不同的点击回调,那么点击某一个按钮之后,toggle就会帮我们把这个按钮置位选中状态的同时,把其他按钮置为未选中状态,并且响应我们给按钮定义的回调函数,显示我们想要显示的内容并且把其余页签的内容给隐藏。其实听到这个原理之后,我们也可以自己实现,无非就是监听点了哪个按钮,然后遍历所有按钮更新状态,调用回调事件而已。
小优化:像上图拍卖行中,我们的页签栏有那么多页签,我们难道就需要在UI编辑器中预先生成这些控件吗?这样子其实也可以,而且代码中也方便调用。但是如果页签太多,首先就是加一个,减一个不好管理,其次是我们的json文件会体积会变大,最最最重要的一点是,如果策划突发奇想,让你把某些顺序打乱,但是到达了某个时机的时候又变回正常,那就十分不好改了(我曾经就接到过这个需求,某个系统没开的时候其商品页签先不显示,然后解锁系统后又显示回来)。那么该如何做呢?其实我们只需要生成一个按钮,然后把页签的信息配表(图标啊,文本啊等等),然后点击界面时候,根据读表的信息,clone()按钮然后更新信息,更新显示位置即可。所以如果页签比较少,而且没有特殊需求,我们可以直接在UI编辑器生成所有的页签,但是如果需求多变,那么克隆按钮是更好的。
(2)根据不同页签,获取不同的商品数据
之前介绍商业化的时候讲过,生成商品的过程无非是:
1.读取服务端下发的数据
2.定义一个商品类(定义商品图标啊,商品名字啊,购买按钮啊等等)
3.for循环遍历这些数据,然后生成一个个商品类
4.把这些商品类,addChild到listview(或者scrollView)中让它们可以滑动即可。
既然我们的商品有不同的分类,那么我们点击不同按钮的时候,获取不同分类的商品数据即可。至此我们显示的功能就七七八八了,紧接着就是完善逻辑功能,对于商店,拍卖行(一口价)来说,逻辑功能无非就是购买,然后进行界面刷新。这一点我们只需要给购买按钮声明回调事件,点击时往服务端上行协议。当服务端回购买成功协议的时候,抛出事件,然后观利用察者模式,在事件分发的时候刷新界面即可。
小优化:此时又涉及一个小优化,刚才我们说,根据页签分类获取数据然后遍历生成商品类。但是有没有考虑过,如果有很多商品怎么办呢?如果是系统商店还好,数量有限顶多几十个。拍卖行可不行,玩家成千上万。此时就设计我们异步加载的逻辑了【异步加载】大家可以看看我之前写的异步加载博客。一定要异步加载不要一次加载噢,不然那酸爽......
(3)拍卖行的竞拍 or 寄拍功能
前面已经把商店所有的功能以及拍卖行一口价的功能都介绍了,那么相比于商店,拍卖行多了的是寄拍功能。至于这个功能其实也很简单,我们若要竞拍或者寄售一件物品,我们首先要发协议,让服务端扣除这个物品(商品或者竞拍道具),以免我这一刻想要买,结果拍到又不够钱,乱出价。或者刚寄卖,回头又将它分解。然后等时间到了之后(或者被其他玩家秒了之后),服务端同步协议信息,告知结果,若成功则邮件寄发想要的物品,否则则返回原物品即可。
小优化:对于竞拍或者寄售的物品,会存在许多个时间,我们不可能指望服务端每次打开界面同步一次时间,那么要解决时间记录问题,我们可以在刚开始获得服务端数据的时候,记录那个剩余时间数值以及当时的时间戳,然后每次打开界面的时候使用剩余时间 - 现在的时间戳 - 当时的时间戳得到正确显示的数字。至于在打开界面的时候数字的刷新也很简单,就是用一个全局计时器每秒抛出一个second事件,然后我们监听去更新即可。