UI with XP and Level labels

master
Sascha 2025-01-05 12:06:27 +07:00
parent d8f6c6b562
commit 62131c5b3f
13 changed files with 56 additions and 41 deletions

@ -189,4 +189,4 @@ Game={
"hide_selection": false, "hide_selection": false,
"select_mode": 0 "select_mode": 0
} }
selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Boss")]) selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Game/UI/VBoxContainer/Level/LevelLabel")])

@ -1,8 +1,8 @@
HBoxContainer
Label Label
VBoxContainer VBoxContainer
ProgressBar ProgressBar
TextureRect TextureRect
HBoxContainer
CanvasLayer CanvasLayer
ColorRect ColorRect
AudioStreamPlayer2D AudioStreamPlayer2D

@ -29,8 +29,8 @@ open_scenes=PackedStringArray("res://scenes/game.tscn", "res://scenes/player.tsc
current_scene="res://scenes/game.tscn" current_scene="res://scenes/game.tscn"
center_split_offset=-317 center_split_offset=-317
selected_default_debugger_tab_idx=0 selected_default_debugger_tab_idx=0
selected_main_editor_idx=2 selected_main_editor_idx=0
selected_bottom_panel_item=1 selected_bottom_panel_item=0
[EditorWindow] [EditorWindow]

@ -8,7 +8,7 @@ Anim={
"grid_snap_active": false, "grid_snap_active": false,
"grid_step": Vector2(8, 8), "grid_step": Vector2(8, 8),
"grid_visibility": 1, "grid_visibility": 1,
"ofs": Vector2(-125.045, -192.08), "ofs": Vector2(-351, -153),
"primary_grid_step": Vector2i(8, 8), "primary_grid_step": Vector2i(8, 8),
"show_group_gizmos": true, "show_group_gizmos": true,
"show_guides": true, "show_guides": true,
@ -34,7 +34,7 @@ Anim={
"snap_rotation_step": 0.261799, "snap_rotation_step": 0.261799,
"snap_scale": false, "snap_scale": false,
"snap_scale_step": 0.1, "snap_scale_step": 0.1,
"zoom": 0.620921 "zoom": 1.0
} }
3D={ 3D={
"fov": 70.01, "fov": 70.01,
@ -189,4 +189,4 @@ Game={
"hide_selection": false, "hide_selection": false,
"select_mode": 0 "select_mode": 0
} }
selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Boss")]) selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Game/Map/BackgroundColor")])

