update EntityLoader
This commit is contained in:
parent
33f3088ba7
commit
9fdb1d2f17
File diff suppressed because one or more lines are too long
@ -11,6 +11,10 @@ class EntityStateConfig:
|
|||||||
var sound: String = ""
|
var sound: String = ""
|
||||||
|
|
||||||
|
|
||||||
|
@export var trigger := false:
|
||||||
|
set(val):
|
||||||
|
emit_changed()
|
||||||
|
trigger = false
|
||||||
@export var entity_name: String = ""
|
@export var entity_name: String = ""
|
||||||
@export var placeholder_size := Vector2(32, 64)
|
@export var placeholder_size := Vector2(32, 64)
|
||||||
@export var offset := Vector2(0, 0)
|
@export var offset := Vector2(0, 0)
|
||||||
|
@ -1,9 +1,25 @@
|
|||||||
{
|
{
|
||||||
"items": [
|
"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",
|
"event_date": "12/24/2024",
|
||||||
"item_id": "17350028043797",
|
"item_id": "17350028043797",
|
||||||
"log_content": "* 完善消息提示功能\n * 0.5s 浮现,显示 3s,0.5s 隐藏(通过调整 alpha 通道实现)\n * 支持堆积消息\n * 如果有堆积的消息,显示 2s(而不是 3s)",
|
"log_content": "* 完善消息提示功能\n * 支持堆积消息\n * 0.5s 浮现,显示 3s,0.5s 隐藏(通过调整 alpha 通道实现);如果有堆积的消息,显示 2s(而不是 3s)",
|
||||||
"tags": [
|
"tags": [
|
||||||
"2@ui",
|
"2@ui",
|
||||||
"2@code"
|
"2@code"
|
||||||
@ -81,4 +97,4 @@
|
|||||||
"update_date": "12/22/2024"
|
"update_date": "12/22/2024"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -12,14 +12,14 @@ var autosave_timer := Timer.new()
|
|||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
if not _check_dirs_and_archives():
|
if not _check_dirs_and_archives():
|
||||||
# TODO warning and exist
|
_handle_load_error("存档目录", "读写")
|
||||||
return
|
return
|
||||||
autosave_timer.timeout.connect(_try_auto_save)
|
autosave_timer.timeout.connect(_try_auto_save)
|
||||||
autosave_timer.stop()
|
autosave_timer.stop()
|
||||||
add_child(autosave_timer)
|
add_child(autosave_timer)
|
||||||
# config should be loaded first
|
# config should be loaded first
|
||||||
load_config()
|
load_config()
|
||||||
# TODO NOTICE auto load archive on debug mode
|
# NOTICE auto load archive on debug mode
|
||||||
if GlobalConfig.DEBUG:
|
if GlobalConfig.DEBUG:
|
||||||
if archives.size() == 0:
|
if archives.size() == 0:
|
||||||
create_and_use_new_archive()
|
create_and_use_new_archive()
|
||||||
@ -100,8 +100,8 @@ func create_and_use_new_archive(id := -1) -> void:
|
|||||||
while FileAccess.file_exists(archive_path):
|
while FileAccess.file_exists(archive_path):
|
||||||
id += 1
|
id += 1
|
||||||
archive_path = (archive_dir + archive_prefix + str(id) + GlobalConfig.RES_FILE_FORMAT)
|
archive_path = (archive_dir + archive_prefix + str(id) + GlobalConfig.RES_FILE_FORMAT)
|
||||||
archive.archive_id = id
|
|
||||||
archive.resource_path = archive_path
|
archive.resource_path = archive_path
|
||||||
|
archive.archive_id = id
|
||||||
archive.created_time = Time.get_datetime_string_from_system(false, true)
|
archive.created_time = Time.get_datetime_string_from_system(false, true)
|
||||||
ResourceSaver.save(archive, archive_path)
|
ResourceSaver.save(archive, archive_path)
|
||||||
archives.append(id)
|
archives.append(id)
|
||||||
@ -153,7 +153,7 @@ func load_archive() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _handle_load_error(target, action) -> void:
|
func _handle_load_error(target, action) -> void:
|
||||||
var msg = str(target) + " " + str(action) + " 失败"
|
var msg = str(target) + " " + str(action) + " 失败,请检查文件访问权限"
|
||||||
SceneManager.pop_notification(msg)
|
SceneManager.pop_notification(msg)
|
||||||
printerr(msg)
|
printerr(msg)
|
||||||
# TODO handle error
|
# TODO handle error
|
||||||
|
@ -1,34 +1,26 @@
|
|||||||
@tool
|
@tool
|
||||||
class_name EntityLoader extends Node2D
|
class_name EntityLoader extends Node2D
|
||||||
|
|
||||||
@export var state: String:
|
|
||||||
set(value):
|
|
||||||
state = value
|
|
||||||
_init_state()
|
|
||||||
@export var entity_config: EntityConfig:
|
@export var entity_config: EntityConfig:
|
||||||
set(value):
|
set(value):
|
||||||
entity_config = value
|
entity_config = value
|
||||||
entity_config.changed.connect(_reload)
|
value.changed.connect(_reload)
|
||||||
# Load the entity config
|
# Load the entity config
|
||||||
_reload()
|
_reload()
|
||||||
@export
|
|
||||||
var sprite_frames = preload("res://config/animation/player_sprite_frames.tres") as SpriteFrames
|
|
||||||
|
|
||||||
@onready var sprite2d = %AnimatedSprite2D as AnimatedSprite2D
|
@onready var sprite2d = %AnimatedSprite2D as AnimatedSprite2D
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
if GlobalConfig.DEBUG:
|
if GlobalConfig.DEBUG:
|
||||||
add_child(DebugLabel.new())
|
var label = DebugLabel.new()
|
||||||
|
add_child(label)
|
||||||
|
label.name = "DebugLabel"
|
||||||
|
_reload()
|
||||||
|
|
||||||
|
|
||||||
func _reload() -> void:
|
func _reload() -> void:
|
||||||
# rm children
|
if not entity_config or not sprite2d:
|
||||||
state = entity_config.initial_state
|
|
||||||
_init_state()
|
|
||||||
|
|
||||||
|
|
||||||
func _init_state() -> void:
|
|
||||||
if not entity_config:
|
|
||||||
return
|
return
|
||||||
## free unused children
|
## free unused children
|
||||||
# TODO Load current state according to entity config
|
# TODO Load current state according to entity config
|
||||||
@ -43,32 +35,13 @@ func _init_state() -> void:
|
|||||||
func _init_placeholder():
|
func _init_placeholder():
|
||||||
if not entity_config.placeholder_size:
|
if not entity_config.placeholder_size:
|
||||||
return
|
return
|
||||||
var sprite = get_node_or_null("PlaceholderSprite") as Node2D
|
sprite2d.play("placeholder")
|
||||||
if sprite:
|
var frames = sprite2d.sprite_frames as SpriteFrames
|
||||||
sprite.visible = true
|
var first_frame_size = frames.get_frame_texture("placeholder", 0).get_size()
|
||||||
else:
|
sprite2d.scale = entity_config.placeholder_size / first_frame_size
|
||||||
sprite = Sprite2D.new()
|
print("scale:", sprite2d.scale)
|
||||||
add_child(sprite)
|
sprite2d.offset = entity_config.offset
|
||||||
sprite.texture = placeholder_pic
|
var label = get_node_or_null("DebugLabel")
|
||||||
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
|
|
||||||
if label:
|
if label:
|
||||||
label.visible = true
|
label.text = ("[" + entity_config.entity_name + "]" + entity_config.entity_title)
|
||||||
else:
|
label.modulate = Color.GREEN
|
||||||
label = Label.new()
|
|
||||||
add_child(label)
|
|
||||||
label.text = "[" + entity_config.entity_name + "]" + entity_config.entity_title + ":" + state
|
|
||||||
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
|
|
||||||
|
@ -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="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="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="Resource" id="Resource_2isy3"]
|
||||||
|
script = ExtResource("2_ig6vo")
|
||||||
[sub_resource type="GDScript" id="GDScript_dhqgj"]
|
trigger = true
|
||||||
|
entity_name = "name"
|
||||||
[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 = ""
|
|
||||||
placeholder_size = Vector2(32, 64)
|
placeholder_size = Vector2(32, 64)
|
||||||
offset = Vector2(0, 0)
|
offset = Vector2(0, 0)
|
||||||
entity_title = ""
|
entity_title = "title"
|
||||||
entity_note = ""
|
entity_note = ""
|
||||||
initial_state = "default"
|
pickable = false
|
||||||
initializer = Callable()
|
|
||||||
entity_states = Array[SubResource("GDScript_dhqgj")]([])
|
|
||||||
entity_actions = Array[SubResource("GDScript_gcl2t")]([])
|
|
||||||
|
|
||||||
[node name="EntityLoader" type="Node2D"]
|
[node name="EntityLoader" type="Node2D"]
|
||||||
script = ExtResource("1_0ynbr")
|
script = ExtResource("1_0ynbr")
|
||||||
state = "default"
|
entity_config = SubResource("Resource_2isy3")
|
||||||
entity_config = SubResource("Resource_6wfuj")
|
|
||||||
sprite_frames = null
|
|
||||||
|
|
||||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
|
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
scale = Vector2(0.125, 0.25)
|
||||||
sprite_frames = ExtResource("2_7crsu")
|
sprite_frames = ExtResource("2_7crsu")
|
||||||
|
animation = &"placeholder"
|
||||||
|
frame_progress = 0.488925
|
||||||
|
Loading…
Reference in New Issue
Block a user