优化 animation loader 逻辑

This commit is contained in:
cakipaul 2025-01-17 21:31:29 +08:00
parent 4a668ac88b
commit 0f5a564166
12 changed files with 179 additions and 31 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -1,4 +1,4 @@
extends Panel
extends Control
var config_path = "res://config/animation/frames_config.json"
var scan_path = "res://asset/art/animation/"
@ -15,7 +15,7 @@ var all_keys := []
var matched_keys := []
var all_pages := 1
var current_page := 1
const PAGE_SIZE = 6
const PAGE_SIZE = 14
# 0.png
# 12.png

View File

@ -3,19 +3,23 @@
[ext_resource type="Script" path="res://config/animation/animation_loader.gd" id="1_qwa4g"]
[ext_resource type="Script" path="res://ui/button/sound_button.gd" id="2_1tl0v"]
[node name="AnimationLoader" type="Panel"]
[node name="AnimationLoader" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = 564.0
offset_bottom = 316.0
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.5, 0.5)
script = ExtResource("1_qwa4g")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
layout_mode = 2
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = 36.0
grow_horizontal = 2
grow_vertical = 2
@ -66,9 +70,10 @@ script = ExtResource("2_1tl0v")
[node name="ConfigEdit" type="TextEdit" parent="HBoxContainer/MarginContainer2/VBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(120, 200)
custom_minimum_size = Vector2(170, 200)
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 3
editable = false
[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer"]
@ -81,4 +86,4 @@ vertical_scroll_mode = 2
unique_name_in_owner = true
custom_minimum_size = Vector2(400, 50)
layout_mode = 2
columns = 3
columns = 7

View File

@ -515,6 +515,29 @@
"6"
]
},
"c01_小小蝶_walking 8帧-317px高": {
"path": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高",
"frames": {
"1": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/1.png",
"2": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/2.png",
"3": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/3.png",
"4": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/4.png",
"5": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/5.png",
"6": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/6.png",
"7": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/7.png",
"8": "res://asset/art/animation/c01_小小蝶_walking 8帧-317px高/8.png"
},
"ids": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8"
]
},
"c01_小小蝶_walking_l": {
"path": "res://asset/art/animation/c01_小小蝶_walking_l",
"frames": {
@ -534,6 +557,64 @@
"6"
]
},
"c01_小小蝶_侧面下蹲": {
"path": "res://asset/art/animation/c01_小小蝶_侧面下蹲",
"frames": {
"1": "res://asset/art/animation/c01_小小蝶_侧面下蹲/1.png",
"10": "res://asset/art/animation/c01_小小蝶_侧面下蹲/10.png",
"11": "res://asset/art/animation/c01_小小蝶_侧面下蹲/11.png",
"2": "res://asset/art/animation/c01_小小蝶_侧面下蹲/2.png",
"3": "res://asset/art/animation/c01_小小蝶_侧面下蹲/3.png",
"4": "res://asset/art/animation/c01_小小蝶_侧面下蹲/4.png",
"5": "res://asset/art/animation/c01_小小蝶_侧面下蹲/5.png",
"6": "res://asset/art/animation/c01_小小蝶_侧面下蹲/6.png",
"7": "res://asset/art/animation/c01_小小蝶_侧面下蹲/7.png",
"8": "res://asset/art/animation/c01_小小蝶_侧面下蹲/8.png",
"9": "res://asset/art/animation/c01_小小蝶_侧面下蹲/9.png"
},
"ids": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11"
]
},
"c01_小小蝶_床上看书": {
"path": "res://asset/art/animation/c01_小小蝶_床上看书",
"frames": {
"1": "res://asset/art/animation/c01_小小蝶_床上看书/1.png",
"10": "res://asset/art/animation/c01_小小蝶_床上看书/10.png",
"11": "res://asset/art/animation/c01_小小蝶_床上看书/11.png",
"2": "res://asset/art/animation/c01_小小蝶_床上看书/2.png",
"3": "res://asset/art/animation/c01_小小蝶_床上看书/3.png",
"4": "res://asset/art/animation/c01_小小蝶_床上看书/4.png",
"5": "res://asset/art/animation/c01_小小蝶_床上看书/5.png",
"6": "res://asset/art/animation/c01_小小蝶_床上看书/6.png",
"7": "res://asset/art/animation/c01_小小蝶_床上看书/7.png",
"8": "res://asset/art/animation/c01_小小蝶_床上看书/8.png",
"9": "res://asset/art/animation/c01_小小蝶_床上看书/9.png"
},
"ids": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11"
]
},
"c01_小小蝶_抬头": {
"path": "res://asset/art/animation/c01_小小蝶_抬头",
"frames": {
@ -576,6 +657,37 @@
"7"
]
},
"c01_小小蝶_拿鸡毛掸子": {
"path": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子",
"frames": {
"1": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/1.png",
"10": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/10.png",
"11": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/11.png",
"12": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/12.png",
"2": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/2.png",
"3": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/3.png",
"4": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/4.png",
"5": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/5.png",
"6": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/6.png",
"7": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/7.png",
"8": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/8.png",
"9": "res://asset/art/animation/c01_小小蝶_拿鸡毛掸子/9.png"
},
"ids": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12"
]
},
"c01_捡球男孩_关键帧": {
"path": "res://asset/art/animation/c01_捡球男孩_关键帧",
"frames": {
@ -1630,4 +1742,4 @@
"c01_小小蝶_idle": 2,
"c01_小小蝶_idle_l": 2
}
}
}

