From a3985ef8184b51a4ef3407986382fb51f211de77 Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Fri, 20 Oct 2023 06:29:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=80=E6=9D=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/attack/heavy_hit_blow.tres | 2 +- config/character/hero01.tres | 1 + config/character/monster01.tres | 1 + config/character/monster02.tres | 1 + project.godot | 1 + scene/launcher.tscn | 27 ++++++------- scene/ui/hud_screen.tscn | 4 +- scene/ui/item/headbar.tscn | 36 ++++++++++++++++++ script/_global/global.gd | 3 ++ script/character/battle.gd | 18 ++++++--- script/character/character.gd | 23 ++++++----- script/character/move.gd | 2 + script/character/status.gd | 5 +++ script/config/character_cfg.gd | 1 + script/manager/CameraManager.gd | 27 +++++++++++++ script/manager/character_manager.gd | 2 + script/manager/signal_manager.gd | 6 +++ script/ui/headbar/headbar.gd | 16 ++++++++ script/ui/headbar/headbar_page.gd | 59 +++++++++++++++++++++++++++++ 19 files changed, 205 insertions(+), 30 deletions(-) create mode 100644 scene/ui/item/headbar.tscn create mode 100644 script/_global/global.gd create mode 100644 script/manager/CameraManager.gd create mode 100644 script/ui/headbar/headbar.gd create mode 100644 script/ui/headbar/headbar_page.gd diff --git a/config/attack/heavy_hit_blow.tres b/config/attack/heavy_hit_blow.tres index 02a4523..2bfcab9 100644 --- a/config/attack/heavy_hit_blow.tres +++ b/config/attack/heavy_hit_blow.tres @@ -10,5 +10,5 @@ hit_back_speed = 4.0 hit_back_duration = 0.05 hit_up_speed = 4.0 hit_up_duration = 0.05 -pause_time = 0.0 +pause_time = 0.1 is_floating = true diff --git a/config/character/hero01.tres b/config/character/hero01.tres index 9b0c1b2..74792b3 100644 --- a/config/character/hero01.tres +++ b/config/character/hero01.tres @@ -14,3 +14,4 @@ sprite_width = 16 move = ExtResource("1_ebj0w") hp_max = 100.0 shield_max = 100.0 +attack = 10.0 diff --git a/config/character/monster01.tres b/config/character/monster01.tres index 5b07c0b..a8938c2 100644 --- a/config/character/monster01.tres +++ b/config/character/monster01.tres @@ -14,3 +14,4 @@ sprite_width = 16 move = ExtResource("1_b0lkj") hp_max = 200.0 shield_max = 200.0 +attack = 10.0 diff --git a/config/character/monster02.tres b/config/character/monster02.tres index 640fff3..8a5511b 100644 --- a/config/character/monster02.tres +++ b/config/character/monster02.tres @@ -14,3 +14,4 @@ sprite_width = 16 move = ExtResource("1_hjl2t") hp_max = 100.0 shield_max = 0.0 +attack = 10.0 diff --git a/project.godot b/project.godot index 5e8214d..947c7c8 100644 --- a/project.godot +++ b/project.godot @@ -36,6 +36,7 @@ SignalManager="*res://script/manager/signal_manager.gd" Setting="*res://script/_global/setting.gd" Enum="*res://script/_global/enum.gd" Util="*res://script/_global/util.gd" +Global="*res://script/_global/global.gd" [display] diff --git a/scene/launcher.tscn b/scene/launcher.tscn index 6d31b34..f7895d2 100644 --- a/scene/launcher.tscn +++ b/scene/launcher.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=12 format=3 uid="uid://bkhnhc6bk3w7l"] +[gd_scene load_steps=13 format=3 uid="uid://bkhnhc6bk3w7l"] [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://dmfh54jffhx28" path="res://config/character/monster02.tres" id="3_t5dvy"] +[ext_resource type="Script" path="res://script/manager/CameraManager.gd" id="4_22ccm"] [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"] [ext_resource type="PackedScene" uid="uid://cc525u8auypjf" path="res://scene/ui/profile_screen.tscn" id="6_u1fxn"] @@ -21,22 +22,22 @@ script = ExtResource("1_q2t80") player = ExtResource("2_m8pa4") test_monster = ExtResource("3_t5dvy") +[node name="CameraManager" type="Camera3D" parent="GameManager"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 4.01178, 2.85449) +projection = 1 +current = true +size = 5.0 +frustum_offset = Vector2(2, 0) +far = 20.0 +script = ExtResource("4_22ccm") + [node name="LevelManager" type="Node3D" parent="GameManager"] -unique_name_in_owner = true [node name="DirectionalLight3D" type="DirectionalLight3D" parent="GameManager/LevelManager"] transform = Transform3D(0.707106, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707106, -0.5, 0.5, 0, 0, 5.42268) shadow_enabled = true shadow_blur = 0.0 -[node name="Camera3D" type="Camera3D" parent="GameManager/LevelManager"] -transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 2.76109, 2) -projection = 1 -current = true -size = 5.0 -frustum_offset = Vector2(2, 0) -far = 20.0 - [node name="Levelground0000" type="MeshInstance3D" parent="GameManager/LevelManager"] mesh = ExtResource("1_u51ir") skeleton = NodePath("../../..") @@ -54,15 +55,15 @@ use_collision = true unique_name_in_owner = true script = ExtResource("4_oonkb") +[node name="EffectManager" type="Node3D" parent="GameManager"] +script = ExtResource("8_0jv87") + [node name="UIManager" type="Node3D" parent="GameManager"] [node name="ProfileScreen" parent="GameManager/UIManager" instance=ExtResource("6_u1fxn")] [node name="HudScreen" parent="GameManager/UIManager" instance=ExtResource("7_gx646")] -[node name="EffectManager" type="Node3D" parent="GameManager"] -script = ExtResource("8_0jv87") - [node name="EditorTool" type="Node3D" parent="."] script = ExtResource("5_n3qhi") diff --git a/scene/ui/hud_screen.tscn b/scene/ui/hud_screen.tscn index c4fd77c..9e1e92d 100644 --- a/scene/ui/hud_screen.tscn +++ b/scene/ui/hud_screen.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://126wph4owvoy"] +[gd_scene load_steps=4 format=3 uid="uid://126wph4owvoy"] [ext_resource type="Texture2D" uid="uid://cwhu1ec03t3c8" path="res://resource/ui/hud/headbar_hp_empty.png" id="1_flgf6"] [ext_resource type="Texture2D" uid="uid://b4ly1exl0owck" path="res://resource/ui/hud/headbar_hp.png" id="2_sktwb"] +[ext_resource type="Script" path="res://script/ui/headbar/headbar_page.gd" id="3_fb4si"] [node name="HudScreen" type="CanvasLayer"] @@ -37,3 +38,4 @@ layout_mode = 3 anchors_preset = 0 offset_right = 40.0 offset_bottom = 40.0 +script = ExtResource("3_fb4si") diff --git a/scene/ui/item/headbar.tscn b/scene/ui/item/headbar.tscn new file mode 100644 index 0000000..8d7ff8f --- /dev/null +++ b/scene/ui/item/headbar.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=3 uid="uid://dy0u26ba7dle"] + +[ext_resource type="Script" path="res://script/ui/headbar/headbar.gd" id="1_j1xlt"] +[ext_resource type="Texture2D" uid="uid://cwhu1ec03t3c8" path="res://resource/ui/hud/headbar_hp_empty.png" id="2_g5t31"] +[ext_resource type="Texture2D" uid="uid://b4ly1exl0owck" path="res://resource/ui/hud/headbar_hp.png" id="3_vh1p5"] + +[node name="HeadBar" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_left = 256.0 +offset_top = 88.0 +offset_right = 256.0 +offset_bottom = 88.0 +script = ExtResource("1_j1xlt") + +[node name="HpBar" type="TextureProgressBar" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = -8.0 +offset_right = 32.0 +offset_bottom = 8.0 +grow_horizontal = 2 +grow_vertical = 2 +value = 50.0 +stretch_margin_left = 10 +stretch_margin_top = 10 +stretch_margin_right = 10 +stretch_margin_bottom = 10 +texture_under = ExtResource("2_g5t31") +texture_progress = ExtResource("3_vh1p5") diff --git a/script/_global/global.gd b/script/_global/global.gd new file mode 100644 index 0000000..babd6db --- /dev/null +++ b/script/_global/global.gd @@ -0,0 +1,3 @@ +extends Node3D + +var camera:CameraManager diff --git a/script/character/battle.gd b/script/character/battle.gd index 859c543..b71d733 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -25,7 +25,7 @@ func attack(): var attack = attack_list[attack_index] var enemy_list = character.manager().get_enemy_list(character.id()) for enemy in enemy_list: - var pos_dir = enemy.pos()-character.pos() + var pos_dir = enemy.pos2D()-character.pos2D() var distance = pos_dir.length() #test if (distance < 1): @@ -42,14 +42,23 @@ func _process(delta): hit_info_list.clear() func settle(hit_info:HitInfo): - var character_from = character.manager().get_character(hit_info.from) - var character_to = character.manager().get_character(hit_info.to) + var character_from = character.manager().get_character(hit_info.from) as Character + var character_to = character.manager().get_character(hit_info.to) as Character if !character_from or !character_to: return var attack = hit_info.attack - character_to.set_view_trigger("hit") + + #造成伤害 + var damage = attack.damage_rate * character_from.get_property("attack") + var hp = character_to.get_status("hp") + damage = min(hp,damage) + character_to.set_status("hp",hp-damage) + + #取消技能 character_to.cancel_skill() + #受击动画 + character_to.set_view_trigger("hit") #浮空 强制位移 var hit_up_speed = attack.hit_up_speed @@ -59,7 +68,6 @@ func settle(hit_info:HitInfo): else: character_to.add_buff("stagger",1) hit_up_speed = 0 - character_to.set_hit_move(hit_info.dir,attack.hit_back_speed,hit_up_speed) character_to.add_buff("hit_back",attack.hit_back_duration) character_to.add_buff("hit_up",attack.hit_up_duration) diff --git a/script/character/character.gd b/script/character/character.gd index 6c24312..a49f6cd 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -14,10 +14,7 @@ func init(mgr:CharacterManager,id:int,cfg:CharacterCfg,team:Enum.ETeam): status.id = id status.team = team status.cfg = cfg - build_view(cfg) - build_battle(cfg) - -func build_view(cfg:CharacterCfg): + #view var half_height = Setting.pixel_size * Setting.sprite_scale * cfg.sprite_harf_height var width = Setting.pixel_size * Setting.sprite_scale * cfg.sprite_width @@ -28,11 +25,13 @@ func build_view(cfg:CharacterCfg): view.init(cfg.sprite_frames) skill.init() -func build_battle(cfg:CharacterCfg): - status.hp = cfg.hp_max - status.hp_max = cfg.hp_max - status.shield = cfg.shield_max - status.shield_max = cfg.shield_max +func init_after(): + #battle + var cfg = status.cfg + set_status("hp",cfg.hp_max) + set_status("hp_max",cfg.hp_max) + set_status("shield",cfg.shield_max) + set_status("shield_max",cfg.shield_max) func set_material(material:ShaderMaterial): view.material_override = material @@ -41,8 +40,12 @@ func set_material(material:ShaderMaterial): 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) +func pos2D()->Vector2:return Vector2(position.x,position.z) +func pos()->Vector3:return position func view_pos()->Vector3:return position + view.position +func get_property(prop_name:String)->float:return status.cfg.get(prop_name) +func get_status(status_name:String):return status.get_status(status_name) +func set_status(status_name:String,value):status.set_status(status_name,value) #==interface== func set_pos(pos:Vector3):position = pos diff --git a/script/character/move.gd b/script/character/move.gd index 1d89e33..dad4f27 100644 --- a/script/character/move.gd +++ b/script/character/move.gd @@ -13,6 +13,8 @@ func _physics_process(delta): update_speed_y(delta) update_move(delta) character.move_and_slide() + if character.velocity: + SignalManager.character_pos_changed.emit(character.id(),character.pos()) func update_on_floor(delta): status.is_on_floor = character.is_on_floor() diff --git a/script/character/status.gd b/script/character/status.gd index 9de290f..b7344bd 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -61,3 +61,8 @@ class_name Status @export var trigger_hit : bool #受击-轻 @export var trigger_mhit : bool #受击-中 @export var trigger_lhit : bool #受击-重 + +func get_status(status_name:String):return get(status_name) +func set_status(status_name:String,value): + set(status_name,value) + SignalManager.character_status_changed.emit(id,status_name,value) diff --git a/script/config/character_cfg.gd b/script/config/character_cfg.gd index 0cbba3a..b40b86e 100644 --- a/script/config/character_cfg.gd +++ b/script/config/character_cfg.gd @@ -17,3 +17,4 @@ class_name CharacterCfg #战斗信息 @export var hp_max : float @export var shield_max : float +@export var attack : float diff --git a/script/manager/CameraManager.gd b/script/manager/CameraManager.gd new file mode 100644 index 0000000..fb4bd2c --- /dev/null +++ b/script/manager/CameraManager.gd @@ -0,0 +1,27 @@ +extends Camera3D +class_name CameraManager + +var target:int +var offset:Vector3 + +func _ready(): + Global.camera = self + SignalManager.character_create.connect(on_character_create) + SignalManager.character_pos_changed.connect(on_character_pos_changed) + SignalManager.character_destroy.connect(on_character_destroy) + +func _process(delta): + pass + +func on_character_create(id:int,team:Enum.ETeam,pos:Vector3): + if team == Enum.ETeam.Player: + target = id + offset = position - pos + +func on_character_pos_changed(id:int,pos:Vector3): + if id == target: + position = pos + offset + +func on_character_destroy(id:int): + target = 0 + offset = Vector3.ZERO diff --git a/script/manager/character_manager.gd b/script/manager/character_manager.gd index 9aacbab..ad35dcc 100644 --- a/script/manager/character_manager.gd +++ b/script/manager/character_manager.gd @@ -23,6 +23,8 @@ func create_character(cfg:CharacterCfg,team:Enum.ETeam,pos:Vector3): character.init(self,character_idx,cfg,team) character.set_material(character_material.duplicate()) character.set_pos(pos) + SignalManager.character_create.emit(character_idx,team,pos) + character.init_after() func get_character(id:int) -> Character: if id in character_map: diff --git a/script/manager/signal_manager.gd b/script/manager/signal_manager.gd index 42f8caf..0a33fd2 100644 --- a/script/manager/signal_manager.gd +++ b/script/manager/signal_manager.gd @@ -7,3 +7,9 @@ signal input_action_move(Vector2) #effect signal effect_create + +#character +signal character_create +signal character_destroy +signal character_pos_changed +signal character_status_changed diff --git a/script/ui/headbar/headbar.gd b/script/ui/headbar/headbar.gd new file mode 100644 index 0000000..ebef39b --- /dev/null +++ b/script/ui/headbar/headbar.gd @@ -0,0 +1,16 @@ +extends Control +class_name Headbar + +@onready var hpbar = (%HpBar as TextureProgressBar) + +func _ready(): + pass + +func _process(delta): + pass + +func on_hp_changed(value): + hpbar.value = value + +func on_hp_max_changed(value): + hpbar.max_value = value diff --git a/script/ui/headbar/headbar_page.gd b/script/ui/headbar/headbar_page.gd new file mode 100644 index 0000000..e6a1a63 --- /dev/null +++ b/script/ui/headbar/headbar_page.gd @@ -0,0 +1,59 @@ +extends Control + +@onready var headbar_scene = preload("res://scene/ui/item/headbar.tscn") +@onready var camera: CameraManager = Global.camera + +class HeadbarMeta: + var pos:Vector3 + var headbar:Headbar + +var headbar_map = {} + +func _ready(): + SignalManager.character_create.connect(on_character_create) + SignalManager.character_pos_changed.connect(on_character_pos_changed) + SignalManager.character_destroy.connect(on_character_destroy) + SignalManager.character_status_changed.connect(on_character_status_changed) + +func _process(delta): + var camera_pos = camera.position + for k in headbar_map: + var headbar_meta = headbar_map[k] as HeadbarMeta + headbar_meta.headbar.position = camera.unproject_position(headbar_meta.pos) + +func on_character_create(id:int,team:Enum.ETeam,pos:Vector3): + if team == Enum.ETeam.Player: + return + var new_headbar_meta = HeadbarMeta.new() + new_headbar_meta.pos = pos + var new_headbar = headbar_scene.instantiate() + add_child(new_headbar) + new_headbar_meta.headbar = new_headbar + on_character_pos_changed(id,pos) + headbar_map[id] = new_headbar_meta + +func on_character_pos_changed(id:int,pos:Vector3): + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar = headbar_meta.headbar as Headbar + headbar_meta.pos = pos + headbar.position = camera.unproject_position(pos) + +func on_character_destroy(id:int): + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar = headbar_meta.headbar as Headbar + headbar.queue_free() + headbar_map.erase(id) + +func on_character_status_changed(id:int,status_name:String,value): + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar = headbar_meta.headbar as Headbar + var func_name = "on_%s_changed" % status_name + if headbar.has_method(func_name): + headbar.call(func_name,value) +