01 背包系统、弹药系统
下面我们来为玩家制作背包系统:
- 保存主角背包有哪些武器,并记录每个武器的数据(比如武器的剩余弹药量)
- 实现武器或道具的拾取、丢弃;
背包的数据结构
在前面的教程中,我们直接用下面的方式保存背包有哪些武器。但是这样做没法保存武器的剩余弹药量等信息。
要保存背包中的物品数据,可以用下面的方法,每个物品在列表中占用多项,例如一个武器占 3 项,第一项存武器名,剩下的项存武器的剩余弹量等数据:
这种做法也可以,但是每个物品只能存放固定数量的数据,并且通过“第 xx 项”的方式来读取物品数据不够直观。
在本教程中,我们使用另外一个更复杂,但用起来更灵活的做法:将物品信息的 JSON 保存到背包列表。这样每个物品只占列表的一项,方便增删,同时可以给物品添加任意数量、名称的数据,更加灵活:
通过安装 Gandi 数据助手扩展,我们可以方便地处理 JSON 字符串:
编写背包代码
我们可以为背包添加一些实用的全局积木:
- 读取第 n 个武器的信息
- 查找名为 xx 的武器在背包的位置
- 修改第 n 个武器的信息
- 删除背包武器信息
- 向背包添加武器
参考代码:
- 向背包添加武器:(添加物品时,生成一个随机 ID 用于标识不同物体)
- 删除背包的第 n 个武器(n 为空则默认清空背包)
- 获取背包中第 n 个武器的数据(n 为空则默认读取手持武器);
- 查找背包中名为 xx 的武器在背包中的位置
- 设置背包中第 n 个物品的数据:
添加背包角色
- 我们可以专门新建一个“玩家背包”角色,用于专门处理背包相关的内容:
- 将鼠标滚轮切换武器的代码转移到“背包”角色里:
- 可以按 Q 丢弃当前手持武器:
- 在背包中,添加侦测玩家武器变化的代码:当手持武器的 ID 改变时,说明手持武器变化了。武器变化后发出广播:
- 在玩家武器中,添加下面的代码:收到玩家武器变化的广播后,直接删除旧的武器克隆体,产生一个新的武器克隆体:(这样做可以方便打断上一把武器的动作,比如换弹动作)
添加弹药机制
有了背包系统,我们就可以储存玩家每把武器的剩余弹药量等信息,从而实现弹药机制:
- 远程武器都有剩余弹药量,每次射击减少一颗子弹;
- 武器子弹射完后,需要填充(在本游戏中,填充武器会消耗“能量水晶”)。
- 首先,玩家武器生成后,读取武器定义信息(当背包没有武器,则默认读取武器“拳头”)
- 攻击代码修改如下:
- "上次开火时间"作为武器数据存放在背包里(避免切换武器后,武器开火计时重置,导致可以通过换武器来卡攻速)
- 给武器添加“武器载弹量”属性(表示武器填满弹匣时的总载弹量,例如 AK-12 为 30,近战武器为 0)。
- 如果开火时,武器没有子弹,则尝试填充子弹
- 远程武器每次攻击时,将弹药量减 1
- 可以添加按“R”填充子弹(如果弹药量<最大荷弹量,即子弹未满)
- 填充子弹的代码:
- “最大荷弹量 - 当前已有弹量”得到要装填的子弹数量;
- 填充完毕后,将弹药量增加填充子弹数。
这样,我们就完成了背包系统,以及简单的武器弹药系统!可以使用下面的代码,为背包添加初始武器
优化背包系统代码(选读)
上面的代码虽然可以实现背包的功能,但有个小问题:玩家手持物品信息的读取比较频繁,每次读取数据时都要进行 JSON 字符串解析,效率比较低。
因此,我们可以使用临时容器,缓存手持物的信息,读取时直接从容器里读取;然后在每次手持物发生变化时,才重新解析手持物 JSON 到临时容器:
为此,代码会做一些变动(其中部分变动如下)。这里不再详细说明,可以直接参考本课最终的代码。
说明:本节课使用了相对复杂的方法实现了背包系统。即使不完全理解本部分的代码,你也可以通过引擎提供的积木来直接控制背包。你也可以尝试使用列表,自己实现更简单的背包。
下一节 02 信息显示
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG303/Arkos/Lec4/01&type=comment"
title="{射击课高级篇-第四课-02}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>