From f58fe398cfd50a22196b8d47b84f78540e8c3e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Wed, 20 Aug 2025 08:42:55 +0200 Subject: [PATCH] game: add xp bar --- scenes/managers/ui/main_ui.tscn | 5 ++++- scenes/managers/ui/player_ui.gd | 40 +++++++++++++++++++++++++++++---- scenes/player.gd | 3 ++- scenes/player_stats.gd | 2 +- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/scenes/managers/ui/main_ui.tscn b/scenes/managers/ui/main_ui.tscn index 02adf84..041f973 100644 --- a/scenes/managers/ui/main_ui.tscn +++ b/scenes/managers/ui/main_ui.tscn @@ -84,10 +84,13 @@ offset_bottom = 100.0 [node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/PlayerUI/CenterContainer"] layout_mode = 2 -[node name="ProgressBar" type="ProgressBar" parent="CanvasLayer/PlayerUI/CenterContainer/VBoxContainer"] +[node name="HPBar" type="ProgressBar" parent="CanvasLayer/PlayerUI/CenterContainer/VBoxContainer"] custom_minimum_size = Vector2(400, 0) layout_mode = 2 +[node name="XPBar" type="ProgressBar" parent="CanvasLayer/PlayerUI/CenterContainer/VBoxContainer"] +layout_mode = 2 + [node name="ElapsedLabel" type="Label" parent="CanvasLayer/PlayerUI/CenterContainer/VBoxContainer"] layout_mode = 2 text = "10:00:00" diff --git a/scenes/managers/ui/player_ui.gd b/scenes/managers/ui/player_ui.gd index 88a66ae..a4bab63 100644 --- a/scenes/managers/ui/player_ui.gd +++ b/scenes/managers/ui/player_ui.gd @@ -1,7 +1,9 @@ class_name PlayerUI extends Control -@onready var hp_bar: ProgressBar = $CenterContainer/VBoxContainer/ProgressBar +@onready var hp_bar: ProgressBar = $CenterContainer/VBoxContainer/HPBar +@onready var xp_bar: ProgressBar = $CenterContainer/VBoxContainer/XPBar + @onready var elapsed_label: Label = $CenterContainer/VBoxContainer/ElapsedLabel const ANIM_SPEED = 4.0 @@ -9,7 +11,8 @@ const TRESHOLD = 1 var wanted_hp_value: float var wanted_hp_max: float - +var wanted_xp_value: float +var wanted_xp_max: float var player: Player @@ -18,6 +21,11 @@ func _ready() -> void: if player: hp_bar.value = player.player_stats.current_health hp_bar.max_value = player.player_stats.max_health + xp_bar.value = player.player_stats.current_xp + xp_bar.max_value = player.player_stats.xp_required_for_level() + await get_tree().create_timer(0.5).timeout + update_hp() + update_xp() func update_hp(): @@ -29,19 +37,43 @@ func update_hp(): wanted_hp_max = max_hp +func update_xp(): + if not player: + push_error("cant update xp, no player found") + var current_xp = player.player_stats.get_final("current_xp", player.modifiers) + var max_xp = player.player_stats.xp_required_for_level() + print_debug("updating xp bar: %s-%s" % [current_xp, max_xp]) + wanted_xp_value = current_xp + wanted_xp_max = max_xp + + func _process(delta: float) -> void: + update_hp_bar(delta) + update_xp_bar(delta) + + +func update_hp_bar(delta: float): if wanted_hp_max != hp_bar.max_value: - print_debug("wanted: %f-%f" % [wanted_hp_max, hp_bar.max_value]) hp_bar.max_value = lerpf(hp_bar.max_value, wanted_hp_max, ANIM_SPEED * delta) if abs(hp_bar.max_value - wanted_hp_max) < TRESHOLD: hp_bar.max_value = wanted_hp_max if wanted_hp_value != hp_bar.value: - print_debug("current: %f-%f" % [wanted_hp_value, hp_bar.value]) hp_bar.value = lerpf(hp_bar.value, wanted_hp_value, ANIM_SPEED * delta) if abs(hp_bar.value - wanted_hp_value) < TRESHOLD: hp_bar.value = wanted_hp_value +func update_xp_bar(delta: float): + if wanted_xp_max != xp_bar.max_value: + xp_bar.max_value = lerpf(xp_bar.max_value, wanted_xp_max, ANIM_SPEED * delta) + if abs(xp_bar.max_value - wanted_xp_max) < TRESHOLD: + xp_bar.max_value = wanted_xp_max + if wanted_xp_value != xp_bar.value: + xp_bar.value = lerpf(xp_bar.value, wanted_xp_value, ANIM_SPEED * delta) + if abs(xp_bar.value - wanted_xp_value) < TRESHOLD: + xp_bar.value = wanted_xp_value + + func set_elapsed_time(value: float): elapsed_label.text = format_time(value) diff --git a/scenes/player.gd b/scenes/player.gd index ab216c0..3246a10 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -96,11 +96,12 @@ func toggle_god_mode(value: bool): func add_xp(amount: float) -> void: player_stats.current_xp += amount + main_ui.player_ui.update_xp() _check_level_up() func _check_level_up() -> void: - var required_for_level = 25.0 + var required_for_level = player_stats.xp_required_for_level() if player_stats.current_xp >= required_for_level: player_stats.current_level += 1 player_stats.current_xp -= required_for_level diff --git a/scenes/player_stats.gd b/scenes/player_stats.gd index 46d8a02..d6d398f 100644 --- a/scenes/player_stats.gd +++ b/scenes/player_stats.gd @@ -28,4 +28,4 @@ func get_final(stat: String, modifiers: Array[PlayerStatsModifier]) -> Variant: func xp_required_for_level() -> float: - return 100 * (100 * (1.5 ** (current_level - 1))) + return floorf(100 * (1.5 ** (current_level - 1))) -- 2.49.1