血条逻辑

master
chendian 2 years ago
parent 7b0b8335a0
commit a3985ef818

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

@ -14,3 +14,4 @@ sprite_width = 16
move = ExtResource("1_ebj0w")
hp_max = 100.0
shield_max = 100.0
attack = 10.0

@ -14,3 +14,4 @@ sprite_width = 16
move = ExtResource("1_b0lkj")
hp_max = 200.0
shield_max = 200.0
attack = 10.0

@ -14,3 +14,4 @@ sprite_width = 16
move = ExtResource("1_hjl2t")
hp_max = 100.0
shield_max = 0.0
attack = 10.0

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

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

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

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

@ -0,0 +1,3 @@
extends Node3D
var camera:CameraManager

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

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

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

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

@ -17,3 +17,4 @@ class_name CharacterCfg
#战斗信息
@export var hp_max : float
@export var shield_max : float
@export var attack : float

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

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

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

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

@ -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)
Loading…
Cancel
Save