From e2fae9368e589625580df272edf0d89aa5d9cb6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Ke=C3=9Fler?= <fabian.kessler@stud-mail.uni-wuerzburg.de> Date: Sat, 15 Mar 2025 22:33:33 +0100 Subject: [PATCH] Add hud elements --- pulsjam2025/NPC/penguin/group.gd | 1 + pulsjam2025/NPC/penguin/penguin.gd | 2 + pulsjam2025/Player/PlayerScene.tscn | 7 +- pulsjam2025/Player/TestScene.tscn | 3 - pulsjam2025/Player/camera/camera_2d.tscn | 92 ++++++++++++ .../Screenshot 2025-03-15 at 22.17.23.png | Bin 0 -> 15204 bytes ...reenshot 2025-03-15 at 22.17.23.png.import | 34 +++++ pulsjam2025/globals.gd | 15 +- pulsjam2025/hud/hud.tscn | 137 +++++++++++++++++- pulsjam2025/project.godot | 2 +- pulsjam2025/schollen_spektakel.tscn | 11 +- 11 files changed, 282 insertions(+), 22 deletions(-) create mode 100644 pulsjam2025/Player/camera/camera_2d.tscn create mode 100644 pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png create mode 100644 pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import diff --git a/pulsjam2025/NPC/penguin/group.gd b/pulsjam2025/NPC/penguin/group.gd index 370d21a..784042e 100644 --- a/pulsjam2025/NPC/penguin/group.gd +++ b/pulsjam2025/NPC/penguin/group.gd @@ -10,6 +10,7 @@ var penguin_scene: PackedScene = load("res://NPC/penguin/penguin.tscn") var penguins : Array[Penguin] = [] func _ready() -> void: + Globals.pengu_group = self timer.connect("timeout", Callable(self, "_on_timer_timeout")) start_random_timer() diff --git a/pulsjam2025/NPC/penguin/penguin.gd b/pulsjam2025/NPC/penguin/penguin.gd index 90c1864..aa27a0e 100644 --- a/pulsjam2025/NPC/penguin/penguin.gd +++ b/pulsjam2025/NPC/penguin/penguin.gd @@ -64,6 +64,8 @@ func _process(delta: float) -> void: var dir = (target - position).normalized() var bump_dir = Vector2.ZERO + self.rotation = -get_parent().rotation + var near_areas: Array[Area2D] = $Area2D.get_overlapping_areas(); cluster_score = 0 for area in near_areas: diff --git a/pulsjam2025/Player/PlayerScene.tscn b/pulsjam2025/Player/PlayerScene.tscn index fd78fcb..e4c60cc 100644 --- a/pulsjam2025/Player/PlayerScene.tscn +++ b/pulsjam2025/Player/PlayerScene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=22 format=3 uid="uid://cwmunv68b7txk"] +[gd_scene load_steps=23 format=3 uid="uid://cwmunv68b7txk"] [ext_resource type="Script" uid="uid://babk78kqf724a" path="res://Player/PlayerMovement.gd" id="1_ihrqt"] [ext_resource type="PackedScene" uid="uid://dfe8d0dg2yioj" path="res://Player/FishScene.tscn" id="2_rded7"] @@ -11,6 +11,7 @@ [ext_resource type="Texture2D" uid="uid://c771pbnvtsr6t" path="res://Player/bird_up_2.png" id="9_dplev"] [ext_resource type="Texture2D" uid="uid://0il2dq67vsbg" path="res://Player/bird_down.png" id="10_7d6og"] [ext_resource type="Texture2D" uid="uid://uc2v17mafr6n" path="res://Player/bird_down_2.png" id="11_183bc"] +[ext_resource type="PackedScene" uid="uid://bx2qxdfk08ti8" path="res://Player/camera/camera_2d.tscn" id="12_183bc"] [sub_resource type="GDScript" id="GDScript_yjw77"] @@ -311,8 +312,6 @@ area2D = NodePath("Area2D") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_ihrqt") -[node name="AudioListener2D" type="AudioListener2D" parent="."] - [node name="FishCooldownTimer" type="Timer" parent="."] one_shot = true @@ -342,6 +341,8 @@ libraries = { } speed_scale = 1.5 +[node name="Camera" parent="." instance=ExtResource("12_183bc")] + [connection signal="timeout" from="FishCooldownTimer" to="." method="_on_fish_cooldown_timer_timeout"] [connection signal="timeout" from="FishDespawnTimer" to="." method="_on_fish_despawn_timer_timeout"] [connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"] diff --git a/pulsjam2025/Player/TestScene.tscn b/pulsjam2025/Player/TestScene.tscn index 368a71e..2a51d25 100644 --- a/pulsjam2025/Player/TestScene.tscn +++ b/pulsjam2025/Player/TestScene.tscn @@ -5,9 +5,6 @@ [node name="TestScene" type="Node2D"] -[node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(591, 335) - [node name="SchollenSpektakel" parent="." instance=ExtResource("2_oh42m")] position = Vector2(-17, 66) diff --git a/pulsjam2025/Player/camera/camera_2d.tscn b/pulsjam2025/Player/camera/camera_2d.tscn new file mode 100644 index 0000000..39d8a6c --- /dev/null +++ b/pulsjam2025/Player/camera/camera_2d.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=3 format=3 uid="uid://bx2qxdfk08ti8"] + +[ext_resource type="PackedScene" uid="uid://coryu5r8revlm" path="res://hud/hud.tscn" id="1_hmhh6"] + +[sub_resource type="GDScript" id="GDScript_etdkj"] +script/source = "extends Node + +@onready var player = get_parent() +@onready var base_zoom: Vector2 = %Cam.zoom +@onready var min_zoom := Vector2(0.5, 0.5) +@onready var max_zoom := Vector2(0.9, 0.9) + +# ScreenShake logic +@export var max_offset: float = 5.0 +@export var max_roll: float = 10.0 +@export var shakeReduction: float = 2.5 + +@export var move_factor := 30.0 + +var stress: float = 0.0 +var shake: float = 0.0 + +var extra_zoom := Vector2.ZERO +var zoom_accel := Vector2.ZERO + +func _ready() -> void: + Globals.camera = self + +func _physics_process(delta: float) -> void: + if not Globals.level_center: + return + + # Position + var pos = Globals.level_center.global_position + (player.global_position + Globals.level_center.global_position) / move_factor + %Cam.offset = pos -Vector2.ONE * 50 + #print(%Cam.global_position) + + # Zoom + zoom_accel = zoom_accel / 2.0 + zoom_accel += Vector2(player.velocity.length(), player.velocity.length()) / 1000000 - Vector2.ONE / 2000 + var distance = player.global_position.distance_to(Globals.level_center.global_position) + extra_zoom = -Vector2(distance, distance) / 100000 + extra_zoom = clamp(extra_zoom + zoom_accel, min_zoom - base_zoom, max_zoom - base_zoom) + + #print(extra_zoom, zoom_accel, distance, pos, %Cam.global_position) + + %Cam.zoom = base_zoom + extra_zoom + _process_shake(delta) + +func _process_shake(delta) -> void: + # Lerp to normal position/rotation + %Cam.rotation_degrees = lerp( %Cam.rotation_degrees, 0.0, delta * 5.0) + + %Cam.position.x = lerp( %Cam.position.x, 0.0, delta * 5.0) + %Cam.position.y = lerp( %Cam.position.y, 0.0, delta * 5.0) + + # Shake logic + shake = stress * stress + + # Rotation + %Cam.rotation_degrees += max_roll * shake * _get_noise(randi(), delta) * 100 + + # Position + var offset_x = max_offset * shake * _get_noise(randi(), delta + 1.0) + var offset_y = max_offset * shake * _get_noise(randi(), delta + 2.0) + + %Cam.position = Vector2(offset_x, offset_y) * 10 + + # Shake reduction + stress -= shakeReduction * delta + stress = max(0, stress) + +func _get_noise(noise_seed, time) -> float: + var n = FastNoiseLite.new() + n.seed = noise_seed + + return n.get_noise_1d(time) + +func add_stress(amount: float) -> void: + stress += amount + stress = max(0, stress) +" + +[node name="Camera" type="Node"] +script = SubResource("GDScript_etdkj") + +[node name="Cam" type="Camera2D" parent="."] +unique_name_in_owner = true + +[node name="CanvasLayer" type="CanvasLayer" parent="Cam"] + +[node name="HUD" parent="Cam/CanvasLayer" instance=ExtResource("1_hmhh6")] diff --git a/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png new file mode 100644 index 0000000000000000000000000000000000000000..becd10576834e1cd5441d5fae8cd19fa7d9cd1a8 GIT binary patch literal 15204 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 MQ~yTUb%%%l2T%{gsQ>@~ literal 0 HcmV?d00001 diff --git a/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import new file mode 100644 index 0000000..845d2dc --- /dev/null +++ b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgcrh2gh8dd7d" +path="res://.godot/imported/Screenshot 2025-03-15 at 22.17.23.png-d8fba5094fe8ec212930d27b8114ca90.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Screenshot 2025-03-15 at 22.17.23.png" +dest_files=["res://.godot/imported/Screenshot 2025-03-15 at 22.17.23.png-d8fba5094fe8ec212930d27b8114ca90.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/pulsjam2025/globals.gd b/pulsjam2025/globals.gd index 69e617d..6bdf9d8 100644 --- a/pulsjam2025/globals.gd +++ b/pulsjam2025/globals.gd @@ -1,19 +1,32 @@ extends Node signal score_changed +signal highscore_changed var level_center: Node2D = null var ice_floes: Array[IceFloe] = [] +var camera: Node = null + var score: int = 0: set(val): score = val emit_signal("score_changed", val) +var highscore: int = 0: + set(val): + score = val + emit_signal("highscore_changed", val) + +var pengu_group: Node + var _score_timer := Timer.new() func start_round(): + if not pengu_group: + printerr("Cant start - No pengu group") + return add_child(_score_timer) - _score_timer.timeout.connect(func(): score += 1) + _score_timer.timeout.connect(func(): score += pengu_group.n_penguins) _score_timer.start(1.0) diff --git a/pulsjam2025/hud/hud.tscn b/pulsjam2025/hud/hud.tscn index 756b815..e36ffa6 100644 --- a/pulsjam2025/hud/hud.tscn +++ b/pulsjam2025/hud/hud.tscn @@ -1,20 +1,34 @@ -[gd_scene load_steps=4 format=3 uid="uid://coryu5r8revlm"] +[gd_scene load_steps=6 format=3 uid="uid://coryu5r8revlm"] [ext_resource type="FontFile" uid="uid://2c10u3pux7je" path="res://Winter Minie.ttf" id="1_6ca3a"] +[ext_resource type="Texture2D" uid="uid://bgcrh2gh8dd7d" path="res://Screenshot 2025-03-15 at 22.17.23.png" id="2_2gk58"] [sub_resource type="GDScript" id="GDScript_6ca3a"] script/source = "extends Control func _ready() -> void: Globals.score_changed.connect(update_score) + Globals.highscore_changed.connect(update_highscore) func update_score(score) -> void: - $MarginContainer/ScoreLabel.text = str(score) + %ScoreLabel.text = str(score) + %SCORE.text = str(score) + +func update_highscore(score) -> void: + %HIGHSCORE.text = str(score) " [sub_resource type="LabelSettings" id="LabelSettings_2gk58"] font = ExtResource("1_6ca3a") font_size = 86 +shadow_size = 5 +shadow_color = Color(0, 0, 0, 0.21) + +[sub_resource type="LabelSettings" id="LabelSettings_318vg"] +font = ExtResource("1_6ca3a") +font_size = 36 +shadow_size = 11 +shadow_color = Color(0, 0, 0, 0.21) [node name="HUD" type="Control"] layout_mode = 3 @@ -27,7 +41,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 script = SubResource("GDScript_6ca3a") -[node name="MarginContainer" type="MarginContainer" parent="."] +[node name="Gameplay" type="MarginContainer" parent="."] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -37,9 +51,124 @@ grow_vertical = 2 theme_override_constants/margin_left = 20 theme_override_constants/margin_top = 20 -[node name="ScoreLabel" type="Label" parent="MarginContainer"] +[node name="ScoreLabel" type="Label" parent="Gameplay"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 size_flags_vertical = 0 text = "0" label_settings = SubResource("LabelSettings_2gk58") + +[node name="Start" type="MarginContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 + +[node name="TextureRect" type="TextureRect" parent="Start"] +layout_mode = 2 +size_flags_vertical = 0 +texture = ExtResource("2_2gk58") +stretch_mode = 3 + +[node name="CenterContainer" type="CenterContainer" parent="Start"] +layout_mode = 2 + +[node name="label" type="Label" parent="Start/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +text = " + + + +Press any key to +Start" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="GameOver" type="MarginContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 + +[node name="CenterContainer" type="CenterContainer" parent="GameOver"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="GameOver/CenterContainer"] +layout_mode = 2 +alignment = 1 + +[node name="ScoreLabel" type="Label" parent="GameOver/CenterContainer/VBoxContainer"] +modulate = Color(0.999969, 0.614075, 0.555964, 1) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "-Game Over-" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="HBoxContainer2" type="HBoxContainer" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ScoreLabel2" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer2"] +modulate = Color(0.819655, 0.819655, 0.819655, 1) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Score:" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="SCORE" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 10 +size_flags_vertical = 0 +text = "0" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ScoreLabel2" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer"] +modulate = Color(0.819655, 0.819655, 0.819655, 1) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Highscore:" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="HIGHSCORE" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 10 +size_flags_vertical = 0 +text = "0" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 2 + +[node name="HSeparator" type="HSeparator" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ScoreLabel2" type="Label" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = " +Press SPACE to continue" +label_settings = SubResource("LabelSettings_318vg") +horizontal_alignment = 1 diff --git a/pulsjam2025/project.godot b/pulsjam2025/project.godot index 026e724..976f7b5 100644 --- a/pulsjam2025/project.godot +++ b/pulsjam2025/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="PulsJam2025" -run/main_scene="uid://ch1i0q8d6r4f0" +run/main_scene="uid://byb21wlyercnu" config/features=PackedStringArray("4.4") [autoload] diff --git a/pulsjam2025/schollen_spektakel.tscn b/pulsjam2025/schollen_spektakel.tscn index e513534..794540e 100644 --- a/pulsjam2025/schollen_spektakel.tscn +++ b/pulsjam2025/schollen_spektakel.tscn @@ -1,11 +1,10 @@ -[gd_scene load_steps=10 format=3 uid="uid://ch1i0q8d6r4f0"] +[gd_scene load_steps=9 format=3 uid="uid://ch1i0q8d6r4f0"] [ext_resource type="Script" uid="uid://cik8umdfv5587" path="res://schollen_spektakel.gd" id="1_ij3xc"] [ext_resource type="PackedScene" uid="uid://d1vv1o7g2lp01" path="res://water/water.tscn" id="2_hycu0"] [ext_resource type="PackedScene" uid="uid://diilm3qbp1tly" path="res://ice_floe/ice_floe.tscn" id="2_ij3xc"] [ext_resource type="PackedScene" uid="uid://b23bxmjrcknm3" path="res://center_pos.tscn" id="4_6ndi4"] [ext_resource type="PackedScene" uid="uid://cgkfkbiyl02yl" path="res://ice_floe/floe_area.tscn" id="5_doghl"] -[ext_resource type="PackedScene" uid="uid://coryu5r8revlm" path="res://hud/hud.tscn" id="6_2ljra"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_doghl"] resource_local_to_scene = true @@ -55,11 +54,3 @@ script = SubResource("GDScript_2ljra") [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="FloeArea"] polygon = PackedVector2Array(-7071, -5132, 10762, -5282, 9681, 5706, -7101, 5466, -24, 690, 1193, 681, 1196, -60, -43, -63, -41, 697, -7131, 5464) - -[node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(591, 335) - -[node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"] - -[node name="HUD" parent="Camera2D/CanvasLayer" instance=ExtResource("6_2ljra")] -metadata/_edit_use_anchors_ = true -- GitLab