diff --git a/assets/sounds/pixabay/dash/sources.txt b/assets/sounds/pixabay/dash/sources.txt new file mode 100644 index 0000000..f9a2b87 --- /dev/null +++ b/assets/sounds/pixabay/dash/sources.txt @@ -0,0 +1,9 @@ +punch-1-166694.mp3 +- license: +- source: https://pixabay.com/sound-effects/punch-1-166694/ +- author: floraphonic (https://pixabay.com/users/floraphonic-38928062/) + +whoosh-6316.mp3 +- license: +- source: https://pixabay.com/sound-effects/whoosh-6316/ +- author: Pixabay (https://pixabay.com/users/pixabay-1/) diff --git a/assets/sounds/pixabay/dash/whoosh-6316.mp3 b/assets/sounds/pixabay/dash/whoosh-6316.mp3 new file mode 100644 index 0000000..38c7d5a Binary files /dev/null and b/assets/sounds/pixabay/dash/whoosh-6316.mp3 differ diff --git a/assets/sounds/pixabay/dash/whoosh-6316.mp3.import b/assets/sounds/pixabay/dash/whoosh-6316.mp3.import new file mode 100644 index 0000000..3c9bbfd --- /dev/null +++ b/assets/sounds/pixabay/dash/whoosh-6316.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://bhbhh78j5rkfe" +path="res://.godot/imported/whoosh-6316.mp3-c09ddc29973a4f106e83f9f9f20b7c35.mp3str" + +[deps] + +source_file="res://assets/sounds/pixabay/dash/whoosh-6316.mp3" +dest_files=["res://.godot/imported/whoosh-6316.mp3-c09ddc29973a4f106e83f9f9f20b7c35.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3 b/assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3 new file mode 100644 index 0000000..494b2ce Binary files /dev/null and b/assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3 differ diff --git a/assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3.import b/assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3.import new file mode 100644 index 0000000..0e3485e --- /dev/null +++ b/assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://qeg12ynvjvy0" +path="res://.godot/imported/081895_impact_wav-43951.mp3-b97c4fdee4abc0cae63af4d92e0a6e8a.mp3str" + +[deps] + +source_file="res://assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3" +dest_files=["res://.godot/imported/081895_impact_wav-43951.mp3-b97c4fdee4abc0cae63af4d92e0a6e8a.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/sounds/pixabay/explosion/sources.txt b/assets/sounds/pixabay/explosion/sources.txt new file mode 100644 index 0000000..52e20ae --- /dev/null +++ b/assets/sounds/pixabay/explosion/sources.txt @@ -0,0 +1,4 @@ +081895_impact_wav-43951.mp3 +license: +source: https://pixabay.com/sound-effects/081895-impact-wav-43951/ +author: Pixabay (https://pixabay.com/users/pixabay-1/) diff --git a/assets/sounds/pixabay/sfx/game-teleport-90735.mp3 b/assets/sounds/pixabay/sfx/game-teleport-90735.mp3 new file mode 100644 index 0000000..1a0c20c Binary files /dev/null and b/assets/sounds/pixabay/sfx/game-teleport-90735.mp3 differ diff --git a/assets/sounds/pixabay/sfx/game-teleport-90735.mp3.import b/assets/sounds/pixabay/sfx/game-teleport-90735.mp3.import new file mode 100644 index 0000000..e6c2c4a --- /dev/null +++ b/assets/sounds/pixabay/sfx/game-teleport-90735.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://b33xjins3dqpp" +path="res://.godot/imported/game-teleport-90735.mp3-112905f9f7cb1de6d452cc344a4b2de8.mp3str" + +[deps] + +source_file="res://assets/sounds/pixabay/sfx/game-teleport-90735.mp3" +dest_files=["res://.godot/imported/game-teleport-90735.mp3-112905f9f7cb1de6d452cc344a4b2de8.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/entities/BombEmitter.gd b/entities/BombEmitter.gd index 70ca425..35ae1c0 100644 --- a/entities/BombEmitter.gd +++ b/entities/BombEmitter.gd @@ -13,7 +13,7 @@ func _ready(): collision_area.connect("body_entered", on_body_enter) # Called every frame. 'delta' is the elapsed time since the previous frame. -func _physics_process(delta): +func _physics_process(_delta): if processed: queue_free() diff --git a/entities/BombEmitter.tscn b/entities/BombEmitter.tscn index cafcf05..b91a03f 100644 --- a/entities/BombEmitter.tscn +++ b/entities/BombEmitter.tscn @@ -1,17 +1,15 @@ -[gd_scene load_steps=3 format=3 uid="uid://dx6fxak21icvs"] +[gd_scene load_steps=3 format=3 uid="uid://ck1gd38drird6"] -[ext_resource type="Script" path="res://entities/BombEmitter.gd" id="1_110pt"] +[ext_resource type="Script" path="res://entities/BombEmitter.gd" id="1_nvjs2"] -[sub_resource type="CylinderShape3D" id="CylinderShape3D_7yhwp"] +[sub_resource type="CylinderShape3D" id="CylinderShape3D_yy20u"] height = 0.5 -radius = 3.0 +radius = 5.0 [node name="BombEmitter" type="Node3D"] -script = ExtResource("1_110pt") +script = ExtResource("1_nvjs2") [node name="Area3D" type="Area3D" parent="."] -collision_layer = 0 -collision_mask = 4 [node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] -shape = SubResource("CylinderShape3D_7yhwp") +shape = SubResource("CylinderShape3D_yy20u") diff --git a/entities/Player.gd b/entities/Player.gd index fe89096..8ffc4b9 100644 --- a/entities/Player.gd +++ b/entities/Player.gd @@ -14,6 +14,9 @@ class_name Player extends CharacterBody3D @onready var geometry: MeshInstance3D = $Geometry @onready var collision: CollisionShape3D = $CollisionShape3D +@onready var dash_stream_player: AudioStreamPlayer = $DashAudioStreamPlayer +@onready var explosion_stream_player: AudioStreamPlayer = $ExplosionAudioStreamPlayer +@onready var spawn_stream_player: AudioStreamPlayer = $SpawnAudioStreamPlayer var bomb_emitter_scene = preload("res://entities/BombEmitter.tscn") @@ -143,6 +146,8 @@ func calc_coloring_position(): func on_player_spawn(): print ("Player " + str(self) + ": spawning") + spawn_stream_player.pitch_scale = 0.8 + randf () * 0.4 + spawn_stream_player.play() func on_player_falling(): print ("Player " + str(self) + ": falling") @@ -154,12 +159,17 @@ func on_dash(): is_dashing = true; dash_time = DASH_DURATION energy = max (0, energy - DASH_ENERGY) + dash_stream_player.pitch_scale = 0.9 + randf () * 0.2 + dash_stream_player.play() func on_drop_bomb(): coloring_bomb_sprite.visible = true; bomb_time = BOMB_DURATION energy = max (0, energy - BOMB_ENERGY) + explosion_stream_player.pitch_scale = 0.6 + randf () * 0.2 + explosion_stream_player.play() + var bomb_emitter : BombEmitter = bomb_emitter_scene.instantiate() bomb_emitter.global_position = global_position get_parent_node_3d().add_child(bomb_emitter) diff --git a/entities/Player.tscn b/entities/Player.tscn index d824754..1e63fc4 100644 --- a/entities/Player.tscn +++ b/entities/Player.tscn @@ -1,6 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://bfyjtfdko3l7o"] +[gd_scene load_steps=7 format=3 uid="uid://bfyjtfdko3l7o"] [ext_resource type="Script" path="res://entities/Player.gd" id="1_w5gy0"] +[ext_resource type="AudioStream" uid="uid://bhbhh78j5rkfe" path="res://assets/sounds/pixabay/dash/whoosh-6316.mp3" id="2_ykhbt"] +[ext_resource type="AudioStream" uid="uid://qeg12ynvjvy0" path="res://assets/sounds/pixabay/explosion/081895_impact_wav-43951.mp3" id="3_mjsr0"] +[ext_resource type="AudioStream" uid="uid://b33xjins3dqpp" path="res://assets/sounds/pixabay/sfx/game-teleport-90735.mp3" id="4_y7abk"] [sub_resource type="BoxMesh" id="BoxMesh_yle83"] size = Vector3(0.24, 0.75, 0.24) @@ -29,3 +32,14 @@ mesh = SubResource("BoxMesh_yle83") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.496337, 0) shape = SubResource("CylinderShape3D_rwgp3") + +[node name="DashAudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("2_ykhbt") + +[node name="ExplosionAudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("3_mjsr0") +volume_db = -15.707 +pitch_scale = 0.84 + +[node name="SpawnAudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_y7abk") diff --git a/entities/SpawnPoint.gd b/entities/SpawnPoint.gd index 11c2039..0e01a56 100644 --- a/entities/SpawnPoint.gd +++ b/entities/SpawnPoint.gd @@ -11,6 +11,11 @@ func _ready(): area3d.connect("body_entered", on_player_enter) area3d.connect("body_exited", on_player_exited) +func _process(_delta): + for player: Player in near_players: + if player.state == Player.PlayerState.Dead: + near_players.erase(player) + func on_player_enter(node: Node3D): var player: Player = node as Player if node == null: diff --git a/project.godot b/project.godot index c05adf4..e437ec2 100644 --- a/project.godot +++ b/project.godot @@ -126,7 +126,7 @@ move={ 3d_physics/layer_1="World" 3d_physics/layer_2="Obstacles" 3d_physics/layer_3="Player" -3d_physics/layer_4="Collectibles" +3d_physics/layer_4="Clutter" [rendering] diff --git a/scenes/World.gd b/scenes/World.gd index 0a64fff..7a4a05e 100644 --- a/scenes/World.gd +++ b/scenes/World.gd @@ -1,6 +1,6 @@ class_name World extends Node3D -@export var players: Array +var players: Array @onready var score_update_timer: Timer = $ScoreUpdateTimer @onready var pixel_count_compute_shader: PixelCountComputeShader = $PixelCountComputeShader @@ -9,6 +9,8 @@ class_name World extends Node3D @onready var level: Node3D = $Level @onready var world_coloring_viewport: SubViewport = $WorldColoringViewport +var player_scene = preload("res://entities/Player.tscn") + const GAME_DURATION_SECONDS = 20 var camera_position: Vector3; @@ -28,30 +30,16 @@ var game_state_last : GameState = GameState.Finished # Called when the node enters the scene tree for the first time. func _ready(): - var player1: CharacterBody3D = $Player1 - var player2: CharacterBody3D = $Player2 - - players.append(player1) - players.append(player2) - - if players.size() == 1: - world_coloring_material = load("res://materials/WorldColoringMaterialPass.tres") - world_coloring_material.set_shader_parameter("world_color_texture", world_coloring_viewport.get_texture()) - else: - world_coloring_material = load("res://materials/WorldColoringMaterialPassVersus.tres") - world_coloring_material.set_shader_parameter("world_color_texture", world_coloring_viewport.get_texture()) - camera_position = camera.global_position score_update_timer.connect("timeout", update_score) find_spawn_points(level) - - for player: Player in players: - player.state = player.PlayerState.Dead - + + spawn_players() apply_world_coloring_recursive(level) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): if game_state_last != game_state: @@ -112,7 +100,7 @@ func _physics_process(_delta): if not spawn_point.is_occupied(): occupied = false - player.global_position = spawn_point.global_position + player.global_position = spawn_point.global_position + Vector3.UP * 2 player.state = Player.PlayerState.Alive spawn_point.near_players.append(player) @@ -150,6 +138,42 @@ func update_score(): if players.size() > 1: players[1].score = pixel_count_compute_shader.blue_score +func spawn_players(): + var players_node = $Players + + var player1: Player = player_scene.instantiate() + player1.color = Color(1, 0, 0, 1) + player1.coloring_sprite_path = world_coloring_viewport.get_node("Player1Sprite").get_path() + player1.coloring_bomb_sprite_path = world_coloring_viewport.get_node("Player1BombSprite").get_path() + var player2: Player = player_scene.instantiate() + player2.color = Color(0, 0, 1, 1) + player2.coloring_sprite_path = world_coloring_viewport.get_node("Player2Sprite").get_path() + player2.coloring_bomb_sprite_path = world_coloring_viewport.get_node("Player2BombSprite").get_path() + + players_node.add_child(player1) + players_node.add_child(player2) + + players.clear() + + players.append(player1) + players.append(player2) + + if players.size() == 1: + world_coloring_material = load("res://materials/WorldColoringMaterialPass.tres") + world_coloring_material.set_shader_parameter("world_color_texture", world_coloring_viewport.get_texture()) + else: + world_coloring_material = load("res://materials/WorldColoringMaterialPassVersus.tres") + world_coloring_material.set_shader_parameter("world_color_texture", world_coloring_viewport.get_texture()) + + for player: Player in players: + player.state = player.PlayerState.Dead + +func remove_players(): + var players_node = $Players + + for player: Player in players_node.get_children(): + player.queue_free() + func on_game_startup(): print("Switching to startup") stop_gameplay() diff --git a/scenes/World.tscn b/scenes/World.tscn index 20db0ef..d20f00f 100644 --- a/scenes/World.tscn +++ b/scenes/World.tscn @@ -136,3 +136,5 @@ player_index = 1 [node name="SpawnPointPlayer3" parent="Level" instance=ExtResource("8_ykvyf")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.55561, 0, 3.26255) + +[node name="Players" type="Node" parent="."]