View File

@ -24,7 +24,7 @@ func _ready() -> void:
frames_speed_line_edit.text = str(frames_per_sec)
first_frame_mapping_edit.text = first_frame_mapping
mirror_mapping_edit.text = mirror_mapping
reload_frames()
display_frames()
mapping_line_edit.text_submitted.connect(_on_mapping_submitted)
frames_speed_line_edit.text_submitted.connect(_on_frames_speed_submitted)
first_frame_mapping_edit.text_submitted.connect(_on_first_frame_mapping_submitted)
@ -34,6 +34,19 @@ func _ready() -> void:
var reload_lock := Mutex.new()
func display_frames():
if mapping_name and animated_sprite.sprite_frames.has_animation(mapping_name):
animated_sprite.play(mapping_name)
# scale down if the frame is too big
var frame_size = animated_sprite.sprite_frames.get_frame_texture(mapping_name, 0).get_size()
if frame_size.x > 128 or frame_size.y > 128:
var ratio = min(128 / frame_size.x, 128 / frame_size.y)
animated_sprite.scale = Vector2(ratio, ratio)
reload_lock.unlock()
else:
reload_frames()
func reload_frames():
# 暂不启用,使用手动调整
# return
@ -67,28 +80,9 @@ func reload_frames():
var frame_texture = load(frame_path) as Texture2D
sprite_frames.add_frame(mapping_name, frame_texture)
sprite_frames.set_animation_speed(mapping_name, frames_per_sec)
# mirror the frame
if mirror_mapping != "":
# mkdir the mirror mapping
var mirror_dir_path = "res://asset/art/animation/" + mirror_mapping
if !DirAccess.dir_exists_absolute(mirror_dir_path):
DirAccess.make_dir_absolute(mirror_dir_path)
var mirrored_frame = frame_texture.duplicate() as Texture2D
var flipped_image = mirrored_frame.get_image() as Image
flipped_image.flip_x()
var flipped_img_path = mirror_dir_path + "/" + id + ".png"
flipped_image.resource_path = flipped_img_path
flipped_image.save_png(flipped_img_path)
sprite_frames.add_frame(mirror_mapping, load(flipped_img_path))
sprite_frames.set_animation_speed(mapping_name, frames_per_sec)
animated_sprite.play(mapping_name)
# scale down if the frame is too big
var frame_size = sprite_frames.get_frame_texture(mapping_name, 0).get_size()
if frame_size.x > 128 or frame_size.y > 128:
var ratio = min(128 / frame_size.x, 128 / frame_size.y)
animated_sprite.scale = Vector2(ratio, ratio)
reload_lock.unlock()
_save_and_update_frames_and_config()
if mapping_name and animated_sprite.sprite_frames.has_animation(mapping_name):
display_frames()
func _on_mapping_submitted(new_text: String):
@ -133,11 +127,37 @@ func _on_mirror_mapping_submitted(new_text: String):
sprite_frames.remove_animation(mirror_mapping)
mirror_mapping = new_text
frames_config.data.mirror_mapping[frame_dir_name] = mirror_mapping
reload_frames()
_create_mirror()
mirror_mapping_edit.release_focus()
_save_and_update_frames_and_config()
func _create_mirror():
if not mirror_mapping:
return
var mirror_dir_path = "res://asset/art/animation/" + mirror_mapping
if !DirAccess.dir_exists_absolute(mirror_dir_path):
DirAccess.make_dir_absolute(mirror_dir_path)
else:
DirAccess.remove_absolute(mirror_dir_path)
DirAccess.make_dir_absolute(mirror_dir_path)
var sprite_frames = animated_sprite.sprite_frames as SpriteFrames
# {"path": "", "frames": {}, "ids": []}
var frames_data = frames_config.data.dirs[frame_dir_name]
for id in frames_data.ids:
var frame_path = frames_data.frames[id] as String
var frame_texture = load(frame_path) as Texture2D
# mkdir the mirror mapping
var mirrored_frame = frame_texture.duplicate() as Texture2D
var flipped_image = mirrored_frame.get_image() as Image
flipped_image.flip_x()
var flipped_img_path = mirror_dir_path + "/" + id + ".png"
flipped_image.resource_path = flipped_img_path
flipped_image.save_png(flipped_img_path)
sprite_frames.add_frame(mirror_mapping, load(flipped_img_path))
sprite_frames.set_animation_speed(mapping_name, frames_per_sec)
func _save_and_update_frames_and_config():
# save the sprite_frames
if animated_sprite:

View File

@ -76,6 +76,17 @@ enabled=PackedStringArray("res://addons/debug_menu/plugin.cfg", "res://addons/di
theme/custom="res://config/default_theme.tres"
theme/custom_font="res://asset/font/zpix-commercial-one-grand.ttf"
[importer_defaults]
gif.animated.texture.plugin={
"Filter": false,
"MipMaps": false
}
import_gif_to_animated_texture={}
import_gif_to_sprite_frames={
"frames_per_second": 30
}
[input]
save={