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 = ""
|
||||
|
||||
|
||||
@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)
|
||||
|
@ -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 浮现,显示 3s,0.5s 隐藏(通过调整 alpha 通道实现)\n * 支持堆积消息\n * 如果有堆积的消息,显示 2s(而不是 3s)",
|
||||
"log_content": "* 完善消息提示功能\n * 支持堆积消息\n * 0.5s 浮现,显示 3s,0.5s 隐藏(通过调整 alpha 通道实现);如果有堆积的消息,显示 2s(而不是 3s)",
|
||||
"tags": [
|
||||
"2@ui",
|
||||
"2@code"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user