代码拾取图片某一点的颜色_RPG游戏开发日志7:道具拾取与存放

本项目同步上传于github和coding上,国内读者可以通过在coding下载项目。
也欢迎你加入我的UE4学习交流QQ群:872537977。如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你想参与到这个项目的开发中来,唯一的要求是像我一样编写开发日志让更多的人看到并学习。
github地址:https://github.com/Liweimin0512/uRPG
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
这一期我们实现道具的拾取和存放

需求分析

上一期中我们设计了一个掉落物的列表。这一期我们继续处理当列表中的道具被点击后,将道具保存到玩家的背包中的操作。
我们首先制作一个极简的背包,它不需要通过主界面的图标跳转到专属的界面。而只是在主界面下方的一排“快捷栏”。因为其实现的原理是一致的。希望小伙伴们能举一反三吧。
首先,我们依然要客串策划的工作。策划同学突然灵光一闪,觉得道具和掉落物应该是一一对应的,而掉落物的参数是可配置的。

DropData与Item的对应关系

通过思考,我们对这部分代码进行了重构。首先是我们创建了一个DropData的结构体如下图所示,默认值就设置成之间的掉落物本来该有的值:

b1c1cd0d83904e4a59951ae9e1225e2b.png
s_DropData

这里设置比较简单,掉落物的模型、特效及拾取半径都是可以配置的。

然后我们在原有的ItemData中引用这个结构体,如下图所示:

b7ff344b09e4164f3d54652b2b41c8d2.png
ItemData中引用

构建Bp_master_DropBase

我们在Bp_master_DropBase中,首先将相关变量都勾选成“可编辑实例”和“在生成时显示”。并且编写蓝图的构建脚本如下图所示:

abe24bd0fa8bea5925d5a892178732fe.png
Bp_master_DropBase的构建脚本

构建脚本,顾名思义就是在蓝图构建时调用的(大概),总之是比BeginPlay事件要早。

当玩家进出凋落物的拾取范围呢?依然是调用玩家角色身上的UpdateDropItemList方法。

bc1892e1f462d5a6a008d5e3de3d6028.png
调用UpdateDropItemList


这个方法的实现目前看依然很尴尬,只是做了一个传话筒,但是我们这么写的目的是为了搭出架子来,在之后的修改中会更方便。

d94cb00a5d60e4efcda7071b9c956979.png
UpdateDropItemList的实现

Drop函数的重构

再次改写Drop函数,其实是因为Bp_master_DropBase这个蓝图本身做了调整,它除开存放本身外显的一些参数外,还存放了一个s_ItemState的结构体变量:

c222cc9bb88279ec7b78bd1735313e22.png
s_ItemState

这个结构体很常用,是保存玩家所拥有的道具及道具数量的简单结构体。

7ef89cd42e99a7bfbc0950ed3fd46d41.png
Drop函数的改变

可以看出Drop函数的改变主要来自于ItemState简单了许多,只需要传入道具Id和数量即可。而Drop相关的参数,也是通过查询ItemList表格获取到的。

UMG_PickupList的处理

UMG_PickupList主要是UpdateListView这个函数的实现,这也是目前比较关键的一步。首先,我们根据Add?判断是添加还是移除元素从ItemStatList这个集合中,同时对PickupListView进行一次清理操作

3f78cee96570045fab84e838b336821e.png
ItemStatList操作

然后我们遍历ItemStatList中的元素,逐个添加到PickupListView中

397e4f0018a9957c9c299fadf2a5f313.png
添加操作

由于这部分都是对上一期中代码的重构,因此不详细介绍思路了就。

UMG_ItemInventory

上文的内容,都是对过往代码的重构,从这里开始,才进入本篇文章的主题。首先,我们创建一个主界面控件——快捷栏控件。它长这样:

40f6c3a6f514be5e9f4f61082c823ad7.png
UMG_ItemInventory的设计

如果你细心观察,会发现其实这个Weiget只使用了一个HorizontalBox组件,如何实现?这就要引出PreConstruct这个事件了,他有点类似于蓝图的构造脚本。在编辑器中就可以展现事件中所进行的修改。我这里进行的修改很简单

5fa65503e204b0010944bf411f15f876.png
PreConstruct

创建了10个UMG_Item并将其添加到HorizontalBox组件上,同时,为了进行逻辑上的记录,还将其保存在一个名为ItemIndex的map中

