动画帧数自动导出

master
chendian 2 years ago
parent 60577cd2d5
commit c486fc28cf

@ -11,7 +11,11 @@ hit_back_speed = 2.0
hit_back_duration = 0.05
hit_up_speed = 1.0
hit_up_duration = 0.05
pause_time = 0.05
pause_time = 0.2
is_floating = false
is_hit_down = false
is_rebound = false
height = 2.0
radius = 0.0
size = Vector2(2, 1)
offset = Vector2(1, 0)

@ -16,6 +16,7 @@ action = "attack_light"
name = ""
skill_animation = ExtResource("3_3pp8a")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_mxlqc")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("4_q0bln")
sprite_frames = ExtResource("4_q0bln")
animation_name = "long_air_attack01"

@ -16,6 +16,7 @@ action = "attack_light"
name = ""
skill_animation = ExtResource("3_76yga")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_qfkyy")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("4_ahm2t")
sprite_frames = ExtResource("4_ahm2t")
animation_name = "long_air_attack02"

@ -16,6 +16,7 @@ action = "attack_light"
name = ""
skill_animation = ExtResource("3_1erk8")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_x3v4o")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("4_wrd60")
sprite_frames = ExtResource("4_wrd60")
animation_name = "long_air_attack03"

@ -5,7 +5,7 @@
[ext_resource type="Animation" uid="uid://daopmieibx3b7" path="res://resource/skill_animation/hero01_long_attack01.tres" id="2_6nbpq"]
[ext_resource type="PackedScene" uid="uid://b2h4pcmlii7dg" path="res://scene/effect/particle/particle_slash_normal.tscn" id="2_f3mmj"]
[ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="4_id85o"]
[ext_resource type="SpriteFrames" uid="uid://cndpnxtdh37ii" path="res://resource/animation/character/hero01_short_attack.aseprite" id="5_nk6nw"]
[ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="5_xel5p"]
[resource]
script = ExtResource("1_gik08")
@ -20,5 +20,5 @@ attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource(
attack_particle = ExtResource("2_f3mmj")
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("5_nk6nw")
animation_name = "short_attack01"
sprite_frames = ExtResource("5_xel5p")
animation_name = "long_attack01"

@ -16,6 +16,7 @@ action = "attack_light"
name = ""
skill_animation = ExtResource("2_jrgan")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_8fm1u")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("3_jidy7")
sprite_frames = ExtResource("3_jidy7")
animation_name = "long_attack02"

@ -16,6 +16,7 @@ action = "attack_light"
name = ""
skill_animation = ExtResource("2_ugt3f")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_7ai5j")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("3_sr2og")
sprite_frames = ExtResource("3_sr2og")
animation_name = "long_attack03"

@ -16,6 +16,7 @@ action = "attack_light"
name = ""
skill_animation = ExtResource("2_sam6s")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_7tise")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("3_w7h1m")
sprite_frames = ExtResource("3_w7h1m")
animation_name = "long_attack04"

@ -17,5 +17,5 @@ skill_animation = ExtResource("2_bdxlh")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([])
free_lock = true
refresh_animation = false
sprite_frams = ExtResource("2_uof6p")
sprite_frames = ExtResource("2_uof6p")
animation_name = "long_flash"

@ -16,6 +16,7 @@ action = "attack_heavy"
name = ""
skill_animation = ExtResource("2_ewts2")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_p5wrw")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("3_qwjfl")
sprite_frames = ExtResource("3_qwjfl")
animation_name = "long_skill01"

@ -16,6 +16,7 @@ action = "attack_heavy"
name = ""
skill_animation = ExtResource("3_b7s0y")
attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource("1_edtv7")])
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("4_rbnly")
sprite_frames = ExtResource("4_rbnly")
animation_name = "long_skill02"

