【极简】Godot4.4 简易仓库B(附完整代码/素材包)

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

一、展示

【极简】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 
Godot 4.4 中,使用 `.pck` 文件打资源时,资源路径不再自动含 `res://` 前缀。这一变化影响了资源引用的逻辑,特别是在使用 C# 编写脚本时,必须确保资源路径与 `.pck` 文件中定义的路径完全一致,否则将导致资源加载失败。 当使用 C# 创建 `.pck` 文件时,开发者需要明确指定资源的相对路径。例如,若资源位于项目目录下的 `assets/textures` 文件夹中,则打时应使用 `assets/textures/texture.png` 作为路径,而不是 `res://assets/textures/texture.png`。这种路径结构在加载 `.pck` 文件时必须保持一致,以确保资源可以被正确识别和引用。 在 C# 脚本中加载 `.pck` 文件时,可以使用以下代码: ```csharp ResourceLoader.Load("assets/textures/texture.png"); ``` 该代码将尝试从 `.pck` 文件中加载指定路径的资源。如果路径与打时定义的路径不一致,则资源将无法加载[^1]。 此外,在使用 C# 创建 `.pck` 文件时,开发者还需注意资源依赖关系的管理。由于 `.pck` 文件中的资源路径不再含 `res://`,因此所有资源引用必须基于项目根目录的相对路径。这种设计化了资源打流程,但也要求开发者在资源引用时更加精确,以避免因路径错误导致的资源丢失或加载失败。 为了适应这一变化,建议开发者在打 `.pck` 文件时使用统一的路径结构,并在脚本中保持一致的引用方式。例如,可以使用项目根目录下的 `assets` 文件夹作为资源存储的主目录,并在打时使用 `assets/` 作为资源路径的前缀。这种方式不仅化了资源管理,还能确保 `.pck` 文件中的资源路径与脚本中的引用路径保持一致。 ### 示例代码 以下是一个使用 C# 创建 `.pck` 文件的示例: ```csharp using Godot; using System.IO; public class PckPacker : Node { public void PackResources(string pckPath, string sourceDir) { var pck = new FileAccess(); Error err = pck.Open(pckPath, FileAccess.ModeFlags.Write); if (err != Error.Ok) { GD.Print("无法创建 .pck 文件"); return; } var files = Directory.GetFiles(sourceDir, "*", SearchOption.AllDirectories); foreach (var file in files) { string relativePath = file.Substring(sourceDir.Length + 1); pck.StoreString(relativePath); byte[] data = File.ReadAllBytes(file); pck.StoreBuffer(data); } pck.Close(); } } ``` 该代码将指定目录下的所有文件打为 `.pck` 文件,并使用相对路径存储资源。在加载 `.pck` 文件时,开发者需要确保资源路径与打时使用的相对路径一致。 ###
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值