【极简】Godot 4.4 简易仓库C(附完整代码/素材包)

Godot 4.4简易仓库C功能拓展与测试

无望其速成,无诱于势利。

一、展示

【极简】Godot4.4 简易仓库A(附完整代码/素材包)【极简】Godot4.4 简易仓库B(附完整代码/素材包)基础上,本文拓展了原有的仓库功能,实现物品:1. 鼠标左键丢弃物品 2.Ctrl + 鼠标左键丢弃物品

请添加图片描述

二、复刻

更新脚本

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  #判断拖放是否成功
var is_ctrl: bool = false  # 判断Ctrl是否成功
var is_selected: 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:
	is_selected = true  # 被选中
	# 验非空,创建拖动预览图,并发送数据
	if !is_empty:
		var drag_preview = TextureRect.new()  # 创建预览图
		
		# 【CTRL + 鼠标左键】拾取物品槽中一半物品
		if Input.is_key_pressed(KEY_CTRL):
			# 预览图复制体,确保原物品槽中有图形
			var drag_pre = drag_preview.duplicate(true)
			drag_pre.texture = texture_rect.texture
			set_drag_preview(drag_pre)
			# 改变原物品槽标签,如果拖动则标签减半
			current_stack_label_text = stack_label.text  # 存储原标签
			var split_stack_label_text: String = str(ceili(int(stack_label.</
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForBigData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值