51846211ce19688694eb618b8a8fdf33.png
ItemIndex


至于UMG_Item这个Weiget呢,相信你已经猜出来了。

2b5c3dff942afbee13151b8d6bb8b203.png
UMG_Item

它由背景图片,道具图片和道具数量三部分组成,并且默认情况下(没有道具时)道具图标、道具数量都是隐藏的,只显示背景图片。(ps:写到这里突然感觉实现方式有问题,懒得改了,下期再说)

OnItemClicked事件

ListView很重要的一个事件,就是当列表中的某一项被点击时候调用的OnItemClicked事件。我们这里要用这个事件,当点击时,将掉落物添加到背包中并从拾取物列表中移除。

59f2e0f4cbb5554ea94f88da40bc7439.png
OnItemClicked

这里我们并没有直接处理,而是将操作权交给了Controller。不过,还是将干掉掉落物的操作直接在这里实现了。(似乎也是不合理的部分,之后优化吧。)

那么Controller怎么操作的呢?他首先通知Character做相应的操作(SetItemValue),然后通知主界面做相应操作(UpdateItemInventory)

32723152521156d5f3ed90c2be421a29.png
F_Pickup

而UpdateItemInventory顾名思义,就是更新一下背包。这个函数可以再每次打开背包的时候调用,这里因为是直接显示在快捷栏中,因此当捡起道具时候就应该直接显式调用一次。

602dc2e46ea0ae1165ce14269536e935.png
UpdateItemInventory

首先就是遍历ItemMap,然后根据其中存储的ItemID通过查表将道具图标和数量显示出来,需要注意的是,图标和数量的控件默认都是隐藏的,这里需要将其设置为显示的。

至此,将道具存放到背包中的功能就算是完成了。

下期预告

在之后的一段时间,我想研究一下任务系统的实现。至于道具系统更深入的开发,就留给任务系统之后来做。
或者说是制作一个简易的任务系统,然后补充这些基础系统的文档后。再重构更为精巧的技能、任务和道具系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

abp vue如何配置服务地址_DHCP服务如何配置才能尽量减少被攻击的可能

DHCP Snooping是啥?DHCP Snooping是DHCP的一种安全特性,用来保证DHCP客户端能够正确的从DHCP服务器获取IP地址,防止网络中针对DHCP的攻击。DHCP Snooping是如何防止DHCP攻击的呢?DHCP,动态主机配置协议,在I…

通达信缠论买卖点公式_通达信缠论多空主图指标公式

1.高位无量就拿,就算拿错了也要拿着。高位就是说股价处于或者接近历史的最高位。高位无量横盘,是非常典型的上涨中继形态之一,高位的窄幅箱型振荡。2.高位放量出现就要跑,哪怕是跑错也要跑。股价在已经过了一段时间比较大的涨幅后&#xff0c…

多节锂电串联保护板ic_如何有效保护锂电池板,一款优质的MOS管就能解决

锂电池几乎应用于我们日常接触到的各类电器之中,但如何保护锂电池,你又是否知道呢?其实在锂电池保护板,最主要的元器件是IC与MOS。MOS对锂电池板的保护作用非常大,它可以检测过充电,检测过放电,…

使用pp架构形成计算机集群请求的地址无效_干货!史上最详细脑图《大型网站技术架构》...

1. 介绍一下《大型网站技术架构》这本书可能很多人都看过,小编个人觉得真的是非常不错的一本书。看完这本书后,你会对如何设计大型网站架构,有非常清晰的思路。如果还没有读过的小伙伴,赶紧去读一读吧。PS:小编这里有这…

泰坦尼克号数据_数据分析-泰坦尼克号乘客生存率预测

项目背景目标预测一个乘客是否能够在泰坦尼克号事件中幸存。概述1912年4月15日,泰坦尼克号在首次航行期间撞上冰山后沉没,船上共有2224名人员(包括乘客和机组人员),共有1502人不幸遇难。造成海难失事的原因之一是乘客和…

linux mysql服务器安装_Linux服务器MySQL安装

Linux服务器MySQL安装1. MySQL官网下载如图:2. 安装MySQL[rootiZ2zebb0428roermd00462Z /]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch#过滤MySQL:[rootiZ2zebb0428roermd00462Z /]#yum repolist all |grep mysql#ena…

