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

需求分析

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

DropData与Item的对应关系

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

s_DropData

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

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

ItemData中引用

构建Bp_master_DropBase

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

Bp_master_DropBase的构建脚本

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

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

调用UpdateDropItemList

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

UpdateDropItemList的实现

Drop函数的重构

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

s_ItemState

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

Drop函数的改变

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

UMG_PickupList的处理

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

ItemStatList操作

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

添加操作

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

UMG_ItemInventory

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

UMG_ItemInventory的设计

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

PreConstruct

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

ItemIndex

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

UMG_Item

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

OnItemClicked事件

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

OnItemClicked

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

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

F_Pickup

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

UpdateItemInventory

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

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

下期预告

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

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

  1. ue4 无限地图_RPG游戏开发日志13:无限地图的实现

    写在前面 本项目同步上传于coding上,国内读者可以通过在coding下载项目. 也欢迎你加入我的UE4学习交流QQ群:872537977.如果你喜欢我写的文章,也希望你点赞.收藏.转发.谢谢! 如 ...

  2. android 使用Photoshop获取图片某一点的颜色

    今天,简单讲讲android里如何使用Photoshop获取图片某点的像素. 之前,做界面时需要模仿一款app的界面,所以需要获取界面的颜色值在app里使用.其实使用颜色截取器也可以,也很简单.但是但 ...

  3. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  4. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  5. ue4 开发动作游戏_【图片】第三人称动作游戏开发日志【虚幻4吧】_百度贴吧

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 今天我们继续来制作格斗游戏的角色动作部分.接下来轮到锁链下降和物体拖拽的动作,这2个动作相对于锁链荡漾还是比较简单的. 锁链下降是角色在高处的时候,用机械 ...

  6. 两行 CSS 代码实现图片任意颜色赋色技术

    很久之前在张鑫旭大大的博客看到过一篇 PNG格式小图标的CSS任意颜色赋色技术,当时惊为天人,感慨还可以这样玩,私底下也曾多次想过有没有其他方法可以实现,又或者不仅仅局限于 PNG 图片. mix-b ...

  7. html 图片怎么改颜色代码,两行 CSS 代码实现图片任意颜色赋色技术

    原标题:两行 CSS 代码实现图片任意颜色赋色技术 || 很久之前在张鑫旭大大的博客看到过一篇 PNG格式小图标的CSS任意颜色赋色技术,当时惊为天人,感慨还可以这样玩,私底下也曾多次想过有没有其他方 ...

  8. python通过获取图片固定位置的颜色坐标,并且通过坐标点颜色填充整张图片代码+注释

    先上代码: #!/usr/bin/env python # -*- coding:utf-8 -*- import cv2 import os import numpy as np import uu ...

  9. python通过pil为png图片填充上背景颜色的代码

    将内容过程经常用到的一些内容珍藏起来,如下资料是关于python通过pil为png图片填充上背景颜色的内容,应该对码农也有用. x,y = im.size try: # (alpha band as ...

最新文章

  1. python pdb 基础调试
  2. ORACLE not available如何解决
  3. boost::math::quadrature::naive_monte_carlo用法的测试程序
  4. 匿名内部类 可以访问外部类_Java 内部类与外部类的互访使用小结
  5. HL7数据类型分析(1)
  6. Boot Hill 布特山
  7. CMD命令备份驱动和安装驱动
  8. 网站采集器-免费任意网页数据采集器
  9. Python软件的下载安装教程
  10. 江南大学计算机科学复试题目,2019江南大学计算机考研初试科目、参考书目、复试线...
  11. web前端面试题— 简答题
  12. 怎么用科学计算机算反三角函数值域,反三角函数值域怎么求
  13. py可执行文件反编译教程--exe转换py
  14. onnx模型输出所有中间层结果
  15. MPU9250对初始数据的读取
  16. n个人排名,允许并列名次,共有多少种排名结果?
  17. ADC0809模数转换
  18. Fatal Python error: _PyInterpreterState_Get(): no current thread state Python runtime state: unknown
  19. 说说鸡尾酒会问题(Cocktail Party Problem)和程序实现
  20. 树莓派安装retropie 打造属于你的小霸王街机游戏机

热门文章

  1. 反序列化 jackson_使用Jackson和Super类型令牌的Json反序列化
  2. 使用Envoy代理的微服务模式,第二部分:超时和重试
  3. 免费网络研讨会:调试生产中Java的新方法
  4. 在自定义Java 9映像上运行Eclipse Neon
  5. 使用ADF列表视图的主从数据
  6. 将JPA Hibernate与OptaPlanner集成
  7. JDBC教程– ULTIMATE指南(PDF下载)
  8. 从jHiccup开始
  9. Java旧版不断发展
  10. Java 8快多少?