From d50b44a096347d17de9d3722c0df9868042bb777 Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Mon, 12 Feb 2024 07:03:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=8D=E7=A7=BB=E6=8A=80=E8=83=BD=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/attack_box/box_large.tres | 3 +- config/attack_box/box_normal.tres | 3 +- .../hero01_long_air_attack01.tres | 6 +- .../hero01_long_air_attack02.tres | 6 +- .../hero01_long_air_attack03.tres | 4 +- .../hero01_long_attack02.tres | 6 +- .../hero01_long_attack03.tres | 7 ++- .../hero01_long_attack04.tres | 6 +- .../hero01_long_skill01.tres | 6 +- .../hero01_long_skill02.tres | 4 +- render/process_material/slash_normal.tres | 5 +- render/shader/effect_skew1.gdshader | 1 - render/shader/effect_slash.gdshader | 13 +++- render/texture/particle/mask/mask9.png | Bin 0 -> 20929 bytes render/texture/particle/mask/mask9.png.import | 34 ++++++++++ scene/character/character.tscn | 30 +++++++-- scene/character/player.tscn | 2 +- scene/effect/particle/_particle_fist1.tscn | 59 ++++++++++++++++++ scene/effect/particle/_particle_slash1.tscn | 56 +++++++++-------- .../effect/particle/hero01_long_attack04.tscn | 2 +- script/character/character.gd | 5 +- script/character/effect.gd | 1 + script/character/hitbox.gd | 36 +++++++++++ script/character/move.gd | 8 +-- script/character/status.gd | 2 + 25 files changed, 247 insertions(+), 58 deletions(-) create mode 100644 render/texture/particle/mask/mask9.png create mode 100644 render/texture/particle/mask/mask9.png.import create mode 100644 scene/effect/particle/_particle_fist1.tscn create mode 100644 script/character/hitbox.gd diff --git a/config/attack_box/box_large.tres b/config/attack_box/box_large.tres index 1063732..14cb85e 100644 --- a/config/attack_box/box_large.tres +++ b/config/attack_box/box_large.tres @@ -3,8 +3,9 @@ [ext_resource type="Script" path="res://script/config/attack_box_cfg.gd" id="1_661yg"] [sub_resource type="BoxShape3D" id="BoxShape3D_87jhu"] +size = Vector3(2, 2, 2) [resource] script = ExtResource("1_661yg") shape = SubResource("BoxShape3D_87jhu") -offset = Vector2(0.5, 0.5) +offset = Vector2(1, 1) diff --git a/config/attack_box/box_normal.tres b/config/attack_box/box_normal.tres index 1359b03..1afba74 100644 --- a/config/attack_box/box_normal.tres +++ b/config/attack_box/box_normal.tres @@ -3,8 +3,9 @@ [ext_resource type="Script" path="res://script/config/attack_box_cfg.gd" id="1_d4mqn"] [sub_resource type="BoxShape3D" id="BoxShape3D_87jhu"] +size = Vector3(1.6, 1.2, 1.2) [resource] script = ExtResource("1_d4mqn") shape = SubResource("BoxShape3D_87jhu") -offset = Vector2(0.5, 0.5) +offset = Vector2(0.8, 0.6) diff --git a/config/skill_player_weapon/hero01_long_air_attack01.tres b/config/skill_player_weapon/hero01_long_air_attack01.tres index bf294d4..16f5a54 100644 --- a/config/skill_player_weapon/hero01_long_air_attack01.tres +++ b/config/skill_player_weapon/hero01_long_air_attack01.tres @@ -1,7 +1,8 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://rib7hj11oscr"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://rib7hj11oscr"] -[ext_resource type="Resource" uid="uid://bsqk3q6mccllg" path="res://config/attack/sharp_normal_hit.tres" id="1_mxlqc"] +[ext_resource type="Resource" uid="uid://d3mcp8sf6qbmd" path="res://config/attack/sharp_normal_hit.tres" id="1_mxlqc"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="2_hh5ph"] +[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_nk4i8"] [ext_resource type="Animation" uid="uid://p8l0puqxrkwh" path="res://resource/skill_animation/hero01_long_air_attack01.tres" id="3_3pp8a"] [ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="4_q0bln"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="5_s1k6m"] @@ -17,6 +18,7 @@ name = "" skill_animation = ExtResource("3_3pp8a") free_lock = false attack1 = ExtResource("1_mxlqc") +attack1_box = ExtResource("2_nk4i8") refresh_animation = false sprite_frames = ExtResource("4_q0bln") animation_name = "long_air_attack01" diff --git a/config/skill_player_weapon/hero01_long_air_attack02.tres b/config/skill_player_weapon/hero01_long_air_attack02.tres index a220647..93731e0 100644 --- a/config/skill_player_weapon/hero01_long_air_attack02.tres +++ b/config/skill_player_weapon/hero01_long_air_attack02.tres @@ -1,7 +1,8 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://c675lckg7ly25"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://c675lckg7ly25"] -[ext_resource type="Resource" uid="uid://bsqk3q6mccllg" path="res://config/attack/sharp_normal_hit.tres" id="1_qfkyy"] +[ext_resource type="Resource" uid="uid://d3mcp8sf6qbmd" path="res://config/attack/sharp_normal_hit.tres" id="1_qfkyy"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="2_gjjhv"] +[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_xxivk"] [ext_resource type="Animation" uid="uid://cjfy6ia1ukyiu" path="res://resource/skill_animation/hero01_long_air_attack02.tres" id="3_76yga"] [ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="4_ahm2t"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="5_nkec4"] @@ -17,6 +18,7 @@ name = "" skill_animation = ExtResource("3_76yga") free_lock = false attack1 = ExtResource("1_qfkyy") +attack1_box = ExtResource("2_xxivk") refresh_animation = false sprite_frames = ExtResource("4_ahm2t") animation_name = "long_air_attack02" diff --git a/config/skill_player_weapon/hero01_long_air_attack03.tres b/config/skill_player_weapon/hero01_long_air_attack03.tres index 07fc6d2..806f001 100644 --- a/config/skill_player_weapon/hero01_long_air_attack03.tres +++ b/config/skill_player_weapon/hero01_long_air_attack03.tres @@ -1,7 +1,8 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://b705py5rht5i3"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://b705py5rht5i3"] [ext_resource type="Resource" uid="uid://dj7tchh0202t2" path="res://config/attack/sharp_mid_hit_down.tres" id="1_rccpt"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="2_0x7hh"] +[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_2wu8a"] [ext_resource type="Animation" uid="uid://bh5s2t3cbobpp" path="res://resource/skill_animation/hero01_long_air_attack03.tres" id="3_1erk8"] [ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="4_wrd60"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="5_u3vas"] @@ -17,6 +18,7 @@ name = "" skill_animation = ExtResource("3_1erk8") free_lock = false attack1 = ExtResource("1_rccpt") +attack1_box = ExtResource("2_2wu8a") refresh_animation = false sprite_frames = ExtResource("4_wrd60") animation_name = "long_air_attack03" diff --git a/config/skill_player_weapon/hero01_long_attack02.tres b/config/skill_player_weapon/hero01_long_attack02.tres index c1e357e..320c0fe 100644 --- a/config/skill_player_weapon/hero01_long_attack02.tres +++ b/config/skill_player_weapon/hero01_long_attack02.tres @@ -1,8 +1,9 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://kpr8aqmnyv2k"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://kpr8aqmnyv2k"] -[ext_resource type="Resource" uid="uid://bsqk3q6mccllg" path="res://config/attack/sharp_normal_hit.tres" id="1_8fm1u"] +[ext_resource type="Resource" uid="uid://d3mcp8sf6qbmd" path="res://config/attack/sharp_normal_hit.tres" id="1_8fm1u"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="1_e0fqi"] [ext_resource type="Animation" uid="uid://bf6jaraltouun" path="res://resource/skill_animation/hero01_long_attack02.tres" id="2_jrgan"] +[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_s06n4"] [ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="3_jidy7"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="4_novna"] @@ -17,6 +18,7 @@ name = "" skill_animation = ExtResource("2_jrgan") free_lock = false attack1 = ExtResource("1_8fm1u") +attack1_box = ExtResource("2_s06n4") refresh_animation = false sprite_frames = ExtResource("3_jidy7") animation_name = "long_attack02" diff --git a/config/skill_player_weapon/hero01_long_attack03.tres b/config/skill_player_weapon/hero01_long_attack03.tres index a5363fc..c50e88a 100644 --- a/config/skill_player_weapon/hero01_long_attack03.tres +++ b/config/skill_player_weapon/hero01_long_attack03.tres @@ -1,8 +1,9 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://qele60lk54e1"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://5ufjc1dso0y8"] -[ext_resource type="Resource" uid="uid://ckeuv5lhfk2s0" path="res://config/attack/sharp_normal_hit_back.tres" id="1_7ai5j"] +[ext_resource type="Resource" uid="uid://btg40rn2f36c2" path="res://config/attack/sharp_normal_hit_back.tres" id="1_7ai5j"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="1_uaib7"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="2_8uqiw"] +[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_j0l20"] [ext_resource type="Animation" uid="uid://c8yueqe7rjn60" path="res://resource/skill_animation/hero01_long_attack03.tres" id="2_ugt3f"] [ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="3_sr2og"] @@ -17,7 +18,9 @@ name = "" skill_animation = ExtResource("2_ugt3f") free_lock = false attack1 = ExtResource("1_7ai5j") +attack1_box = ExtResource("2_j0l20") attack2 = ExtResource("1_7ai5j") +attack2_box = ExtResource("2_j0l20") refresh_animation = false sprite_frames = ExtResource("3_sr2og") animation_name = "long_attack03" diff --git a/config/skill_player_weapon/hero01_long_attack04.tres b/config/skill_player_weapon/hero01_long_attack04.tres index 06645b2..e9dcb23 100644 --- a/config/skill_player_weapon/hero01_long_attack04.tres +++ b/config/skill_player_weapon/hero01_long_attack04.tres @@ -1,10 +1,12 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://dvdr5vd1vbe12"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=9 format=3 uid="uid://dvdr5vd1vbe12"] [ext_resource type="Resource" uid="uid://bv4uoey1liqoq" path="res://config/attack/sharp_heavy_hit_blow.tres" id="1_8ipjq"] [ext_resource type="Resource" uid="uid://c87w2x5qfqdns" path="res://config/attack/blunt_normal_hit_back.tres" id="1_44ai1"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="1_xsxbs"] +[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_5jvmg"] [ext_resource type="Animation" uid="uid://dk1o3gqhjmuvh" path="res://resource/skill_animation/hero01_long_attack04.tres" id="2_sam6s"] [ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="3_w7h1m"] +[ext_resource type="Resource" uid="uid://bnfnjdw0tms3h" path="res://config/attack_box/box_large.tres" id="4_7j0pm"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="4_plyre"] [resource] @@ -18,7 +20,9 @@ name = "" skill_animation = ExtResource("2_sam6s") free_lock = false attack1 = ExtResource("1_44ai1") +attack1_box = ExtResource("2_5jvmg") attack2 = ExtResource("1_8ipjq") +attack2_box = ExtResource("4_7j0pm") refresh_animation = false sprite_frames = ExtResource("3_w7h1m") animation_name = "long_attack04" diff --git a/config/skill_player_weapon/hero01_long_skill01.tres b/config/skill_player_weapon/hero01_long_skill01.tres index de33bf9..73182c0 100644 --- a/config/skill_player_weapon/hero01_long_skill01.tres +++ b/config/skill_player_weapon/hero01_long_skill01.tres @@ -1,8 +1,9 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://cwqbhrv8bd5vn"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://cwqbhrv8bd5vn"] -[ext_resource type="Resource" uid="uid://cae3dxpuqfcux" path="res://config/attack/sharp_mid_hit.tres" id="1_7yroh"] +[ext_resource type="Resource" uid="uid://qmivx7ntfrki" path="res://config/attack/sharp_mid_hit.tres" id="1_7yroh"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="1_ud5ph"] [ext_resource type="Animation" uid="uid://bjnkrte7660pt" path="res://resource/skill_animation/hero01_long_skill01.tres" id="2_ewts2"] +[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_xyemx"] [ext_resource type="SpriteFrames" uid="uid://dhfqj1dxldqao" path="res://resource/animation/character/hero01_long_skill01.aseprite" id="3_qwjfl"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="4_3bf64"] @@ -17,6 +18,7 @@ name = "" skill_animation = ExtResource("2_ewts2") free_lock = false attack1 = ExtResource("1_7yroh") +attack1_box = ExtResource("2_xyemx") refresh_animation = false sprite_frames = ExtResource("3_qwjfl") animation_name = "long_skill01" diff --git a/config/skill_player_weapon/hero01_long_skill02.tres b/config/skill_player_weapon/hero01_long_skill02.tres index 9eb0a0d..1ae39aa 100644 --- a/config/skill_player_weapon/hero01_long_skill02.tres +++ b/config/skill_player_weapon/hero01_long_skill02.tres @@ -1,7 +1,8 @@ -[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=6 format=3 uid="uid://vvftj1wk88xj"] +[gd_resource type="Resource" script_class="SkillPlayerCfg" load_steps=7 format=3 uid="uid://vvftj1wk88xj"] [ext_resource type="Resource" uid="uid://ckbf40c75bfqf" path="res://config/attack/sharp_normal_hit_up.tres" id="1_edtv7"] [ext_resource type="Script" path="res://script/config/player_skill_cfg.gd" id="2_1xtt1"] +[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_tsg38"] [ext_resource type="Animation" uid="uid://iprcbf277rf4" path="res://resource/skill_animation/hero01_long_skill02.tres" id="3_b7s0y"] [ext_resource type="SpriteFrames" uid="uid://dhfqj1dxldqao" path="res://resource/animation/character/hero01_long_skill01.aseprite" id="4_rbnly"] [ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="5_u5xo6"] @@ -17,6 +18,7 @@ name = "" skill_animation = ExtResource("3_b7s0y") free_lock = false attack1 = ExtResource("1_edtv7") +attack1_box = ExtResource("2_tsg38") refresh_animation = false sprite_frames = ExtResource("4_rbnly") animation_name = "long_skill02" diff --git a/render/process_material/slash_normal.tres b/render/process_material/slash_normal.tres index 2b353c0..7289807 100644 --- a/render/process_material/slash_normal.tres +++ b/render/process_material/slash_normal.tres @@ -1,8 +1,8 @@ [gd_resource type="ParticleProcessMaterial" load_steps=5 format=3 uid="uid://dubkkji6sm8on"] [sub_resource type="Gradient" id="Gradient_fjosh"] -offsets = PackedFloat32Array(0, 0.0894942, 0.684825, 1) -colors = PackedColorArray(0.278431, 0.65098, 1, 0, 0.278431, 0.65098, 1, 1, 0.278431, 0.65098, 1, 0.941176, 0.278431, 0.65098, 1, 0) +offsets = PackedFloat32Array(0, 0.239796, 0.684825, 1) +colors = PackedColorArray(1, 1, 1, 1, 0.278431, 0.65098, 1, 1, 0.278431, 0.65098, 1, 0.941176, 0.278431, 0.65098, 1, 0) [sub_resource type="GradientTexture1D" id="GradientTexture1D_cypke"] gradient = SubResource("Gradient_fjosh") @@ -23,6 +23,5 @@ spread = 0.0 angular_velocity_min = -720.0 angular_velocity_max = -720.0 gravity = Vector3(0, 0, 0) -tangential_accel_min = -100.0 scale_curve = SubResource("CurveTexture_81bpg") color_ramp = SubResource("GradientTexture1D_cypke") diff --git a/render/shader/effect_skew1.gdshader b/render/shader/effect_skew1.gdshader index 5f38029..c164c3e 100644 --- a/render/shader/effect_skew1.gdshader +++ b/render/shader/effect_skew1.gdshader @@ -10,7 +10,6 @@ uniform sampler2D screenTexture : hint_screen_texture; void fragment() { - vec2 uv2 = UV - 1.0 * vec2(mod(TIME, 2.0) - 1.0, 0); vec4 col_mask = texture(tex_mask, UV); float noiseValueX = (texture(noise, UV + (TIME * speedView)).r * 2.0) - 1.0; // Range: -1.0 to 1.0 diff --git a/render/shader/effect_slash.gdshader b/render/shader/effect_slash.gdshader index ed31e59..b39a034 100644 --- a/render/shader/effect_slash.gdshader +++ b/render/shader/effect_slash.gdshader @@ -4,12 +4,21 @@ render_mode blend_add,unshaded,depth_test_disabled; uniform sampler2D tex_main : source_color; uniform sampler2D tex_noise : source_color; uniform sampler2D tex_mask : source_color; +uniform sampler2D tex_mask2 : source_color; +uniform sampler2D screenTexture : hint_screen_texture; void fragment() { vec4 col_main = texture(tex_main, UV); vec4 col_noise = texture(tex_noise, UV - 0.5 * vec2(mod(TIME, 2.0) - 1.0, 0)); vec4 col_mask = texture(tex_mask, UV); vec4 col = col_mask * COLOR * 1.0 + (col_noise + col_main) * COLOR; - ALBEDO = col.rgb; - ALPHA = col_mask.r * COLOR.a; + + vec4 col_mask2 = texture(tex_mask2, UV); + float noiseValueX = col_noise.r; + float noiseValueY = col_noise.r; + vec2 noiseDistort = vec2(noiseValueX, noiseValueY) * 0.1 * col_mask2.r; + vec3 distortedScreenTexture = vec3(texture(screenTexture, SCREEN_UV + noiseDistort).rgb); + + ALBEDO = (distortedScreenTexture *4.0 + col.rgb * col_mask.r) * COLOR.rgb; + ALPHA = col_mask2.r * COLOR.a; } diff --git a/render/texture/particle/mask/mask9.png b/render/texture/particle/mask/mask9.png new file mode 100644 index 0000000000000000000000000000000000000000..7435b7d9a1904cbbdc7c1259fa0cb07ec99a542d GIT binary patch literal 20929 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: + move_velocity *= (1-status.speed_down_push_rate) if move_velocity.length() == 0: move_velocity = Vector2(character.velocity.x,character.velocity.z); if status.is_on_floor: move_velocity = Util.vector_reduce(move_velocity,Setting.drag_ground*delta) else: move_velocity = Util.vector_reduce(move_velocity,Setting.drag_air*delta) - else: - move_velocity.x = move_velocity.x - move_velocity.y = move_velocity.y character.velocity.x = move_velocity.x character.velocity.z = move_velocity.y - + status.speed_xz = Vector2(character.velocity.x,character.velocity.z).length() if status.is_free_turn and status.move_dir.x != 0: status.is_right = status.move_dir.x > 0 diff --git a/script/character/status.gd b/script/character/status.gd index c78d958..1a394b5 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -37,7 +37,9 @@ class_name Status @export_category("移动状态") @export var move_dir : Vector2 #移动方向 +@export var speed_dir : Vector2 #速度方向 @export var velocity_change : Vector3 #一帧内速度变化值 +@export var speed_down_push_rate : float #来自软阻挡的速度减少比率 @export var speed_up_rate : float #移动速度比率 @export var speed_xz : float #水平移动速度 @export var speed_y : float #竖直移动速度