buff系统 受击动画触发

master
chendian 2 years ago
parent 9bc7c7d28c
commit 0bc33aec98

@ -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": [

@ -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

@ -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

@ -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"
}]
}

@ -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"
}]
}

@ -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"
}]
}

@ -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"
}]
}

@ -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"
}]
}

@ -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"]

@ -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")]

@ -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")

@ -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

@ -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)

@ -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

@ -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)

@ -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

@ -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 #受击-重

@ -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):

@ -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] = []

@ -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

Loading…
Cancel
Save