From 0bc33aec98103f083893a2cfbf889809eb9a6c2c Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Sat, 14 Oct 2023 03:35:54 +0800 Subject: [PATCH] =?UTF-8?q?buff=E7=B3=BB=E7=BB=9F=20=E5=8F=97=E5=87=BB?= =?UTF-8?q?=E5=8A=A8=E7=94=BB=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../saved_state.json | 7 ++- config/attack/normal.tres | 4 +- config/character/monster02.tres | 12 +++-- .../skill_animation/hero01_long_attack01.tres | 7 +-- .../skill_animation/hero01_long_attack02.tres | 14 ++++++ .../skill_animation/hero01_long_attack03.tres | 17 +++++++ .../skill_animation/hero01_long_attack04.tres | 14 ++++++ .../skill_animation/hero01_long_skill01.tres | 14 ++++++ scene/character/character.tscn | 13 +++-- scene/character/monster.tscn | 6 +-- scene/character/player.tscn | 23 ++++----- scene/launcher.tscn | 4 +- script/character/battle.gd | 24 +++++++-- script/character/buff.gd | 49 +++++++++++++++++++ script/character/character.gd | 14 +++++- script/character/move.gd | 3 +- script/character/status.gd | 11 +++++ script/character/view.gd | 7 ++- script/manager/character_manager.gd | 8 ++- script/manager/game_manager.gd | 4 +- 20 files changed, 210 insertions(+), 45 deletions(-) create mode 100644 script/character/buff.gd diff --git a/addons/resources_spreadsheet_view/saved_state.json b/addons/resources_spreadsheet_view/saved_state.json index b0d0679..cd0ffe9 100644 --- a/addons/resources_spreadsheet_view/saved_state.json +++ b/addons/resources_spreadsheet_view/saved_state.json @@ -1,5 +1,9 @@ { "hidden_columns": { + "res://config/attack/": { + "resource_local_to_scene": true, + "resource_name": true + }, "res://config/character/": { "resource_local_to_scene": true, "resource_name": true @@ -19,7 +23,8 @@ "recent_paths": [ "res://example/Items/items/", "res://config/character/", - "res://config/player_skill/" + "res://config/player_skill/", + "res://config/attack/" ], "table_functions": { "filter": [ diff --git a/config/attack/normal.tres b/config/attack/normal.tres index 22de861..8dfe800 100644 --- a/config/attack/normal.tres +++ b/config/attack/normal.tres @@ -6,8 +6,8 @@ script = ExtResource("1_wn06b") damage_rate = 1.0 break_level = 0 -hit_back_speed = 0.0 -hit_back_duration = 0.0 +hit_back_speed = 2.0 +hit_back_duration = 0.05 hit_up_speed = 0.0 hit_up_duration = 0.0 pause_time = 0.0 diff --git a/config/character/monster02.tres b/config/character/monster02.tres index b523f64..6d121f9 100644 --- a/config/character/monster02.tres +++ b/config/character/monster02.tres @@ -1,14 +1,16 @@ -[gd_resource type="Resource" script_class="CharacterCfg" load_steps=3 format=3 uid="uid://dmfh54jffhx28"] +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://dmfh54jffhx28"] +[ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_hjl2t"] [ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_wkjce"] [ext_resource type="SpriteFrames" uid="uid://criqnimi5dara" path="res://resource/animation/character/monster02_move.aseprite" id="2_h60bf"] [resource] script = ExtResource("1_wkjce") name = "monster02" -type = 0 +type = 1 sprite_frames = ExtResource("2_h60bf") -sprite_harf_height = 0 -sprite_width = 0 -hp_max = 0.0 +sprite_harf_height = 26 +sprite_width = 16 +move = ExtResource("1_hjl2t") +hp_max = 100.0 shield_max = 0.0 diff --git a/resource/skill_animation/hero01_long_attack01.tres b/resource/skill_animation/hero01_long_attack01.tres index 9fa884c..149aaa9 100644 --- a/resource/skill_animation/hero01_long_attack01.tres +++ b/resource/skill_animation/hero01_long_attack01.tres @@ -84,13 +84,10 @@ tracks/6/path = NodePath("Battle") tracks/6/interp = 1 tracks/6/loop_wrap = true tracks/6/keys = { -"times": PackedFloat32Array(0.2, 0.3), -"transitions": PackedFloat32Array(1, 1), +"times": PackedFloat32Array(0.2), +"transitions": PackedFloat32Array(1), "values": [{ "args": [], "method": &"attack" -}, { -"args": [], -"method": &"attack" }] } diff --git a/resource/skill_animation/hero01_long_attack02.tres b/resource/skill_animation/hero01_long_attack02.tres index da9a5ef..c2f166e 100644 --- a/resource/skill_animation/hero01_long_attack02.tres +++ b/resource/skill_animation/hero01_long_attack02.tres @@ -77,3 +77,17 @@ tracks/5/keys = { "update": 1, "values": [1.0, 0.0] } +tracks/6/type = "method" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Battle") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.2), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"attack" +}] +} diff --git a/resource/skill_animation/hero01_long_attack03.tres b/resource/skill_animation/hero01_long_attack03.tres index d7990ff..0f8784a 100644 --- a/resource/skill_animation/hero01_long_attack03.tres +++ b/resource/skill_animation/hero01_long_attack03.tres @@ -77,3 +77,20 @@ tracks/5/keys = { "update": 1, "values": [1.0, 0.0, 1.0, 0.0] } +tracks/6/type = "method" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Battle") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.2, 0.5), +"transitions": PackedFloat32Array(1, 1), +"values": [{ +"args": [], +"method": &"attack" +}, { +"args": [], +"method": &"attack" +}] +} diff --git a/resource/skill_animation/hero01_long_attack04.tres b/resource/skill_animation/hero01_long_attack04.tres index e5aa613..a24dc3a 100644 --- a/resource/skill_animation/hero01_long_attack04.tres +++ b/resource/skill_animation/hero01_long_attack04.tres @@ -77,3 +77,17 @@ tracks/5/keys = { "update": 1, "values": [0.5, 1.0, 0.0] } +tracks/6/type = "method" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Battle") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.5), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"attack" +}] +} diff --git a/resource/skill_animation/hero01_long_skill01.tres b/resource/skill_animation/hero01_long_skill01.tres index cdee492..756ef38 100644 --- a/resource/skill_animation/hero01_long_skill01.tres +++ b/resource/skill_animation/hero01_long_skill01.tres @@ -76,3 +76,17 @@ tracks/5/keys = { "update": 1, "values": [4.0, 0.0] } +tracks/6/type = "method" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Battle") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.4), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"attack" +}] +} diff --git a/scene/character/character.tscn b/scene/character/character.tscn index 2becbb6..5ce2040 100644 --- a/scene/character/character.tscn +++ b/scene/character/character.tscn @@ -1,13 +1,14 @@ -[gd_scene load_steps=10 format=3 uid="uid://vnkcr04hevna"] +[gd_scene load_steps=11 format=3 uid="uid://vnkcr04hevna"] [ext_resource type="Script" path="res://script/character/character.gd" id="1_tonbs"] [ext_resource type="Script" path="res://script/character/status.gd" id="2_txdip"] -[ext_resource type="SpriteFrames" uid="uid://7swf8owxd63i" path="res://resource/animation/character/hero01_long_attack.aseprite" id="3_safrr"] +[ext_resource type="SpriteFrames" uid="uid://0yuryfn6dc2v" path="res://resource/animation/character/hero01_long_skill01.aseprite" id="3_vw4qy"] [ext_resource type="Script" path="res://script/character/move.gd" id="4_66r53"] [ext_resource type="Script" path="res://script/character/view.gd" id="4_vijjv"] [ext_resource type="Script" path="res://script/character/skill.gd" id="6_h4xqy"] [ext_resource type="AnimationLibrary" uid="uid://croik07a1qko5" path="res://resource/skill_animation_library/animation_library.tres" id="6_pakq5"] [ext_resource type="Script" path="res://script/character/battle.gd" id="8_w84sf"] +[ext_resource type="Script" path="res://script/character/buff.gd" id="9_jlnhy"] [sub_resource type="BoxShape3D" id="BoxShape3D_ty8lx"] @@ -29,8 +30,8 @@ unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 1.414, 0, 0, 0, 1, 0, 0, 0) alpha_cut = 2 texture_filter = 0 -sprite_frames = ExtResource("3_safrr") -animation = &"long_attack01" +sprite_frames = ExtResource("3_vw4qy") +animation = &"long_skill01" script = ExtResource("4_vijjv") metadata/_aseprite_wizard_config_ = { "layer": "", @@ -57,5 +58,9 @@ script = ExtResource("6_h4xqy") unique_name_in_owner = true script = ExtResource("8_w84sf") +[node name="Buff" type="Node3D" parent="."] +unique_name_in_owner = true +script = ExtResource("9_jlnhy") + [connection signal="animation_finished" from="View" to="View" method="_on_animation_finished"] [connection signal="animation_finished" from="Skill" to="Skill" method="_on_animation_finished"] diff --git a/scene/character/monster.tscn b/scene/character/monster.tscn index 70e332e..bc23766 100644 --- a/scene/character/monster.tscn +++ b/scene/character/monster.tscn @@ -1,5 +1,5 @@ -[gd_scene load_steps=2 format=3 uid="uid://b67jri5xptx65"] +[gd_scene load_steps=2 format=3 uid="uid://c0sqb3w2tjjym"] -[ext_resource type="PackedScene" uid="uid://vnkcr04hevna" path="res://scene/character/character.tscn" id="1_c5mtw"] +[ext_resource type="PackedScene" uid="uid://vnkcr04hevna" path="res://scene/character/character.tscn" id="1_eshlr"] -[node name="Character" instance=ExtResource("1_c5mtw")] +[node name="Character" instance=ExtResource("1_eshlr")] diff --git a/scene/character/player.tscn b/scene/character/player.tscn index 3781e03..5ee5ec2 100644 --- a/scene/character/player.tscn +++ b/scene/character/player.tscn @@ -1,18 +1,15 @@ -[gd_scene load_steps=4 format=3 uid="uid://uvv575nd76ji"] +[gd_scene load_steps=4 format=3 uid="uid://bw48w3ehhjvg7"] -[ext_resource type="PackedScene" uid="uid://vnkcr04hevna" path="res://scene/character/character.tscn" id="1_bny0p"] -[ext_resource type="Script" path="res://script/character/player/combo.gd" id="2_6xb1m"] -[ext_resource type="Script" path="res://script/character/player/player_input.gd" id="2_d5j0i"] +[ext_resource type="PackedScene" uid="uid://vnkcr04hevna" path="res://scene/character/character.tscn" id="1_pot50"] +[ext_resource type="Script" path="res://script/character/player/combo.gd" id="2_i44w8"] +[ext_resource type="Script" path="res://script/character/player/player_input.gd" id="3_n07go"] -[node name="Character" instance=ExtResource("1_bny0p")] +[node name="Character" instance=ExtResource("1_pot50")] -[node name="Status" parent="." index="1"] -speed_up_rate = 0.0 -skill_move_speed = 4.0 - -[node name="Combo" type="Node3D" parent="." index="6"] +[node name="Combo" type="Node3D" parent="." index="7"] unique_name_in_owner = true -script = ExtResource("2_6xb1m") +script = ExtResource("2_i44w8") -[node name="PlayerInput" type="Node3D" parent="." index="7"] -script = ExtResource("2_d5j0i") +[node name="PlayerInput" type="Node3D" parent="." index="8"] +unique_name_in_owner = true +script = ExtResource("3_n07go") diff --git a/scene/launcher.tscn b/scene/launcher.tscn index ed75637..457c145 100644 --- a/scene/launcher.tscn +++ b/scene/launcher.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://script/manager/game_manager.gd" id="1_q2t80"] [ext_resource type="ArrayMesh" uid="uid://cap7t5iwpjpi2" path="res://resource/level/levelground0000.vox" id="1_u51ir"] [ext_resource type="Resource" uid="uid://bjvrih37ni5nx" path="res://config/character/hero01.tres" id="2_m8pa4"] -[ext_resource type="Resource" uid="uid://b1gf2jimihmc7" path="res://config/character/monster01.tres" id="3_awqf6"] +[ext_resource type="Resource" uid="uid://dmfh54jffhx28" path="res://config/character/monster02.tres" id="3_t5dvy"] [ext_resource type="Script" path="res://script/manager/character_manager.gd" id="4_oonkb"] [ext_resource type="Script" path="res://script/editor_tool/editor_tool.gd" id="5_n3qhi"] @@ -15,7 +15,7 @@ data = PackedVector3Array(-6.4, 0, -6.4, -3.2, 0, -6.4, -3.2, 0, 6.4, -3.2, 0, 6 [node name="GameManager" type="Node3D" parent="."] script = ExtResource("1_q2t80") player = ExtResource("2_m8pa4") -test_monster = ExtResource("3_awqf6") +test_monster = ExtResource("3_t5dvy") [node name="LevelManager" type="Node3D" parent="GameManager"] unique_name_in_owner = true diff --git a/script/character/battle.gd b/script/character/battle.gd index 9491c74..93716f3 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -5,7 +5,7 @@ class_name Battle @onready var status = (%Status as Status) class HitInfo: - var form : int + var from : int var to : int var dir : Vector2 var attack : AttackCfg @@ -13,9 +13,12 @@ class HitInfo: var hit_info_list = [] #命中信息 func attack(): + if !status.skill_cfg: + return var attack_list = status.skill_cfg.attack_list if !attack_list: print("未配置技能攻击",status.skill_cfg) + return var attack_index = status.skill_attack_index if attack_index >= len(attack_list): attack_index = len(attack_list) - 1 @@ -27,7 +30,7 @@ func attack(): #test if (distance < 1): var hit_info = HitInfo.new() - hit_info.form = character.id() + hit_info.from = character.id() hit_info.to = enemy.id() hit_info.dir = status.skill_dir hit_info.attack = attack @@ -39,4 +42,19 @@ func _process(delta): hit_info_list.clear() func settle(hit_info:HitInfo): - print(hit_info.attack) + var character_from = character.manager().get_character(hit_info.from) + var character_to = character.manager().get_character(hit_info.to) + if !character_from or !character_to: + return + + var attack = hit_info.attack + character_to.set_view_trigger("hit") + character_to.cancel_skill() + character_to.set_hit_move(hit_info.dir,attack.hit_back_speed,attack.hit_up_speed) + character_to.add_buff("hit_back",attack.hit_back_duration) + character_to.add_buff("hit_up",attack.hit_up_duration) + + character_to.add_buff("stagger",1) + character_to.add_buff("floating",-1) + + diff --git a/script/character/buff.gd b/script/character/buff.gd new file mode 100644 index 0000000..36d743f --- /dev/null +++ b/script/character/buff.gd @@ -0,0 +1,49 @@ +extends Node3D +class_name Buff + +@onready var character = (get_owner() as Character) +@onready var status = (%Status as Status) + +class BuffInfo: + var name : String + var duration : float + +var buff_map = {} #命中信息 + +func _process(delta): + for buff_name in buff_map: + var buff_info = buff_map[buff_name] + if buff_info.duration == -1: + trigger_buff_effect(buff_info.name,"update") + else: + buff_info.duration -= delta + if buff_info.duration <= 0: + trigger_buff_effect(buff_info.name,"end") + buff_map.erase(buff_name) + else: + trigger_buff_effect(buff_info.name,"update") + +func trigger_buff_effect(buff_name:String,trigger_name:String): + var function_name = "on_%s_%s" % [trigger_name,buff_name] + if has_method(function_name): + call(function_name) + +func has_buff(buff_name:String) -> bool: + return buff_name in buff_map + +func add_buff(buff_name:String,duration:float): + if buff_name in buff_map: + buff_map[buff_name].duration = duration + else: + var new_buff = BuffInfo.new() + new_buff.name = buff_name + new_buff.duration = duration + buff_map[buff_name] = new_buff + trigger_buff_effect(buff_name,"start") + +#==具体实现== +func on_end_hit_back():status.hit_back_speed = 0 +func on_end_hit_up():status.hit_up_speed = 0 +func on_start_stagger():status.is_stagger = true +func on_end_stagger():status.is_stagger = false +func on_end_stun():status.is_stun = false diff --git a/script/character/character.gd b/script/character/character.gd index c355e8d..8cc1428 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -1,9 +1,11 @@ extends CharacterBody3D class_name Character +@onready var collision = (%Collision) @onready var status = (%Status as Status) @onready var view = (%View as View) -@onready var collision = (%Collision) +@onready var buff = (%Buff as Buff) +@onready var skill = (%Skill as Skill) var character_manager : CharacterManager @@ -35,3 +37,13 @@ func manager()->CharacterManager:return character_manager func id()->int:return status.id func team()->Enum.ETeam:return status.team func pos()->Vector2:return Vector2(position.x,position.z) + +#==interface== +func set_pos(pos:Vector3):position = pos +func add_buff(buff_name:String,duration:float):buff.add_buff(buff_name,duration) +func set_hit_move(hit_back_dir:Vector2,hit_back_speed:float,hit_up_speed:float): + status.hit_back_dir = hit_back_dir + status.hit_back_speed = hit_back_speed + status.hit_up_speed = hit_up_speed +func cancel_skill():skill.cancel_skill() +func set_view_trigger(trigger_name:String):status.set("trigger_%s"%trigger_name,true) diff --git a/script/character/move.gd b/script/character/move.gd index 72c016d..a8213fc 100644 --- a/script/character/move.gd +++ b/script/character/move.gd @@ -31,7 +31,8 @@ func update_move(): var move_speed = status.cfg.move.speed * (1 + status.speed_up_rate) var move_velocity = status.move_dir * move_speed var skill_velocity = status.skill_dir * status.skill_move_speed - move_velocity += skill_velocity + var hit_back_velocity = status.hit_back_dir * status.hit_back_speed + move_velocity += skill_velocity + hit_back_velocity character.velocity.x = move_velocity.x character.velocity.z = move_velocity.y diff --git a/script/character/status.gd b/script/character/status.gd index 4eafaf0..f89ee28 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -27,6 +27,14 @@ class_name Status @export var is_jumped : bool #是否已跳跃 @export var is_jumped_check_time : float #是否已跳跃检测时间 避免未起直接判定落地 +@export_category("buff状态") +@export var is_stagger : bool #是否硬直 +@export var is_stun : bool #是否眩晕 +@export var is_floating : bool #是否正在浮空 +@export var hit_back_dir : Vector2 #击退方向 +@export var hit_back_speed : float #击退速度 +@export var hit_up_speed : float #击飞速度 + @export_category("技能状态") @export var skill_cfg : SkillCfg #当前技能 @export var is_skill_running : bool #技能是否正在释放 @@ -41,3 +49,6 @@ class_name Status @export_category("动画触发器") @export var trigger_jump : bool #跳跃 +@export var trigger_hit : bool #受击-轻 +@export var trigger_mhit : bool #受击-中 +@export var trigger_lhit : bool #受击-重 diff --git a/script/character/view.gd b/script/character/view.gd index fc53b70..3feda6b 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -36,11 +36,16 @@ func _ready(): run("jump5","idle_loop") trans("jump5","run1","speed_xz",">",1) + #受击 + trigger("any","hit1","trigger_hit") + run("hit1","hit2_loop") + trans("hit2_loop","hit3","is_stagger","=",false) + run("hit3","idle_loop") func _process(delta): update_flip() + update_trigger() if status.is_free_control: - update_trigger() update_trans() func init(default:SpriteFrames): diff --git a/script/manager/character_manager.gd b/script/manager/character_manager.gd index 74dd366..741af98 100644 --- a/script/manager/character_manager.gd +++ b/script/manager/character_manager.gd @@ -7,7 +7,7 @@ var scene_monster = preload("res://scene/character/monster.tscn") var character_map = {} var character_idx : int = 0 -func create_character(cfg:CharacterCfg,team:Enum.ETeam): +func create_character(cfg:CharacterCfg,team:Enum.ETeam,pos:Vector3): var characterNode:Node match cfg.type: Enum.ECharacterType.Player: @@ -20,9 +20,13 @@ func create_character(cfg:CharacterCfg,team:Enum.ETeam): character_idx += 1 character_map[character_idx]=character character.init(self,character_idx,cfg,team) + character.set_pos(pos) func get_character(id:int) -> Character: - return character_map[id] as Character + if id in character_map: + return character_map[id] as Character + else: + return null func get_enemy_list(id:int) -> Array[Character]: var ret:Array[Character] = [] diff --git a/script/manager/game_manager.gd b/script/manager/game_manager.gd index 39d3285..ddf9467 100644 --- a/script/manager/game_manager.gd +++ b/script/manager/game_manager.gd @@ -6,8 +6,8 @@ extends Node3D @onready var character_manager = (%CharacterManager as CharacterManager) func _ready(): - character_manager.create_character(player,Enum.ETeam.Player) - character_manager.create_character(test_monster,Enum.ETeam.Monster) + character_manager.create_character(player,Enum.ETeam.Player,Vector3(0,1,0)) + character_manager.create_character(test_monster,Enum.ETeam.Monster,Vector3(0.5,1,0)) func _process(delta): pass