update EntityLoader

This commit is contained in:
cakipaul 2024-12-24 19:54:30 +08:00
parent 33f3088ba7
commit 9fdb1d2f17
6 changed files with 114 additions and 160 deletions

File diff suppressed because one or more lines are too long

View File

@ -11,6 +11,10 @@ class EntityStateConfig:
var sound: String = ""
@export var trigger := false:
set(val):
emit_changed()
trigger = false
@export var entity_name: String = ""
@export var placeholder_size := Vector2(32, 64)
@export var offset := Vector2(0, 0)

View File

@ -1,9 +1,25 @@
{
"items": [
{
"event_date": "12/24/2024",
"item_id": "17350412826264",
"log_content": "实现基本的 EntityLoader 功能:\n* 在没有配置资源时,展示 placeholder\n* 可填充资源\n* 基本的数据结构:名称,说明,大小参数,动画,音效等",
"tags": [],
"update_date": "12/24/2024"
},
{
"event_date": "12/24/2024",
"item_id": "17350401808351",
"log_content": "实现自动存档功能:\n* 整合存档资源在 AssembledArchive 下\n* 多存档(隔离) + 单配置(全局)\n* 可配置定时保存\n* 游戏时长记录:存档游戏时长 + 全局游戏时长",
"tags": [
"2@code"
],
"update_date": "12/24/2024"
},
{
"event_date": "12/24/2024",
"item_id": "17350028043797",
"log_content": "* 完善消息提示功能\n * 0.5s 浮现,显示 3s0.5s 隐藏(通过调整 alpha 通道实现)\n * 支持堆积消息\n * 如果有堆积的消息,显示 2s而不是 3s",
"log_content": "* 完善消息提示功能\n * 支持堆积消息\n * 0.5s 浮现,显示 3s0.5s 隐藏(通过调整 alpha 通道实现)如果有堆积的消息,显示 2s而不是 3s",
"tags": [
"2@ui",
"2@code"

View File

@ -12,14 +12,14 @@ var autosave_timer := Timer.new()
func _ready() -> void:
if not _check_dirs_and_archives():
# TODO warning and exist
_handle_load_error("存档目录", "读写")
return
autosave_timer.timeout.connect(_try_auto_save)
autosave_timer.stop()
add_child(autosave_timer)
# config should be loaded first
load_config()
# TODO NOTICE auto load archive on debug mode
# NOTICE auto load archive on debug mode
if GlobalConfig.DEBUG:
if archives.size() == 0:
create_and_use_new_archive()
@ -100,8 +100,8 @@ func create_and_use_new_archive(id := -1) -> void:
while FileAccess.file_exists(archive_path):
id += 1
archive_path = (archive_dir + archive_prefix + str(id) + GlobalConfig.RES_FILE_FORMAT)
archive.archive_id = id
archive.resource_path = archive_path
archive.archive_id = id
archive.created_time = Time.get_datetime_string_from_system(false, true)
ResourceSaver.save(archive, archive_path)
archives.append(id)
@ -153,7 +153,7 @@ func load_archive() -> void:
func _handle_load_error(target, action) -> void:
var msg = str(target) + " " + str(action) + " 失败"
var msg = str(target) + " " + str(action) + " 失败,请检查文件访问权限"
SceneManager.pop_notification(msg)
printerr(msg)
# TODO handle error

View File

@ -1,34 +1,26 @@
@tool
class_name EntityLoader extends Node2D
@export var state: String:
set(value):
state = value
_init_state()
@export var entity_config: EntityConfig:
set(value):
entity_config = value
entity_config.changed.connect(_reload)
value.changed.connect(_reload)
# Load the entity config
_reload()
@export
var sprite_frames = preload("res://config/animation/player_sprite_frames.tres") as SpriteFrames
@onready var sprite2d = %AnimatedSprite2D as AnimatedSprite2D
func _ready() -> void:
if GlobalConfig.DEBUG:
add_child(DebugLabel.new())
var label = DebugLabel.new()
add_child(label)
label.name = "DebugLabel"
_reload()
func _reload() -> void:
# rm children
state = entity_config.initial_state
_init_state()
func _init_state() -> void:
if not entity_config:
if not entity_config or not sprite2d:
return
## free unused children
# TODO Load current state according to entity config
@ -43,32 +35,13 @@ func _init_state() -> void:
func _init_placeholder():
if not entity_config.placeholder_size:
return
var sprite = get_node_or_null("PlaceholderSprite") as Node2D
if sprite:
sprite.visible = true
else:
sprite = Sprite2D.new()
add_child(sprite)
sprite.texture = placeholder_pic
sprite.scale = entity_config.placeholder_size / sprite.texture.get_size()
sprite.offset = entity_config.offset
sprite.name = "PlaceholderSprite"
var label = get_node_or_null("PlaceholderLabel") as Node2D
sprite2d.play("placeholder")
var frames = sprite2d.sprite_frames as SpriteFrames
var first_frame_size = frames.get_frame_texture("placeholder", 0).get_size()
sprite2d.scale = entity_config.placeholder_size / first_frame_size
print("scale:", sprite2d.scale)
sprite2d.offset = entity_config.offset
var label = get_node_or_null("DebugLabel")
if label:
label.visible = true
else:
label = Label.new()
add_child(label)
label.text = "[" + entity_config.entity_name + "]" + entity_config.entity_title + ":" + state
label.text = ("[" + entity_config.entity_name + "]" + entity_config.entity_title)
label.modulate = Color.GREEN
label.name = "PlaceholderLabel"
func switch_state(state_name: String) -> void:
state = state_name
_init_state()
func action(action_name: String) -> void:
# TODO
pass

View File

@ -1,65 +1,26 @@
[gd_scene load_steps=7 format=3 uid="uid://do5j7vqrviv48"]
[gd_scene load_steps=5 format=3 uid="uid://do5j7vqrviv48"]
[ext_resource type="Script" path="res://manager/deploy/entity/entity_loader.gd" id="1_0ynbr"]
[ext_resource type="SpriteFrames" uid="uid://cs44glabs8sma" path="res://config/animation/player_sprite_frames.tres" id="2_7crsu"]
[ext_resource type="Script" path="res://config/deploy/entity_config.gd" id="2_ig6vo"]
[sub_resource type="GDScript" id="GDScript_gcl2t"]
[sub_resource type="GDScript" id="GDScript_dhqgj"]
[sub_resource type="GDScript" id="GDScript_ybgaq"]
script/source = "class_name EntityConfig extends Resource
class EntityStateConfig:
extends Resource
var state_name: String = \"default\"
var animation: String = \"\"
var loop: bool = false
var sound: String = \"\"
var state_title: String = \"\" # use default if empty
var state_note: String = \"\" # use default if empty
var actions: Array[String] = []
class EntityActionConfig:
extends Resource
var action_name: String = \"\"
var next_state: String = \"\" # empty means keep current state
var animation: String = \"\"
var sound: String = \"\"
var callback: Callable # receive the entity as argument
@export var entity_name: String = \"\"
@export var placeholder_size: Vector2 = Vector2(32, 64)
@export var offset: Vector2 = Vector2(0, 0)
@export var entity_title: String = \"\"
@export var entity_note: String = \"\"
@export var initial_state: String = \"default\"
@export var initializer: Callable
@export var entity_states: Array[EntityStateConfig]
@export var entity_actions: Array[EntityActionConfig]
"
[sub_resource type="Resource" id="Resource_6wfuj"]
script = SubResource("GDScript_ybgaq")
entity_name = ""
[sub_resource type="Resource" id="Resource_2isy3"]
script = ExtResource("2_ig6vo")
trigger = true
entity_name = "name"
placeholder_size = Vector2(32, 64)
offset = Vector2(0, 0)
entity_title = ""
entity_title = "title"
entity_note = ""
initial_state = "default"
initializer = Callable()
entity_states = Array[SubResource("GDScript_dhqgj")]([])
entity_actions = Array[SubResource("GDScript_gcl2t")]([])
pickable = false
[node name="EntityLoader" type="Node2D"]
script = ExtResource("1_0ynbr")
state = "default"
entity_config = SubResource("Resource_6wfuj")
sprite_frames = null
entity_config = SubResource("Resource_2isy3")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
unique_name_in_owner = true
scale = Vector2(0.125, 0.25)
sprite_frames = ExtResource("2_7crsu")
animation = &"placeholder"
frame_progress = 0.488925