mirror of
https://github.com/Steffo99/nanogolf.git
synced 2024-11-21 23:54:21 +00:00
Add hole
This commit is contained in:
parent
2f1ef9a4d6
commit
bf0578ddcc
14 changed files with 144 additions and 22 deletions
|
@ -4,3 +4,4 @@
|
||||||
|
|
||||||
- S: putt.wav by 170129 -- https://freesound.org/s/408260/ -- License: Creative Commons 0
|
- 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: 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
|
||||||
|
|
|
@ -14,15 +14,27 @@ class_name GolfBall
|
||||||
@export var collision_volume_db: Curve
|
@export var collision_volume_db: Curve
|
||||||
## The velocity at which the maximum volume of [member collision_volume_db] is played.
|
## The velocity at which the maximum volume of [member collision_volume_db] is played.
|
||||||
@export var collision_volume_max_velocity: float
|
@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 putt_controller: PuttController = $"PuttController"
|
||||||
|
@onready var hole_controller: HoleController = $"HoleController"
|
||||||
|
@onready var hole_sound: AudioStreamPlayer2D = $"HoleSound"
|
||||||
|
|
||||||
|
|
||||||
func _on_putt(putt_vector: Vector2):
|
func _on_putt(putt_vector: Vector2):
|
||||||
|
strokes += 1
|
||||||
velocity += putt_vector
|
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.
|
# How many times the body collided in the current physics step.
|
||||||
var bounces: int = 0
|
var bounces: int = 0
|
||||||
# While the body should still move some space, and it isn't stuck in a perpetual loop of bouncing...
|
# 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:
|
if bounces == 1:
|
||||||
# Determine with how much speed the body collided
|
# Determine with how much speed the body collided
|
||||||
var collision_velocity = -collision_normal.dot(velocity)
|
var collision_velocity = -collision_normal.dot(velocity)
|
||||||
print(collision_velocity)
|
|
||||||
# Create a new sound instance
|
# Create a new sound instance
|
||||||
var collision_sound_instance: AudioStreamPlayer2D = collision_sound.instantiate()
|
var collision_sound_instance: AudioStreamPlayer2D = collision_sound.instantiate()
|
||||||
# Set the sound volume based on the relative collision velocity
|
# Set the sound volume based on the relative collision velocity
|
||||||
|
@ -58,9 +69,32 @@ func do_movement(movement: Vector2):
|
||||||
velocity *= physics_bounce_coefficient
|
velocity *= physics_bounce_coefficient
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta):
|
func apply_friction(delta):
|
||||||
do_movement(velocity * delta)
|
var new_velocity_length = max(0.0, velocity.length() - physics_friction * delta)
|
||||||
var new_velocity_length = max(0.0, velocity.length() - physics_friction)
|
|
||||||
velocity = velocity.normalized() * new_velocity_length
|
velocity = velocity.normalized() * new_velocity_length
|
||||||
if new_velocity_length == 0.0:
|
|
||||||
|
|
||||||
|
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
|
putt_controller.can_putt = true
|
|
@ -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="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://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://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"]
|
[sub_resource type="Curve" id="Curve_v81ms"]
|
||||||
min_value = -20.0
|
min_value = -20.0
|
||||||
|
@ -14,12 +16,14 @@ point_count = 2
|
||||||
[sub_resource type="CircleShape2D" id="CircleShape2D_3vk3q"]
|
[sub_resource type="CircleShape2D" id="CircleShape2D_3vk3q"]
|
||||||
radius = 8.0
|
radius = 8.0
|
||||||
|
|
||||||
|
[sub_resource type="CircleShape2D" id="CircleShape2D_aigrf"]
|
||||||
|
radius = 1.41421
|
||||||
|
|
||||||
[node name="GolfBall" type="CharacterBody2D"]
|
[node name="GolfBall" type="CharacterBody2D"]
|
||||||
position = Vector2(146, 142)
|
|
||||||
motion_mode = 1
|
motion_mode = 1
|
||||||
wall_min_slide_angle = 0.0
|
wall_min_slide_angle = 0.0
|
||||||
script = ExtResource("1_cnerg")
|
script = ExtResource("1_1uswk")
|
||||||
physics_friction = 1.0
|
physics_friction = 60.0
|
||||||
physics_max_bounces = 4.0
|
physics_max_bounces = 4.0
|
||||||
physics_bounce_coefficient = 0.65
|
physics_bounce_coefficient = 0.65
|
||||||
collision_sound = ExtResource("4_6m2yp")
|
collision_sound = ExtResource("4_6m2yp")
|
||||||
|
@ -31,7 +35,17 @@ texture = ExtResource("2_mqlag")
|
||||||
|
|
||||||
[node name="Shape" type="CollisionShape2D" parent="."]
|
[node name="Shape" type="CollisionShape2D" parent="."]
|
||||||
shape = SubResource("CircleShape2D_3vk3q")
|
shape = SubResource("CircleShape2D_3vk3q")
|
||||||
|
debug_color = Color(0, 0.6, 0.701961, 0.419608)
|
||||||
|
|
||||||
[node name="PuttController" parent="." instance=ExtResource("3_rx2v7")]
|
[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"]
|
[connection signal="putt" from="PuttController" to="." method="_on_putt"]
|
||||||
|
|
2
scenes/golf_hole.gd
Normal file
2
scenes/golf_hole.gd
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
extends Area2D
|
||||||
|
class_name GolfHole
|
19
scenes/golf_hole.tscn
Normal file
19
scenes/golf_hole.tscn
Normal file
|
@ -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)
|
15
scenes/hole_controller.gd
Normal file
15
scenes/hole_controller.gd
Normal file
|
@ -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
|
9
scenes/hole_controller.tscn
Normal file
9
scenes/hole_controller.tscn
Normal file
|
@ -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"]
|
|
@ -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="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="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"]
|
[node name="Main" type="Node"]
|
||||||
|
|
||||||
|
@ -13,3 +14,6 @@ metadata/_edit_lock_ = true
|
||||||
|
|
||||||
[node name="GolfBall" parent="." instance=ExtResource("1_5j6ud")]
|
[node name="GolfBall" parent="." instance=ExtResource("1_5j6ud")]
|
||||||
position = Vector2(340, 229)
|
position = Vector2(340, 229)
|
||||||
|
|
||||||
|
[node name="GolfHole" parent="." instance=ExtResource("3_dn06g")]
|
||||||
|
position = Vector2(544, 333)
|
||||||
|
|
|
@ -35,12 +35,12 @@ func _input(event: InputEvent):
|
||||||
if not is_putting:
|
if not is_putting:
|
||||||
start_putt(event.position)
|
start_putt(event.position)
|
||||||
else:
|
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:
|
else:
|
||||||
if is_putting:
|
if is_putting:
|
||||||
end_putt(event.position)
|
end_putt(event.position)
|
||||||
else:
|
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:
|
if is_putting:
|
||||||
update_putt_ghost(compute_putt(event.position, putt_start_point))
|
update_putt_ghost(compute_putt(event.position, putt_start_point))
|
||||||
if event is InputEventMouseMotion:
|
if event is InputEventMouseMotion:
|
||||||
|
@ -63,19 +63,16 @@ func compute_putt(start_position: Vector2, end_position: Vector2) -> Vector2:
|
||||||
|
|
||||||
|
|
||||||
func start_putt(start_position: Vector2):
|
func start_putt(start_position: Vector2):
|
||||||
print("[PuttController] Starting putt at: ", start_position)
|
|
||||||
visible = true
|
visible = true
|
||||||
is_putting = true
|
is_putting = true
|
||||||
putt_start_point = start_position
|
putt_start_point = start_position
|
||||||
|
|
||||||
|
|
||||||
func end_putt(end_position: Vector2):
|
func end_putt(end_position: Vector2):
|
||||||
print("[PuttController] Ending putt at: ", end_position)
|
|
||||||
visible = false
|
visible = false
|
||||||
is_putting = false
|
is_putting = false
|
||||||
can_putt = false
|
can_putt = false
|
||||||
var putt_vector = compute_putt(putt_start_point, end_position)
|
var putt_vector = compute_putt(putt_start_point, end_position)
|
||||||
print("[PuttController] Putt is: ", putt_vector)
|
|
||||||
putt.emit(putt_vector)
|
putt.emit(putt_vector)
|
||||||
play_putt_sound(putt_vector)
|
play_putt_sound(putt_vector)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://cu03w8wxnkffb"]
|
[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="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"]
|
[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"]
|
[node name="PuttController" type="Node2D"]
|
||||||
visible = false
|
visible = false
|
||||||
modulate = Color(1, 1, 1, 0.25098)
|
modulate = Color(1, 1, 1, 0.25098)
|
||||||
script = ExtResource("1_ldg2x")
|
script = ExtResource("1_rb6v1")
|
||||||
putt_max_impulse = 333.0
|
putt_max_impulse = 333.0
|
||||||
putt_drag_scale = 1.0
|
putt_drag_scale = 1.0
|
||||||
putt_ghost_scale = 0.3
|
putt_ghost_scale = 0.3
|
||||||
|
|
|
@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/bonk.wav-3ec20bb198e37143595fed23d3ff5d79.sam
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
force/8_bit=false
|
force/8_bit=false
|
||||||
force/mono=false
|
force/mono=true
|
||||||
force/max_rate=false
|
force/max_rate=false
|
||||||
force/max_rate_hz=44100
|
force/max_rate_hz=44100
|
||||||
edit/trim=false
|
edit/trim=false
|
||||||
|
|
3
sounds/hole.wav
Normal file
3
sounds/hole.wav
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:66eec7449d8d70ff4dbb1d06099792340d13bdbaecf7ed831dc3fd5d0614dee0
|
||||||
|
size 147770
|
24
sounds/hole.wav.import
Normal file
24
sounds/hole.wav.import
Normal file
|
@ -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
|
|
@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/putt.wav-1940451c4ca6b080b45b073564e36160.sam
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
force/8_bit=false
|
force/8_bit=false
|
||||||
force/mono=false
|
force/mono=true
|
||||||
force/max_rate=false
|
force/max_rate=false
|
||||||
force/max_rate_hz=44100
|
force/max_rate_hz=44100
|
||||||
edit/trim=false
|
edit/trim=false
|
||||||
|
|
Loading…
Reference in a new issue