@ -20,5 +20,5 @@ attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource(
attack_particle = ExtResource("2_vsxc2")
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("5_8vcrr")
sprite_frames = ExtResource("5_8vcrr")
animation_name = "short_attack01"

@ -20,5 +20,5 @@ attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource(
attack_particle = ExtResource("2_kal4c")
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("5_dxfya")
sprite_frames = ExtResource("5_dxfya")
animation_name = "short_attack02"

@ -20,5 +20,5 @@ attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource(
attack_particle = ExtResource("2_dp0ac")
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("5_40215")
sprite_frames = ExtResource("5_40215")
animation_name = "short_attack03"

@ -20,5 +20,5 @@ attack_list = Array[Resource("res://script/config/attack_cfg.gd")]([ExtResource(
attack_particle = ExtResource("2_hs5u3")
free_lock = false
refresh_animation = false
sprite_frams = ExtResource("5_owk7o")
sprite_frames = ExtResource("5_owk7o")
animation_name = "short_attack04"

@ -27,8 +27,4 @@ void fragment() {
}
ALBEDO = col.rgb;
ALPHA = 1.0;
}
void light() {
DIFFUSE_LIGHT = vec3(0, 0, 0);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

@ -4,7 +4,6 @@
[resource]
resource_name = "hero01_long_attack01"
length = 0.9
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
@ -32,76 +31,76 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("View:frame")
tracks/2/path = NodePath("Status:break_level")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8]
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 3, 4]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Status:break_level")
tracks/3/path = NodePath("Status:speed_up_rate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0.2, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 3, 4]
"values": [-0.5, -1.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Status:speed_up_rate")
tracks/4/path = NodePath("Status:skill_move_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.2, 0.3),
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [-0.5, -1.0]
"values": [2.0, 0.0]
}
tracks/5/type = "value"
tracks/5/type = "method"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Status:skill_move_speed")
tracks/5/path = NodePath("Battle")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.1, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [2.0, 0.0]
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack"
}]
}
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Battle")
tracks/6/path = NodePath("Effect")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0.2),
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"attack"
"method": &"cast_attack_particle"
}]
}
tracks/7/type = "method"
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Effect")
tracks/7/path = NodePath("View:frame")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_attack_particle"
}]
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}

@ -3,6 +3,7 @@ extends Node3D
#基本信息
const pixel_size : float = 0.02
const grid_pixel_size : float = 32
const animation_frame_rate : float = 0.1
#技能系统
const input_alive_time : float = 0.5

@ -68,7 +68,7 @@ func refresh_animation_lib():
if res is Animation:
var animation = res as Animation
var animation_name = Util.get_resource_name(animation)
print(animation_name)
print("refresh_animation_lib: ",animation_name)
animation_library.add_animation(animation_name,animation)
animation_library.animation_added.emit(animation_name)
@ -104,6 +104,57 @@ func refresh_mesh_library(path_list:Array):
mesh_library.set_item_preview(ids[i],previews[i])
ResourceSaver.save(mesh_library)
func refresh_all_animation_by_sprite_frames(sprite_frames:SpriteFrames):
var dir_path = "res://resource/skill_animation"
var dir = DirAccess.open(dir_path)
for file in dir.get_files():
var path = dir_path + "/" + file
var res = load(path)
if res is Animation:
var animation = res as Animation
var animation_name = Util.get_resource_name(animation)
var sprite_frames_track = animation.find_track(NodePath("View:sprite_frames"),Animation.TYPE_VALUE)
if sprite_frames_track < 0:
continue
var sprite_frames_track_key_count = animation.track_get_key_count(sprite_frames_track)
if sprite_frames_track_key_count == 0:
continue
var sprite_frames_value = animation.track_get_key_value(sprite_frames_track_key_count,0)
if sprite_frames_value != sprite_frames:
continue
refresh_animation_by_sprite_frames(path,sprite_frames,animation_name,animation)
print(animation_name)
func refresh_animation_by_sprite_frames(animation_path:String,sprite_frames:SpriteFrames,animation_name:String,animation:Animation):
if not sprite_frames.has_animation(animation_name):
print("动画不存在: ",animation_name)
return
var track_sprite_frames = animation.find_track(NodePath("View:sprite_frames"),Animation.TYPE_VALUE)
if track_sprite_frames < 0:
track_sprite_frames = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_sprite_frames,"View:sprite_frames")
animation.track_insert_key(track_sprite_frames,0,sprite_frames)
var track_animation = animation.find_track(NodePath("View:animation"),Animation.TYPE_VALUE)
if track_animation < 0:
track_animation = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_animation,"View:animation")
animation.track_insert_key(track_animation,0,animation_name)
var track_frame = animation.find_track(NodePath("View:frame"),Animation.TYPE_VALUE)
if track_frame >= 0:
animation.remove_track(track_frame)
track_frame = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_frame,"View:frame")
var animation_speed = Setting.animation_frame_rate
var animation_frame_count = sprite_frames.get_frame_count(animation_name)
animation.length = animation_speed*animation_frame_count
for i in range(0,animation_frame_count):
var time = i * animation_speed
animation.track_insert_key(track_frame,time,i)
print("refresh_animation: ",animation_name ,"(",animation_frame_count, " frames)")
ResourceSaver.save(animation,animation_path)
func get_all_player_skill():
var ret = []
var dir_path = "res://config/player_skill"

