在 实现背包GUI 中我们已经完成了全部的背包显示功能下面需要实现怎么拖拽了,对于拖拽实际上是能够离开 godot 实现的,但是这样太不方便了,需要通过一层层接口转换,可维护性是提高了,但是作为游戏这种快速迭代的项目并不是那么合理,所以这里我们继续使用较为耦合的方式实现。
拖拽的数据存储
首先在拖拽的时候我们的鼠标只有一个,所以需要考虑怎么储存拖拽数据,我的考虑是直接存 BagName、拖拽的起点 x 起点 y随后 记录 BagItem 的数据即可。
然后我们同之前 controller 一样,需要考虑 drag 是怎样交互的。
对接 BagController
为了方便记录和获取数据,这里就不定义 interface 了,可以选择直接将 BagController 耦合的方式传入, 随后让 BagController 直接 new 他即可:
随后我们需要思考 Bag 是怎么怎样工作的。
流程上 伪代码 一般是这样的:
所以我们需要从 item slot 开始绑定事件,在此之前可以先把交换的逻辑现都写了,交换逻辑本身和页面无关。
SetDragMove
开始拖拽时是需要创建 _mouseSlot
的这里的话,我们简单判断一下 mouseSlot 有没有被挂在到全局,没有就挂载过去即可:
AddToSlot
添加到 slot .的逻辑也比较简单如果是空的,说明直接设置过去就可以了,如果是不同的物品则不操作,如果是相同的,加 count 数量。
MoveToSlot
也就是最终点击完成交换什么的操作,这里逻辑稍稍多一点点。
MoveBackToSlot
点击了其他地方挪回去.
现在我们实现了主要逻辑,需要去 item slot 中绑定了。
使用 gui_input
添加 OnInput
实现鼠标的显示
上面我们已经定义的鼠标的显示,下面我们需要制作一个 mouse 拖拽的 item 来显示内容
dragNode 我是直接复制的 ItemSlot 不多赘述了。
代码上有一些小小的不同: