【游戏客户端】5分钟看懂商店&拍卖系统

本文分享了游戏内商店和拍卖行的设计思路,包括利用Toggle组件创建动态页签、根据不同页签获取商品数据的方法、以及拍卖行竞拍和寄拍功能的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                   【游戏客户端】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事件,然后我们监听去更新即可。

 

好的,今天的分享就到这里,谢谢大家~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值