黑之翅膀吧 关注:159贴子:1,262
  • 1回复贴,共1

【Godot】菜单、UI、背包中的物品移动的逻辑和思路

只看楼主收藏回复


一个是界面上可视化的移动,然后可视化的界面控制逻辑的运行,由逻辑改变程序中库存的变化。原理上其实就是一张图的事情,但是实现起来是有点麻烦,以及很多教学视频都是很长很长出好几期视频都说不完。
我个人是不喜欢用库存的,因为Godot的变量基本可以装下所有的东西,所以本质上对象节点什么的都只是一串数字。深入研究之后才发现原理这么简单。

节点上的信号检测我用的是: gui_input(event: InputEvent)
Slot(槽位)我是做的子节点,然后批量生成背包格子的。

然后因为我是直接做的3页背包,每页18,所以很暴力的直接拆开分别For循环了18次。
每个格子都有脚本,脚本里记录Slot的号数。
所以生成出来顺便跟着号数变化,记录每一个槽位的号数。
接着给他们都加入信号。
#制作Slot操控信号:
for num in 54:
BagSlotList[num].gui_input.connect(Click.bind(num))
我这里有54个格子,所以针对54个格子生成了54个信号,并且绑定了参数,用来提示当前鼠标点击的是哪个槽位。
#信号名.connect( 函数名.bind( 传递的参数 ) )
func Click(isInput,Slot):
第一个参数 isInput,是信号自带的参数位置,Slot是我自己设定的参数传递。
所以我会得到两个参数: 鼠标操作 和 槽的号数
默认信号是会传递鼠标的所有信号的,但我只需要鼠标左键点击的时候判断逻辑。
if isInput.is_pressed() and Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
下面就是被控制之后的逻辑了。。。
后面就是基本操作了。判断槽是否有物品、判断手上是不是有物品、判断物品是否相同类型。
库存那边,我直接用的Array数组来存对象。
这里的对象都是item格式,item也是我自己做的一个单独的节点,里面记录者物品的种类、数量、名称、.....等等
同时 item 其实属于菜单中的物品, 我还会写个转换,让【菜单物品】可以转换成 【掉落物】,相反也有。
这是方便主角在地上捡起物品,又可以从背包把物品扔出去。
最后就基本的逻辑了:
移动物品的时候,点击的物品会被移动到【正在手持的物件】的节点中,并且这个节点会跟随鼠标移动。
$PickupItem.global_position = self.get_global_mouse_position() - Vector2(12,12)
点击的物品节点就会被移动到这个Pickupitem节点里。
过程也很简单
点击物品的时候:
ClickSlot.remove_child(Item) <<删除 当前点击槽位的 物品节点 (remove_child 不会真的删除,只是隐藏了)
$Panel/PickupItem.add_child(Item) <<在【正在手持的物件】添加 物品节点,物品就被移动过来了
move_node = Item <<用一个变量记录这个物品,方便逻辑判断【当前已持有节点】
上面是界面上的变化,但是库存还没变,所以库存也要变一下。
Pick_up_item = Bag[Slot] #【正在手持的物件】 = 【当前槽位的物品】
Bag[Slot] = null #【当前槽位的物品】= 空
接下来就自由发挥了,原理就是这样。
当然背包还涉及很多判断,比如拾取掉落物,掉落物会转换成物品形态,然后再判断库存中是否有空位可以存放物品,如果有空位,就加入到库存,顺便在界面中创建新的物品节点,然后把物品数据同步,再刷新界面显示。
数量叠加 和 位置交替:
则是判断物品的某些属性是否一致,名字一致ID一致之类的,一致的话就让槽位中的物品数量叠加上去再删除手上的那个物品节点。 如果更复杂一些就有数量限制,当两个物品叠加数量超过64的时候,就用两个物品叠加的数量减去64。
(A = 手持物品 B = 槽位中的物品)
(A+B)- 64 = 叠加后剩余的物品数量
A的数量 = 64
B的数量 = 剩余值
此时可以不删除B,让B继续待在手持物中。
物品交替则是排除上面状态后的第二个状态:
槽位.remove_child(B) 删除B节点
持有位.remove_child(A) 删除A节点
持有位.add_child(B) 把B放入手持物品中
槽位.add_child(B) 把A放入槽位中
这个库存里就麻烦点,库存里不能直接删掉,所以还需要造个临时的变量来存放被挪出的B。
A - B
1. - A B
2. B A -
3. B - A
交替有两种方式,一种是交替时两个物品互换位置,另一种是手跟槽位中的物品交换(手上还拿着)
逻辑里建议直接判断库存,可以避免因卡菜单的方式导致物品被复制之类的BUG。


IP属地:广东1楼2023-08-26 04:53回复
    感谢分享


    IP属地:河南来自Android客户端2楼2023-09-14 17:44
    回复