@ -3,6 +3,7 @@ class_name Battle
@onready var character = (get_owner() as Character)
@onready var status = (%Status as Status)
@onready var skill = (%Skill as Skill)
class HitInfo:
var from : int
@ -29,8 +30,9 @@ func attack():
var attack_height = attack.height
var attack_size = Util.grid_vector2(attack.size)
var attack_radius = attack.radius
var offset_xz = attack_dir * Util.grid_float(attack.offset.x)
var offset_xz = attack_dir * Util.grid_float(attack.offset.x)
pos += Vector3(offset_xz.x,Util.grid_float(attack.offset.y),offset_xz.y)
var is_hit = false
for enemy in enemy_list:
var target_pos = enemy.pos()
var target_radius = enemy.radius()
@ -42,6 +44,9 @@ func attack():
hit_info.dir = attack_dir
hit_info.attack = attack
hit_info_list.append(hit_info)
is_hit = true
if not is_hit:
skill.on_attack_miss()
func add_attack(from:int,dir:Vector2,attack:AttackCfg):
var hit_info = HitInfo.new()

@ -52,5 +52,11 @@ func cancel_skill():
effect.release_effect()
view.reset()
func on_attack_miss():
# 攻击未命中时跳帧
var position_int = int(current_animation_position / Setting.animation_frame_rate)
var position_next_frame = (position_int + 1) * Setting.animation_frame_rate
seek(position_next_frame,true)
func _on_animation_finished(_anim_name):
cancel_skill()

@ -2,17 +2,17 @@
extends Resource
class_name AnimationSelectCfg
@export var sprite_frams : SpriteFrames :
@export var sprite_frames : SpriteFrames :
set(value):
sprite_frams = value
sprite_frames = value
notify_property_list_changed()
var animation_name : String
func _get_property_list():
var hint_string = ["none"]
if sprite_frams:
hint_string = ",".join(sprite_frams.get_animation_names())
if sprite_frames:
hint_string = ",".join(sprite_frames.get_animation_names())
var properties = []
properties.append({

@ -16,43 +16,25 @@ class_name SkillCfg
func check_animation():
var res_name = Util.get_resource_name(self)
var skill_animation_path = "res://resource/skill_animation/%s.tres" %res_name
if !ResourceLoader.exists(skill_animation_path):
if !create_animation(res_name,skill_animation_path):
return
if !create_animation(res_name,skill_animation_path):
return
skill_animation = load(skill_animation_path)
func create_animation(res_name,path) -> bool:
if sprite_frams == null:
if sprite_frames == null:
print("未设置技能动画资源")
return false
if animation_name == "":
print("未设置技能动画名")
return false
print(animation_name)
if !sprite_frams.has_animation(animation_name):
if !sprite_frames.has_animation(animation_name):
print("技能动画名不存在")
return false
var animation = Animation.new()
animation.resource_name = res_name
var track_sprite_frames = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_sprite_frames,"View:sprite_frames")
animation.track_insert_key(track_sprite_frames,0,sprite_frams)
var track_animation = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_animation,"View:animation")
animation.track_insert_key(track_animation,0,animation_name)
var track_frame = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_frame,"View:frame")
var animation_speed = 0.1
var animation_frame_count = sprite_frams.get_frame_count(animation_name)
animation.length = animation_speed*animation_frame_count
for i in range(0,animation_frame_count):
var time = i * animation_speed
animation.track_insert_key(track_frame,time,i)
ResourceSaver.save(animation,path)
var animation = ResourceLoader.load(path) as Animation
if not animation:
animation = Animation.new()
animation.resource_name = res_name
Util.refresh_animation_by_sprite_frames(path,sprite_frames,animation_name,animation)
Util.refresh_animation_lib()
return true

Loading…
Cancel
Save