diff --git a/docs/0 - Crediti.md b/docs/0 - Crediti.md index 3564eb1..6fc4435 100644 --- a/docs/0 - Crediti.md +++ b/docs/0 - Crediti.md @@ -4,3 +4,4 @@ - S: putt.wav by 170129 -- https://freesound.org/s/408260/ -- License: Creative Commons 0 - S: bonk.wav by el_boss -- https://freesound.org/s/628636/ -- License: Creative Commons 0 +- S: hole.wav by inbeeld -- https://freesound.org/s/21878/ -- License: Creative Commons 0 diff --git a/scenes/GolfBall.gd b/scenes/golf_ball.gd similarity index 73% rename from scenes/GolfBall.gd rename to scenes/golf_ball.gd index 45429c2..e4ac07b 100644 --- a/scenes/GolfBall.gd +++ b/scenes/golf_ball.gd @@ -14,15 +14,27 @@ class_name GolfBall @export var collision_volume_db: Curve ## The velocity at which the maximum volume of [member collision_volume_db] is played. @export var collision_volume_max_velocity: float +## Emitted when the ball enters the hole. +signal entered_hole(strokes: int) + +## How many strokes have been performed so far. +var strokes: int = 0 +## Whether the ball has entered the hole. +var in_hole: bool = false @onready var putt_controller: PuttController = $"PuttController" +@onready var hole_controller: HoleController = $"HoleController" +@onready var hole_sound: AudioStreamPlayer2D = $"HoleSound" func _on_putt(putt_vector: Vector2): + strokes += 1 velocity += putt_vector -func do_movement(movement: Vector2): +func do_movement(delta: float): + # How much the body should move in this physics step. + var movement = velocity * delta # How many times the body collided in the current physics step. var bounces: int = 0 # While the body should still move some space, and it isn't stuck in a perpetual loop of bouncing... @@ -40,7 +52,6 @@ func do_movement(movement: Vector2): if bounces == 1: # Determine with how much speed the body collided var collision_velocity = -collision_normal.dot(velocity) - print(collision_velocity) # Create a new sound instance var collision_sound_instance: AudioStreamPlayer2D = collision_sound.instantiate() # Set the sound volume based on the relative collision velocity @@ -58,9 +69,32 @@ func do_movement(movement: Vector2): velocity *= physics_bounce_coefficient -func _physics_process(delta): - do_movement(velocity * delta) - var new_velocity_length = max(0.0, velocity.length() - physics_friction) +func apply_friction(delta): + var new_velocity_length = max(0.0, velocity.length() - physics_friction * delta) velocity = velocity.normalized() * new_velocity_length - if new_velocity_length == 0.0: - putt_controller.can_putt = true + + +func check_has_stopped() -> bool: + return velocity.length() == 0.0 + + +func check_has_entered_hole() -> bool: + return check_has_stopped() and hole_controller.over_hole + + +func enter_hole(): + in_hole = true + visible = false + hole_sound.play() + entered_hole.emit(strokes) + print("[GolfBall] Entered hole in: ", strokes) + + +func _physics_process(delta): + if not in_hole: + do_movement(delta) + apply_friction(delta) + if check_has_entered_hole(): + enter_hole() + if check_has_stopped(): + putt_controller.can_putt = true diff --git a/scenes/golf_ball.tscn b/scenes/golf_ball.tscn index 597ee12..4319410 100644 --- a/scenes/golf_ball.tscn +++ b/scenes/golf_ball.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://ca06elq8io5wu"] +[gd_scene load_steps=10 format=3 uid="uid://ca06elq8io5wu"] -[ext_resource type="Script" path="res://scenes/GolfBall.gd" id="1_cnerg"] +[ext_resource type="Script" path="res://scenes/golf_ball.gd" id="1_1uswk"] [ext_resource type="Texture2D" uid="uid://bxyy3bwt7a5l2" path="res://sprites/circle.svg" id="2_mqlag"] [ext_resource type="PackedScene" uid="uid://cu03w8wxnkffb" path="res://scenes/putt_controller.tscn" id="3_rx2v7"] [ext_resource type="PackedScene" uid="uid://cj15ash4r3i4v" path="res://scenes/collision_sound.tscn" id="4_6m2yp"] +[ext_resource type="PackedScene" uid="uid://bf0a04t4b1wil" path="res://scenes/hole_controller.tscn" id="5_tdklt"] +[ext_resource type="AudioStream" uid="uid://crfybmbv6dbs4" path="res://sounds/hole.wav" id="6_08dpq"] [sub_resource type="Curve" id="Curve_v81ms"] min_value = -20.0 @@ -14,12 +16,14 @@ point_count = 2 [sub_resource type="CircleShape2D" id="CircleShape2D_3vk3q"] radius = 8.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_aigrf"] +radius = 1.41421 + [node name="GolfBall" type="CharacterBody2D"] -position = Vector2(146, 142) motion_mode = 1 wall_min_slide_angle = 0.0 -script = ExtResource("1_cnerg") -physics_friction = 1.0 +script = ExtResource("1_1uswk") +physics_friction = 60.0 physics_max_bounces = 4.0 physics_bounce_coefficient = 0.65 collision_sound = ExtResource("4_6m2yp") @@ -31,7 +35,17 @@ texture = ExtResource("2_mqlag") [node name="Shape" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_3vk3q") +debug_color = Color(0, 0.6, 0.701961, 0.419608) [node name="PuttController" parent="." instance=ExtResource("3_rx2v7")] +[node name="HoleController" parent="." instance=ExtResource("5_tdklt")] + +[node name="Shape" type="CollisionShape2D" parent="HoleController"] +shape = SubResource("CircleShape2D_aigrf") +debug_color = Color(0, 0.701961, 0.141176, 0.419608) + +[node name="HoleSound" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("6_08dpq") + [connection signal="putt" from="PuttController" to="." method="_on_putt"] diff --git a/scenes/golf_hole.gd b/scenes/golf_hole.gd new file mode 100644 index 0000000..f129dd3 --- /dev/null +++ b/scenes/golf_hole.gd @@ -0,0 +1,2 @@ +extends Area2D +class_name GolfHole diff --git a/scenes/golf_hole.tscn b/scenes/golf_hole.tscn new file mode 100644 index 0000000..8b0b12a --- /dev/null +++ b/scenes/golf_hole.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://df7t70153a3bb"] + +[ext_resource type="Script" path="res://scenes/golf_hole.gd" id="1_7ng0k"] +[ext_resource type="Texture2D" uid="uid://bxyy3bwt7a5l2" path="res://sprites/circle.svg" id="1_dw1g4"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_c8ayt"] +radius = 8.0 + +[node name="GolfHole" type="Area2D"] +scale = Vector2(1.05, 1.05) +script = ExtResource("1_7ng0k") + +[node name="Circle" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0.25098) +texture = ExtResource("1_dw1g4") + +[node name="Shape" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_c8ayt") +debug_color = Color(0, 0.701961, 0.141176, 0.419608) diff --git a/scenes/hole_controller.gd b/scenes/hole_controller.gd new file mode 100644 index 0000000..4f84551 --- /dev/null +++ b/scenes/hole_controller.gd @@ -0,0 +1,15 @@ +extends Area2D +class_name HoleController + + +var over_hole: bool = false + + +func _on_area_entered(area: Area2D): + if area is GolfHole: + over_hole = true + + +func _on_area_exited(area: Area2D): + if area is GolfHole: + over_hole = false diff --git a/scenes/hole_controller.tscn b/scenes/hole_controller.tscn new file mode 100644 index 0000000..2b6bfe0 --- /dev/null +++ b/scenes/hole_controller.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://bf0a04t4b1wil"] + +[ext_resource type="Script" path="res://scenes/hole_controller.gd" id="1_df7lg"] + +[node name="HoleController" type="Area2D"] +script = ExtResource("1_df7lg") + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] +[connection signal="area_exited" from="." to="." method="_on_area_exited"] diff --git a/scenes/main.tscn b/scenes/main.tscn index 8ea3867..0129774 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://b8f5t76nfdu5h"] +[gd_scene load_steps=4 format=3 uid="uid://b8f5t76nfdu5h"] [ext_resource type="PackedScene" uid="uid://ca06elq8io5wu" path="res://scenes/golf_ball.tscn" id="1_5j6ud"] [ext_resource type="TileSet" uid="uid://17esn8g8xqik" path="res://tiles/hole_tile_set.tres" id="1_rm16w"] +[ext_resource type="PackedScene" uid="uid://df7t70153a3bb" path="res://scenes/golf_hole.tscn" id="3_dn06g"] [node name="Main" type="Node"] @@ -13,3 +14,6 @@ metadata/_edit_lock_ = true [node name="GolfBall" parent="." instance=ExtResource("1_5j6ud")] position = Vector2(340, 229) + +[node name="GolfHole" parent="." instance=ExtResource("3_dn06g")] +position = Vector2(544, 333) diff --git a/scenes/PuttController.gd b/scenes/putt_controller.gd similarity index 86% rename from scenes/PuttController.gd rename to scenes/putt_controller.gd index f0ae324..06a89fa 100644 --- a/scenes/PuttController.gd +++ b/scenes/putt_controller.gd @@ -35,12 +35,12 @@ func _input(event: InputEvent): if not is_putting: start_putt(event.position) else: - push_warning("[PuttController] Attempted to start putt while another was in progress.") + push_warning("Attempted to start putt while another was in progress.") else: if is_putting: end_putt(event.position) else: - push_warning("[PuttController] Attempted to end putt while none was in progress.") + push_warning("Attempted to end putt while none was in progress.") if is_putting: update_putt_ghost(compute_putt(event.position, putt_start_point)) if event is InputEventMouseMotion: @@ -63,19 +63,16 @@ func compute_putt(start_position: Vector2, end_position: Vector2) -> Vector2: func start_putt(start_position: Vector2): - print("[PuttController] Starting putt at: ", start_position) visible = true is_putting = true putt_start_point = start_position func end_putt(end_position: Vector2): - print("[PuttController] Ending putt at: ", end_position) visible = false is_putting = false can_putt = false var putt_vector = compute_putt(putt_start_point, end_position) - print("[PuttController] Putt is: ", putt_vector) putt.emit(putt_vector) play_putt_sound(putt_vector) diff --git a/scenes/putt_controller.tscn b/scenes/putt_controller.tscn index 7885cf0..f468e78 100644 --- a/scenes/putt_controller.tscn +++ b/scenes/putt_controller.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=5 format=3 uid="uid://cu03w8wxnkffb"] -[ext_resource type="Script" path="res://scenes/PuttController.gd" id="1_ldg2x"] +[ext_resource type="Script" path="res://scenes/putt_controller.gd" id="1_rb6v1"] [ext_resource type="Texture2D" uid="uid://dvr4j6164rphg" path="res://sprites/square.svg" id="2_eblkx"] [ext_resource type="AudioStream" uid="uid://clm7wapsnjjlp" path="res://sounds/putt.wav" id="3_0eren"] @@ -13,7 +13,7 @@ point_count = 2 [node name="PuttController" type="Node2D"] visible = false modulate = Color(1, 1, 1, 0.25098) -script = ExtResource("1_ldg2x") +script = ExtResource("1_rb6v1") putt_max_impulse = 333.0 putt_drag_scale = 1.0 putt_ghost_scale = 0.3 diff --git a/sounds/bonk.wav.import b/sounds/bonk.wav.import index 34f4f99..852d274 100644 --- a/sounds/bonk.wav.import +++ b/sounds/bonk.wav.import @@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/bonk.wav-3ec20bb198e37143595fed23d3ff5d79.sam [params] force/8_bit=false -force/mono=false +force/mono=true force/max_rate=false force/max_rate_hz=44100 edit/trim=false diff --git a/sounds/hole.wav b/sounds/hole.wav new file mode 100644 index 0000000..c1ca049 --- /dev/null +++ b/sounds/hole.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66eec7449d8d70ff4dbb1d06099792340d13bdbaecf7ed831dc3fd5d0614dee0 +size 147770 diff --git a/sounds/hole.wav.import b/sounds/hole.wav.import new file mode 100644 index 0000000..6f3f657 --- /dev/null +++ b/sounds/hole.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://crfybmbv6dbs4" +path="res://.godot/imported/hole.wav-dd9300b81c964cd47886e68b30fe1f15.sample" + +[deps] + +source_file="res://sounds/hole.wav" +dest_files=["res://.godot/imported/hole.wav-dd9300b81c964cd47886e68b30fe1f15.sample"] + +[params] + +force/8_bit=false +force/mono=true +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/sounds/putt.wav.import b/sounds/putt.wav.import index 9a53ea4..0513df5 100644 --- a/sounds/putt.wav.import +++ b/sounds/putt.wav.import @@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/putt.wav-1940451c4ca6b080b45b073564e36160.sam [params] force/8_bit=false -force/mono=false +force/mono=true force/max_rate=false force/max_rate_hz=44100 edit/trim=false