python3 array为什么不能放不同类型的数据_来自俄罗斯的凶猛彪悍的分析数据库ClickHouse...

点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!ClickHouse相关文章推荐:战斗民族开源 | ClickHo…

mysql锁表查询_Mysql数据库锁情况下开启备份导致数据库无法访问处理分享

[背景简介]MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。mysql虽然功能未必很强大,但因为它的开源、广泛传播&#xf…

mysql直接执行文件格式_Windows 环境下执行 .sql 格式文件方式

windows 命令行中有2种执行 .sql 文件的方式:直接行文件 和 先进入mysql命令行然后执行文件。具体操作如下:1. 直接在windows命令行执行。打开windows命令行(winR打开运行窗口然后输入cmd,回车),进入mysql的本机地址,如果配置了环…

Java大数据处理的流行框架

大数据挑战 在公司需要处理不断增长的数据量的各个领域中,对大数据的概念有不同的理解。 在大多数这些情况下,需要以某种方式设计所考虑的系统,以便能够处理该数据,而不会随着数据大小的增加而牺牲吞吐量。 从本质上讲&#xff0c…

带有Prometheus的Spring Boot和测微表第6部分:保护指标

以前,我们使用Prometheus成功启动了Spring Boot应用程序。 Spring应用程序中的一个端点正在公开我们的指标数据,以便Prometheus能够检索它们。 想到的主要问题是如何保护此信息。 Spring已经为我们提供了强大的安全框架 因此,将其轻松用于…

使用AWS Elastic Beanstalk轻松进行Spring Boot部署

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认谁在发出请求&…

mysql报错乱码_连接mysql服务器报错时,出现乱码

页头用了header(content-type:text/html;charsetutf-8);try{$this->dbonew PDO($dsn,$dbuser,$dbpassword);}catch(Exception $e){echo $e->getMessage();}连接失败时会报错,但是乱码,IE下编码查看是UTF-8,但是是乱码,如果选…

zookeeper 负载_ZooKeeper,策展人以及微服务负载平衡的工作方式

zookeeper 负载Zookeeper如何确保每个工人都能从工作委托经理那里愉快地完成工作。 Apache ZooKeeper是注册,管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时,它是技术堆栈中必不可少的成员,这些节点…

高效的企业测试-集成测试(3/6)

本系列的这一部分将展示如何通过代码级以及系统级集成测试来验证我们的应用程序。 (代码级)集成测试 集成测试一词有时在不同的上下文中使用不同。 根据Wikipedia的定义,我指的是在代码级别上验证多个组件之间相互作用的测试。 通常&#x…

带Prometheus的Spring Boot和测微表第4部分:基础项目

在以前的文章中,我们介绍了Spring Micrometer和InfluxDB。 所以你要问我为什么普罗米修斯。 原因是Prometheus在InfluxDB的拉模型与推模型上进行操作。 这意味着,如果将千分尺与InfluxDB一起使用,则在将结果推送到数据库中时肯定会有一些开…

前端如何实现网络速度测试功能_分析Web前端测试要点,从架构原理上进行分析,希望大家能够掌握...

基于Web前端分析过程,大概有十几个测试要点,我们今天主要来讲解结合前五个要点进行详细解说。前端测试点主要针对前端展开,什么叫前端分析呢?就是我们所有的分析和测试要点所站的视角都是针对客户端或者浏览器来对系统进行分析和测…

将Websocket与Spring Framework和Vuejs结合使用

Websocket是客户端和服务器之间的全双工(持久)连接,因此两者可以彼此共享信息,而无需重复建立新的连接。 这消除了从客户端重复轮询以从服务器获取更新的需要。 并非所有浏览器都支持Websocket,因此我们利用SockJS ja…

python函数和模块的使用方法_Python学习06_函数和模块的使用

引入在写有些代码的时候,会发现有些步骤重复了多次,他也不像循环,都是相同的东西在重复,而是指做某件事情的步骤方法,做事的人或对象发生了改变,但是方法却没有改变。要想写出高质量的代码,首先…

tmemo 选择消除行_Divi模块,行和部分加入高级动画选项

一切元素的动画选项每个Divi模块,行和部分都带有高级动画选项,你可以使用这些选项来吸引访问者并使页面更加耀眼。Divi引入一个全新的动画系统,并将这些高级动画选项扩展到每个Divi模块,行和部分!这些新选项已合并到一…