无望其速成,无诱于势利。
一、展示
在 【极简】Godot4.4 简易仓库A(附完整代码/素材包)基础上,本文拓展了原有的仓库功能,实现物品:1. 拖拽放置 2. 拖拽分割

二、复刻
更新脚本
1. event_bus.gd
extends Node
@warning_ignore("unused_signal")
signal inventory_item_added(item: InventoryItem) # 添加物品
@warning_ignore("unused_signal")
signal slot_item_dropped(index: int) # 丢弃物品
@warning_ignore("unused_signal")
signal slot_item_divided(index: int) # 拖拽部分物品
var inventory_items: Array[Resource] # 存储物品数据的列表
func _ready() -> void:
inventory_items.resize(6)
2. slot_ui.gd
class_name SlotUI
extends VBoxContainer
## 物品槽,实现拖放
@export var inventory_item: InventoryItem
var is_empty: bool = true #物品槽默认为空
var slot_index: int = -1 #物品槽索引默认为-1
var current_stack_label_text: String
var is_drag_failed: bool = false #判断拖放是否成功
@onready var texture_rect: TextureRect = $TextureRect
@onready var stack_label: Label = $TextureRect/StackLabel
@onready var name_label: Label = $NameLabel
# 初始化物品槽
func _ready() -> void:
if inventory_item.texture != null:
texture_rect.texture = inventory_item.texture
if inventory_item.name != null:
name_label.text = inventory_item.name
EventBus.slot_item_dropped.connect(_on_self_slot_item_dropped)
# 当收到InventoryUI节点发送的信号后,更新物品槽
# 命名规范:_on_[发送节点名]_[发送信号名]
func update_slot(item: InventoryItem) ->void:
texture_rect.texture = item.texture
stack_label.text = str(item.stack)
name_label.text = item.name
is_empty = false
# 返回true:可放,false:不可放
func _can_drop_data(_at_position: Vector2, _data: Variant) -> bool:
return true
# 拖
func _get_drag_data(_at_position: Vector2) -> Variant:
# 验非空,创建拖动预览图,并发送数据
if !is_empty:
var drag_preview = TextureRect.new()
# 【CTRL + 鼠标左键】拾取物品槽中一半物品
if Input.is_key_pressed(KEY_CTRL):
# 预览图复制体,确保原物品槽中有图形
var drag_pre

最低0.47元/天 解锁文章
1349

被折叠的 条评论
为什么被折叠?