@ -1,5 +1,5 @@
[folding] [folding]
node_unfolds=[NodePath("."), PackedStringArray("Ordering", "Transform"), NodePath("AudioController"), PackedStringArray("Transform"), NodePath("Map"), PackedStringArray("Layer", "Follow Viewport"), NodePath("Map/BackgroundTexture"), PackedStringArray("Visibility", "Layout"), NodePath("Map/BackgroundColor"), PackedStringArray("Layout"), NodePath("Player"), PackedStringArray("Transform"), NodePath("Player/Path2D"), PackedStringArray("Transform"), NodePath("Player/Path2D/PathFollow2D"), PackedStringArray("Transform"), NodePath("Player/ShootSound"), PackedStringArray("Transform"), NodePath("Player/TakeDamageSound"), PackedStringArray("Transform"), NodePath("Player/DeathSound"), PackedStringArray("Transform"), NodePath("Player/GameOverSound"), PackedStringArray("Transform"), NodePath("Player/BackgoundMusic"), PackedStringArray("Transform"), NodePath("GameOver"), PackedStringArray("Layer"), NodePath("GameOver/ColorRect"), PackedStringArray("Layout"), NodePath("GameOver/ColorRect/Label"), PackedStringArray("Layout", "Theme Overrides"), NodePath("UI"), PackedStringArray("Follow Viewport", "Layer"), NodePath("UI/VBoxContainer"), PackedStringArray("Layout/Container Sizing", "Layout", "Layout/Transform"), NodePath("UI/VBoxContainer/XPBar"), PackedStringArray("Layout/Transform", "Layout/Container Sizing", "theme_override_styles/background", "Theme Overrides/styles"), NodePath("UI/VBoxContainer/LevelBar"), PackedStringArray("Theme Overrides", "Theme Overrides/styles", "theme_override_styles/fill")] node_unfolds=[NodePath("."), PackedStringArray("Ordering", "Transform"), NodePath("AudioController"), PackedStringArray("Transform"), NodePath("Map"), PackedStringArray("Layer", "Follow Viewport"), NodePath("Map/BackgroundTexture"), PackedStringArray("Visibility", "Layout"), NodePath("Map/BackgroundColor"), PackedStringArray("Layout"), NodePath("Player"), PackedStringArray("Transform"), NodePath("Player/Path2D"), PackedStringArray("Transform"), NodePath("Player/Path2D/PathFollow2D"), PackedStringArray("Transform"), NodePath("Player/ShootSound"), PackedStringArray("Transform"), NodePath("Player/TakeDamageSound"), PackedStringArray("Transform"), NodePath("Player/DeathSound"), PackedStringArray("Transform"), NodePath("Player/GameOverSound"), PackedStringArray("Transform"), NodePath("Player/BackgoundMusic"), PackedStringArray("Transform"), NodePath("GameOver"), PackedStringArray("Layer"), NodePath("GameOver/ColorRect"), PackedStringArray("Layout"), NodePath("GameOver/ColorRect/Label"), PackedStringArray("Layout", "Theme Overrides"), NodePath("UI"), PackedStringArray("Follow Viewport", "Layer"), NodePath("UI/VBoxContainer"), PackedStringArray("Layout/Container Sizing", "Layout", "Layout/Transform"), NodePath("UI/VBoxContainer/XP/XPBar"), PackedStringArray("Layout/Transform", "Layout/Container Sizing", "theme_override_styles/background", "Theme Overrides/styles"), NodePath("UI/VBoxContainer/Level/LevelBar"), PackedStringArray("Theme Overrides", "Theme Overrides/styles", "theme_override_styles/fill")]
resource_unfolds=["res://scenes/game.tscn::Curve2D_feb5d", PackedStringArray("Resource"), "res://scenes/game.tscn::StyleBoxFlat_0tnpc", PackedStringArray("Corner Radius"), "res://scenes/game.tscn::StyleBoxFlat_vtaks", PackedStringArray("Corner Radius"), "res://scenes/game.tscn::StyleBoxFlat_kvpfn", PackedStringArray()] resource_unfolds=["res://scenes/game.tscn::Curve2D_feb5d", PackedStringArray("Resource"), "res://scenes/game.tscn::StyleBoxFlat_0tnpc", PackedStringArray("Corner Radius"), "res://scenes/game.tscn::StyleBoxFlat_vtaks", PackedStringArray("Corner Radius"), "res://scenes/game.tscn::StyleBoxFlat_kvpfn", PackedStringArray()]
nodes_folded=[] nodes_folded=[]

@ -189,4 +189,4 @@ Game={
"hide_selection": false, "hide_selection": false,
"select_mode": 0 "select_mode": 0
} }
selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Boss")]) selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Game/UI/VBoxContainer/Level/LevelLabel")])

@ -189,4 +189,4 @@ Game={
"hide_selection": false, "hide_selection": false,
"select_mode": 0 "select_mode": 0
} }
selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Boss")]) selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Game/UI/VBoxContainer/Level/LevelLabel")])

@ -73,11 +73,11 @@ state={
state={ state={
"bookmarks": PackedInt32Array(), "bookmarks": PackedInt32Array(),
"breakpoints": PackedInt32Array(), "breakpoints": PackedInt32Array(),
"column": 0, "column": 25,
"folded_lines": Array[int]([]), "folded_lines": Array[int]([]),
"h_scroll_position": 0, "h_scroll_position": 0,
"row": 61, "row": 33,
"scroll_position": 42.0, "scroll_position": 11.0,
"selection": false, "selection": false,
"syntax_highlighter": "GDScript" "syntax_highlighter": "GDScript"
} }
@ -129,10 +129,10 @@ state={
state={ state={
"bookmarks": PackedInt32Array(), "bookmarks": PackedInt32Array(),
"breakpoints": PackedInt32Array(), "breakpoints": PackedInt32Array(),
"column": 0, "column": 50,
"folded_lines": Array[int]([]), "folded_lines": Array[int]([]),
"h_scroll_position": 0, "h_scroll_position": 0,
"row": 1, "row": 18,
"scroll_position": 0.0, "scroll_position": 0.0,
"selection": false, "selection": false,
"syntax_highlighter": "GDScript" "syntax_highlighter": "GDScript"

@ -189,4 +189,4 @@ Game={
"hide_selection": false, "hide_selection": false,
"select_mode": 0 "select_mode": 0
} }
selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Boss")]) selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@18607/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@EditorMainScreen@98/MainScreen/@CanvasItemEditor@10371/@VSplitContainer@10195/@HSplitContainer@10197/@HSplitContainer@10199/@Control@10200/@SubViewportContainer@10201/@SubViewport@10202/Game/UI/VBoxContainer/Level/LevelLabel")])

@ -149,18 +149,37 @@ offset_top = 10.0
offset_right = 1034.0 offset_right = 1034.0
offset_bottom = 74.0 offset_bottom = 74.0
[node name="XPBar" type="ProgressBar" parent="UI/VBoxContainer"] [node name="XP" type="HBoxContainer" parent="UI/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="XPLabel" type="Label" parent="UI/VBoxContainer/XP"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "XP: 0/3"
[node name="XPBar" type="ProgressBar" parent="UI/VBoxContainer/XP"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3 size_flags_vertical = 3
theme_override_styles/background = SubResource("StyleBoxFlat_0tnpc") theme_override_styles/background = SubResource("StyleBoxFlat_0tnpc")
theme_override_styles/fill = SubResource("StyleBoxFlat_vtaks") theme_override_styles/fill = SubResource("StyleBoxFlat_vtaks")
value = 67.0 value = 67.0
show_percentage = false show_percentage = false
[node name="LevelBar" type="ProgressBar" parent="UI/VBoxContainer"] [node name="Level" type="HBoxContainer" parent="UI/VBoxContainer"]
layout_mode = 2
[node name="LevelLabel" type="Label" parent="UI/VBoxContainer/Level"]
unique_name_in_owner = true
layout_mode = 2
text = "Level: 1"
[node name="LevelBar" type="ProgressBar" parent="UI/VBoxContainer/Level"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3 size_flags_vertical = 3
theme_override_styles/background = SubResource("StyleBoxFlat_0tnpc") theme_override_styles/background = SubResource("StyleBoxFlat_0tnpc")
theme_override_styles/fill = SubResource("StyleBoxFlat_kvpfn") theme_override_styles/fill = SubResource("StyleBoxFlat_kvpfn")

@ -3,7 +3,7 @@ extends Node2D
signal game_over signal game_over
signal level_up() signal level_up()
signal boss signal boss
signal update_ui(ui_data: Dictionary) signal update_ui(ui_data: UIDataResource)
const MOB = preload("res://scenes/mob.tscn") const MOB = preload("res://scenes/mob.tscn")
const TREE = preload("res://scenes/tree.tscn") const TREE = preload("res://scenes/tree.tscn")
@ -24,19 +24,12 @@ const UIDataResource = preload("res://scripts/ui_data.gd")
const MobDataResource = preload("res://scripts/mob_data.gd") const MobDataResource = preload("res://scripts/mob_data.gd")
var game_data = GameDataResource.new(0, 3, 1, 3, 0) var game_data = GameDataResource.new(0, 3, 1, 3, 0)
var ui_data = UIDataResource.new(0, 3, 1, 3, 0)
func _ready() -> void: func _ready() -> void:
background_color.size = map_size background_color.size = map_size
background_color.position = Vector2(-map_size.x / 2, -map_size.y / 2) background_color.position = Vector2(-map_size.x / 2, -map_size.y / 2)
randomly_spawn_trees(int(map_size.x * map_size.y / tree_density)) randomly_spawn_trees(int(map_size.x * map_size.y / tree_density))
update_ui.emit({ update_ui_data()
"xp": ui_data.xp,
"xp_next_level": ui_data.xp_next_level,
"level": ui_data.level,
"boss_level": ui_data.boss_level,
"kill_count": ui_data.kill_count
})
func spawn_mob() -> void: func spawn_mob() -> void:
var new_mob = MOB.instantiate() var new_mob = MOB.instantiate()
@ -71,13 +64,7 @@ func _on_mob_died(mob_xp: int) -> void:
print("Level up to " + str(game_data.level)) print("Level up to " + str(game_data.level))
if game_data.level >= game_data.boss_level: if game_data.level >= game_data.boss_level:
boss.emit() boss.emit()
update_ui.emit({ update_ui_data()
"xp": game_data.xp,
"xp_next_level": game_data.xp_next_level,
"level": game_data.level,
"boss_level": game_data.boss_level,
"kill_count": game_data.kill_count
})
func spawn_boss() -> void: func spawn_boss() -> void:
print("Spawn Boss") print("Spawn Boss")
@ -91,3 +78,8 @@ func spawn_boss() -> void:
func _on_level_up() -> void: func _on_level_up() -> void:
# spawn_mob_timer.wait_time = 1 - (game_data.level * 0.1) # spawn_mob_timer.wait_time = 1 - (game_data.level * 0.1)
level_up.emit(game_data.level) level_up.emit(game_data.level)
update_ui_data()
func update_ui_data() -> void:
var ui_data = UIDataResource.new(game_data.xp, game_data.xp_next_level, game_data.level, game_data.boss_level, game_data.kill_count)
update_ui.emit(ui_data)

@ -18,6 +18,6 @@ func shoot() -> void:
shooted.emit() shooted.emit()
func _on_player_level_up(level: int) -> void: func _on_player_level_up(_level: int) -> void:
pass pass
# timer.wait_time = 0.5 - (level * 0.1) # timer.wait_time = 0.5 - (level * 0.1)

@ -6,13 +6,17 @@ const UIDataClass = preload("res://scripts/ui_data.gd")
# Create an instance of UIData # Create an instance of UIData
var ui_data = UIDataClass.new(0, 3, 1, 3, 0) var ui_data = UIDataClass.new(0, 3, 1, 3, 0)
@onready var xp_label: Label = %XPLabel
@onready var xp_bar: ProgressBar = %XPBar @onready var xp_bar: ProgressBar = %XPBar
@onready var level_label: Label = %LevelLabel
@onready var level_bar: ProgressBar = %LevelBar @onready var level_bar: ProgressBar = %LevelBar
@onready var kills: Label = %Kills @onready var kills: Label = %Kills
func _on_update_ui(game_data: Dictionary) -> void: func _on_update_ui(ui_data: UIDataClass) -> void:
xp_bar.max_value = game_data.xp_next_level xp_label.text = "XP: " + str(ui_data.xp) + "/" + str(ui_data.xp_next_level)
xp_bar.value = game_data.xp xp_bar.max_value = ui_data.xp_next_level
level_bar.max_value = game_data.boss_level xp_bar.value = ui_data.xp
level_bar.value = game_data.level level_label.text = "Level: " + str(ui_data.level)
kills.text = "Mobs killed: " + str(game_data.kill_count) level_bar.max_value = ui_data.boss_level
level_bar.value = ui_data.level
kills.text = "Mobs killed: " + str(ui_data.kill_count)