Game States kind of working
This commit is contained in:
		
							parent
							
								
									eff6a69855
								
							
						
					
					
						commit
						a04f8196f9
					
				@ -26,6 +26,7 @@ enum PlayerState {
 | 
				
			|||||||
var score : int = 0
 | 
					var score : int = 0
 | 
				
			||||||
var energy : float = 1.0
 | 
					var energy : float = 1.0
 | 
				
			||||||
var state : PlayerState = PlayerState.Alive
 | 
					var state : PlayerState = PlayerState.Alive
 | 
				
			||||||
 | 
					var state_last : PlayerState = PlayerState.Dead
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var radius = 0.15
 | 
					var radius = 0.15
 | 
				
			||||||
var angle = 0
 | 
					var angle = 0
 | 
				
			||||||
@ -36,7 +37,6 @@ var coloring_sprite : Sprite2D
 | 
				
			|||||||
var coloring_bomb_sprite : Sprite2D
 | 
					var coloring_bomb_sprite : Sprite2D
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const SPEED = 5.0
 | 
					const SPEED = 5.0
 | 
				
			||||||
const JUMP_VELOCITY = 4.5
 | 
					 | 
				
			||||||
const DASH_SPEED: float = 20
 | 
					const DASH_SPEED: float = 20
 | 
				
			||||||
const DASH_DURATION: float = 0.2
 | 
					const DASH_DURATION: float = 0.2
 | 
				
			||||||
const BOMB_DURATION: float = 0.1
 | 
					const BOMB_DURATION: float = 0.1
 | 
				
			||||||
@ -53,8 +53,19 @@ func _ready():
 | 
				
			|||||||
	coloring_bomb_sprite.visible = false
 | 
						coloring_bomb_sprite.visible = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _physics_process(delta):
 | 
					func _physics_process(delta):
 | 
				
			||||||
	# Add the gravity.
 | 
						if state_last != state:
 | 
				
			||||||
	if not is_on_floor():
 | 
							if state == PlayerState.Alive:
 | 
				
			||||||
 | 
								on_player_spawn()
 | 
				
			||||||
 | 
							elif state == PlayerState.Falling:
 | 
				
			||||||
 | 
								on_player_falling()
 | 
				
			||||||
 | 
							elif state == PlayerState.Dead:
 | 
				
			||||||
 | 
								on_player_dead()
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							state_last = state
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if global_position.y < -5:
 | 
				
			||||||
 | 
							state = PlayerState.Dead
 | 
				
			||||||
 | 
						elif not is_on_floor():
 | 
				
			||||||
		if not is_dashing:
 | 
							if not is_dashing:
 | 
				
			||||||
			velocity.y -= gravity * delta
 | 
								velocity.y -= gravity * delta
 | 
				
			||||||
			state = PlayerState.Falling
 | 
								state = PlayerState.Falling
 | 
				
			||||||
@ -62,15 +73,12 @@ func _physics_process(delta):
 | 
				
			|||||||
		state = PlayerState.Alive
 | 
							state = PlayerState.Alive
 | 
				
			||||||
	elif state == PlayerState.Dead:
 | 
						elif state == PlayerState.Dead:
 | 
				
			||||||
		visible = false
 | 
							visible = false
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
	elif state == PlayerState.Alive:
 | 
						elif state == PlayerState.Alive:
 | 
				
			||||||
		visible = true
 | 
							visible = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coloring_sprite.visible = state == PlayerState.Alive
 | 
						coloring_sprite.visible = state == PlayerState.Alive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Handle jump.
 | 
					 | 
				
			||||||
	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
 | 
					 | 
				
			||||||
		velocity.y = JUMP_VELOCITY
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if bomb_time > 0:
 | 
						if bomb_time > 0:
 | 
				
			||||||
		bomb_time -= delta
 | 
							bomb_time -= delta
 | 
				
			||||||
		if bomb_time <= 0:
 | 
							if bomb_time <= 0:
 | 
				
			||||||
@ -95,7 +103,7 @@ func _physics_process(delta):
 | 
				
			|||||||
		velocity.z = move_toward(velocity.z, 0, SPEED)
 | 
							velocity.z = move_toward(velocity.z, 0, SPEED)
 | 
				
			||||||
		geometry.global_basis = Basis.from_euler(Vector3(0, -angle, 0))
 | 
							geometry.global_basis = Basis.from_euler(Vector3(0, -angle, 0))
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if Input.is_action_just_pressed(dash_action):
 | 
						if state == PlayerState.Alive and Input.is_action_just_pressed(dash_action):
 | 
				
			||||||
		is_dashing = true;
 | 
							is_dashing = true;
 | 
				
			||||||
		dash_time = DASH_DURATION
 | 
							dash_time = DASH_DURATION
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
@ -117,3 +125,12 @@ func _physics_process(delta):
 | 
				
			|||||||
func calc_coloring_position():
 | 
					func calc_coloring_position():
 | 
				
			||||||
	var result = Vector2 (global_position.x * 10 + 512, global_position.z * 10 + 512)
 | 
						var result = Vector2 (global_position.x * 10 + 512, global_position.z * 10 + 512)
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_player_spawn():
 | 
				
			||||||
 | 
						print ("Player " + 	str(self) + ": spawning")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_player_falling():
 | 
				
			||||||
 | 
						print ("Player " + str(self) + ": falling")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_player_dead():
 | 
				
			||||||
 | 
						print ("Player " + str(self) + ": death")
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,7 @@ func on_player_enter(node: Node3D):
 | 
				
			|||||||
	if node == null:
 | 
						if node == null:
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if not near_players.find(player):
 | 
						if near_players.find(player) == -1:
 | 
				
			||||||
		near_players.append(player)
 | 
							near_players.append(player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func on_player_exited(node: Node3D):
 | 
					func on_player_exited(node: Node3D):
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,20 @@ project/assembly_name="DashBoomColorClash"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[input]
 | 
					[input]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ui_accept={
 | 
				
			||||||
 | 
					"deadzone": 0.5,
 | 
				
			||||||
 | 
					"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
 | 
				
			||||||
 | 
					, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
 | 
				
			||||||
 | 
					, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"echo":false,"script":null)
 | 
				
			||||||
 | 
					, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null)
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					ui_cancel={
 | 
				
			||||||
 | 
					"deadzone": 0.5,
 | 
				
			||||||
 | 
					"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
 | 
				
			||||||
 | 
					, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null)
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
move_up_p1={
 | 
					move_up_p1={
 | 
				
			||||||
"deadzone": 0.5,
 | 
					"deadzone": 0.5,
 | 
				
			||||||
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
 | 
					"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										118
									
								
								scenes/Game.tscn
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								scenes/Game.tscn
									
									
									
									
									
								
							@ -1,8 +1,7 @@
 | 
				
			|||||||
[gd_scene load_steps=8 format=3 uid="uid://rd48gl8k5x34"]
 | 
					[gd_scene load_steps=6 format=3 uid="uid://rd48gl8k5x34"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Script" path="res://Game.gd" id="1_7jqda"]
 | 
					[ext_resource type="Theme" uid="uid://bb8mjy6l7umui" path="res://themes/GameUI.tres" id="2_eun58"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://b1nm5h3yccr16" path="res://scenes/World.tscn" id="2_voimb"]
 | 
					[ext_resource type="PackedScene" uid="uid://b1nm5h3yccr16" path="res://scenes/World.tscn" id="2_voimb"]
 | 
				
			||||||
[ext_resource type="FontFile" uid="uid://bf6q51e8x2s1h" path="res://assets/fonts/Bangers-Regular/Bangers-Regular.ttf" id="3_52dp0"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://scenes/GameUI.gd" id="4_2tdl1"]
 | 
					[ext_resource type="Script" path="res://scenes/GameUI.gd" id="4_2tdl1"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[sub_resource type="World3D" id="World3D_5g233"]
 | 
					[sub_resource type="World3D" id="World3D_5g233"]
 | 
				
			||||||
@ -10,12 +9,7 @@
 | 
				
			|||||||
[sub_resource type="ViewportTexture" id="ViewportTexture_2lmj8"]
 | 
					[sub_resource type="ViewportTexture" id="ViewportTexture_2lmj8"]
 | 
				
			||||||
viewport_path = NodePath("Viewport")
 | 
					viewport_path = NodePath("Viewport")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[sub_resource type="Theme" id="Theme_qtmht"]
 | 
					 | 
				
			||||||
default_font = ExtResource("3_52dp0")
 | 
					 | 
				
			||||||
default_font_size = 30
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Game" type="Node"]
 | 
					[node name="Game" type="Node"]
 | 
				
			||||||
script = ExtResource("1_7jqda")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Viewport" type="SubViewport" parent="."]
 | 
					[node name="Viewport" type="SubViewport" parent="."]
 | 
				
			||||||
own_world_3d = true
 | 
					own_world_3d = true
 | 
				
			||||||
@ -54,12 +48,6 @@ grow_horizontal = 2
 | 
				
			|||||||
size_flags_horizontal = 4
 | 
					size_flags_horizontal = 4
 | 
				
			||||||
size_flags_vertical = 4
 | 
					size_flags_vertical = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Panel2" type="Panel" parent="."]
 | 
					 | 
				
			||||||
custom_minimum_size = Vector2(0, 80)
 | 
					 | 
				
			||||||
anchors_preset = 10
 | 
					 | 
				
			||||||
anchor_right = 1.0
 | 
					 | 
				
			||||||
grow_horizontal = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="GameUI" type="Control" parent="."]
 | 
					[node name="GameUI" type="Control" parent="."]
 | 
				
			||||||
layout_mode = 3
 | 
					layout_mode = 3
 | 
				
			||||||
anchors_preset = 15
 | 
					anchors_preset = 15
 | 
				
			||||||
@ -67,39 +55,121 @@ anchor_right = 1.0
 | 
				
			|||||||
anchor_bottom = 1.0
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
grow_horizontal = 2
 | 
					grow_horizontal = 2
 | 
				
			||||||
grow_vertical = 2
 | 
					grow_vertical = 2
 | 
				
			||||||
theme = SubResource("Theme_qtmht")
 | 
					theme = ExtResource("2_eun58")
 | 
				
			||||||
script = ExtResource("4_2tdl1")
 | 
					script = ExtResource("4_2tdl1")
 | 
				
			||||||
world_path = NodePath("../Viewport/World")
 | 
					world_path = NodePath("../Viewport/World")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Player1Widgets" type="VBoxContainer" parent="GameUI"]
 | 
					[node name="GameStartupWidgets" type="Panel" parent="GameUI"]
 | 
				
			||||||
 | 
					visible = false
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 15
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					theme = ExtResource("2_eun58")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Label" type="Label" parent="GameUI/GameStartupWidgets"]
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 8
 | 
				
			||||||
 | 
					anchor_left = 0.5
 | 
				
			||||||
 | 
					anchor_top = 0.5
 | 
				
			||||||
 | 
					anchor_right = 0.5
 | 
				
			||||||
 | 
					anchor_bottom = 0.5
 | 
				
			||||||
 | 
					offset_left = -27.5
 | 
				
			||||||
 | 
					offset_top = -11.5
 | 
				
			||||||
 | 
					offset_right = 27.5
 | 
				
			||||||
 | 
					offset_bottom = 11.5
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					theme_override_font_sizes/font_size = 120
 | 
				
			||||||
 | 
					text = "Ready?"
 | 
				
			||||||
 | 
					horizontal_alignment = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="GameFinishedWidgets" type="Panel" parent="GameUI"]
 | 
				
			||||||
 | 
					visible = false
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 15
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					theme = ExtResource("2_eun58")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Label" type="Label" parent="GameUI/GameFinishedWidgets"]
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 8
 | 
				
			||||||
 | 
					anchor_left = 0.5
 | 
				
			||||||
 | 
					anchor_top = 0.5
 | 
				
			||||||
 | 
					anchor_right = 0.5
 | 
				
			||||||
 | 
					anchor_bottom = 0.5
 | 
				
			||||||
 | 
					offset_left = -27.5
 | 
				
			||||||
 | 
					offset_top = -11.5
 | 
				
			||||||
 | 
					offset_right = 27.5
 | 
				
			||||||
 | 
					offset_bottom = 11.5
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					theme_override_font_sizes/font_size = 120
 | 
				
			||||||
 | 
					text = "Game Over!"
 | 
				
			||||||
 | 
					horizontal_alignment = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="GameRunningWidgets" type="Panel" parent="GameUI"]
 | 
				
			||||||
 | 
					visible = false
 | 
				
			||||||
 | 
					custom_minimum_size = Vector2(0, 80)
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 10
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					offset_bottom = 80.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Player1Widgets" type="VBoxContainer" parent="GameUI/GameRunningWidgets"]
 | 
				
			||||||
layout_mode = 1
 | 
					layout_mode = 1
 | 
				
			||||||
offset_right = 49.0
 | 
					offset_right = 49.0
 | 
				
			||||||
offset_bottom = 77.0
 | 
					offset_bottom = 77.0
 | 
				
			||||||
alignment = 1
 | 
					alignment = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="NameLabel" type="Label" parent="GameUI/Player1Widgets"]
 | 
					[node name="NameLabel" type="Label" parent="GameUI/GameRunningWidgets/Player1Widgets"]
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
text = "Red"
 | 
					text = "Red"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="ScoreLabel" type="Label" parent="GameUI/Player1Widgets"]
 | 
					[node name="ScoreLabel" type="Label" parent="GameUI/GameRunningWidgets/Player1Widgets"]
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
text = "0
 | 
					text = "0
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Player2Widgets" type="VBoxContainer" parent="GameUI"]
 | 
					[node name="Player2Widgets" type="VBoxContainer" parent="GameUI/GameRunningWidgets"]
 | 
				
			||||||
layout_direction = 3
 | 
					layout_direction = 3
 | 
				
			||||||
layout_mode = 0
 | 
					layout_mode = 1
 | 
				
			||||||
offset_left = 7.0
 | 
					offset_right = 49.0
 | 
				
			||||||
offset_right = 56.0
 | 
					 | 
				
			||||||
offset_bottom = 77.0
 | 
					offset_bottom = 77.0
 | 
				
			||||||
size_flags_horizontal = 8
 | 
					size_flags_horizontal = 8
 | 
				
			||||||
alignment = 1
 | 
					alignment = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="NameLabel" type="Label" parent="GameUI/Player2Widgets"]
 | 
					[node name="NameLabel" type="Label" parent="GameUI/GameRunningWidgets/Player2Widgets"]
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
text = "Blue"
 | 
					text = "Blue"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="ScoreLabel" type="Label" parent="GameUI/Player2Widgets"]
 | 
					[node name="ScoreLabel" type="Label" parent="GameUI/GameRunningWidgets/Player2Widgets"]
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
text = "0
 | 
					text = "0
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="TimeWidgets" type="VBoxContainer" parent="GameUI/GameRunningWidgets"]
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 5
 | 
				
			||||||
 | 
					anchor_left = 0.5
 | 
				
			||||||
 | 
					anchor_right = 0.5
 | 
				
			||||||
 | 
					offset_left = -48.0
 | 
				
			||||||
 | 
					offset_right = 48.0
 | 
				
			||||||
 | 
					offset_bottom = 70.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Label" type="Label" parent="GameUI/GameRunningWidgets/TimeWidgets"]
 | 
				
			||||||
 | 
					layout_mode = 2
 | 
				
			||||||
 | 
					text = "Time Left"
 | 
				
			||||||
 | 
					horizontal_alignment = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="TimeLeftLabel" type="Label" parent="GameUI/GameRunningWidgets/TimeWidgets"]
 | 
				
			||||||
 | 
					layout_mode = 2
 | 
				
			||||||
 | 
					text = "00:30:00"
 | 
				
			||||||
 | 
					horizontal_alignment = 1
 | 
				
			||||||
 | 
				
			|||||||
@ -2,9 +2,15 @@ extends Control
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@export var world_path : NodePath = NodePath()
 | 
					@export var world_path : NodePath = NodePath()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var player1_score_label : Label = $'Player1Widgets/ScoreLabel'
 | 
					@onready var game_running_widgets : Control = $'GameRunningWidgets'
 | 
				
			||||||
@onready var player2_score_label : Label = $'Player2Widgets/ScoreLabel'
 | 
					@onready var game_startup_widgets : Control = $'GameStartupWidgets'
 | 
				
			||||||
@onready var player2_widgets : Control = $'Player2Widgets'
 | 
					@onready var game_finished_widgets : Control = $'GameFinishedWidgets'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@onready var player1_score_label : Label = $'GameRunningWidgets/Player1Widgets/ScoreLabel'
 | 
				
			||||||
 | 
					@onready var player2_score_label : Label = $'GameRunningWidgets/Player2Widgets/ScoreLabel'
 | 
				
			||||||
 | 
					@onready var player2_widgets : Control = $'GameRunningWidgets/Player2Widgets'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@onready var time_left_label : Label = $'GameRunningWidgets/TimeWidgets/TimeLeftLabel'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var world : World = null
 | 
					var world : World = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,7 +22,35 @@ func _ready():
 | 
				
			|||||||
		player2_widgets.visible = false
 | 
							player2_widgets.visible = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _process(_delta):
 | 
					func _process(_delta):
 | 
				
			||||||
 | 
						if world.game_state == World.GameState.Startup:
 | 
				
			||||||
 | 
							game_startup_widgets.visible = true
 | 
				
			||||||
 | 
							game_running_widgets.visible = false
 | 
				
			||||||
 | 
							game_finished_widgets.visible = false
 | 
				
			||||||
 | 
						elif world.game_state == World.GameState.Running:
 | 
				
			||||||
 | 
							game_startup_widgets.visible = false
 | 
				
			||||||
 | 
							game_running_widgets.visible = true
 | 
				
			||||||
 | 
							game_finished_widgets.visible = false
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							var minutes = floor(world.time_left / 60.)
 | 
				
			||||||
 | 
							var seconds = fmod(floor(world.time_left), 60)
 | 
				
			||||||
 | 
							var milliseconds = floor((world.time_left - floor(world.time_left)) * 10)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							time_left_label.text = str(minutes) + ":" + str(seconds) + ":" + str(milliseconds)
 | 
				
			||||||
 | 
						elif world.game_state == World.GameState.Finished:
 | 
				
			||||||
 | 
							game_startup_widgets.visible = false
 | 
				
			||||||
 | 
							game_running_widgets.visible = false
 | 
				
			||||||
 | 
							game_finished_widgets.visible = true
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	player1_score_label.text = str(world.players[0].score)
 | 
						player1_score_label.text = str(world.players[0].score)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if player2_widgets.visible:
 | 
						if player2_widgets.visible:
 | 
				
			||||||
		player2_score_label.text = str(world.players[1].score)
 | 
							player2_score_label.text = str(world.players[1].score)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _input(event):
 | 
				
			||||||
 | 
						if event.is_action_pressed("ui_accept"):
 | 
				
			||||||
 | 
							if world.game_state == World.GameState.Startup:
 | 
				
			||||||
 | 
								world.game_state = World.GameState.Running
 | 
				
			||||||
 | 
						if event.is_action_pressed("ui_cancel"):			
 | 
				
			||||||
 | 
							if world.game_state == World.GameState.Finished:
 | 
				
			||||||
 | 
								world.game_state = World.GameState.Startup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -9,11 +9,23 @@ class_name World extends Node3D
 | 
				
			|||||||
@onready var level: Node3D = $Level
 | 
					@onready var level: Node3D = $Level
 | 
				
			||||||
@onready var world_coloring_viewport: SubViewport = $WorldColoringViewport
 | 
					@onready var world_coloring_viewport: SubViewport = $WorldColoringViewport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GAME_DURATION_SECONDS = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var camera_position: Vector3;
 | 
					var camera_position: Vector3;
 | 
				
			||||||
var world_coloring_material: ShaderMaterial
 | 
					var world_coloring_material: ShaderMaterial
 | 
				
			||||||
var world_plane: Plane = Plane(Vector3.UP, Vector3.ZERO)
 | 
					var world_plane: Plane = Plane(Vector3.UP, Vector3.ZERO)
 | 
				
			||||||
var spawn_points: Array = Array()
 | 
					var spawn_points: Array = Array()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum GameState {
 | 
				
			||||||
 | 
						Startup,
 | 
				
			||||||
 | 
						Running,
 | 
				
			||||||
 | 
						Finished
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var time_left = GAME_DURATION_SECONDS
 | 
				
			||||||
 | 
					var game_state : GameState = GameState.Startup
 | 
				
			||||||
 | 
					var game_state_last : GameState = GameState.Finished
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Called when the node enters the scene tree for the first time.
 | 
					# Called when the node enters the scene tree for the first time.
 | 
				
			||||||
func _ready():
 | 
					func _ready():
 | 
				
			||||||
	var player1: CharacterBody3D = $Player1
 | 
						var player1: CharacterBody3D = $Player1
 | 
				
			||||||
@ -42,6 +54,23 @@ func _ready():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
 | 
					# Called every frame. 'delta' is the elapsed time since the previous frame.
 | 
				
			||||||
func _process(_delta):
 | 
					func _process(_delta):
 | 
				
			||||||
 | 
						if game_state_last != game_state:
 | 
				
			||||||
 | 
							if game_state == GameState.Startup:
 | 
				
			||||||
 | 
								on_game_startup()
 | 
				
			||||||
 | 
							elif game_state == GameState.Running:
 | 
				
			||||||
 | 
								on_game_running()
 | 
				
			||||||
 | 
							elif game_state == GameState.Finished:
 | 
				
			||||||
 | 
								on_game_finished()
 | 
				
			||||||
 | 
							game_state_last = game_state
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if game_state == GameState.Running:
 | 
				
			||||||
 | 
							time_left -= _delta;
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						if time_left <= 0:
 | 
				
			||||||
 | 
							game_state = GameState.Finished
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	var player1 : Player = players[0]
 | 
						var player1 : Player = players[0]
 | 
				
			||||||
	var player_center = Vector3.ZERO
 | 
						var player_center = Vector3.ZERO
 | 
				
			||||||
	var player_coords_rect : Rect2 = Rect2(
 | 
						var player_coords_rect : Rect2 = Rect2(
 | 
				
			||||||
@ -66,11 +95,13 @@ func _process(_delta):
 | 
				
			|||||||
	camera_position = player_center - camera_direction * camera_dist
 | 
						camera_position = player_center - camera_direction * camera_dist
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	camera.global_position = camera_position
 | 
						camera.global_position = camera_position
 | 
				
			||||||
	pass
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _physics_process(_delta):
 | 
					func _physics_process(_delta):
 | 
				
			||||||
	world_coloring_material.set_shader_parameter("world_color_texture", world_coloring_viewport.get_texture())
 | 
						world_coloring_material.set_shader_parameter("world_color_texture", world_coloring_viewport.get_texture())
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						if game_state != GameState.Running:
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	for player: Player in players:
 | 
						for player: Player in players:
 | 
				
			||||||
		if player.state == Player.PlayerState.Dead:
 | 
							if player.state == Player.PlayerState.Dead:
 | 
				
			||||||
			var occupied = true
 | 
								var occupied = true
 | 
				
			||||||
@ -85,6 +116,11 @@ func _physics_process(_delta):
 | 
				
			|||||||
			player.state = Player.PlayerState.Alive
 | 
								player.state = Player.PlayerState.Alive
 | 
				
			||||||
			spawn_point.near_players.append(player)
 | 
								spawn_point.near_players.append(player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _unhandled_input(event):
 | 
				
			||||||
 | 
						if game_state == GameState.Startup:
 | 
				
			||||||
 | 
							if event.is_action_pressed("ui_accept"):
 | 
				
			||||||
 | 
								game_state = GameState.Running
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func find_spawn_points (node):
 | 
					func find_spawn_points (node):
 | 
				
			||||||
	for child in node.get_children():
 | 
						for child in node.get_children():
 | 
				
			||||||
		var spawn_point = child as SpawnPoint
 | 
							var spawn_point = child as SpawnPoint
 | 
				
			||||||
@ -113,3 +149,45 @@ func update_score():
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	if players.size() > 1:
 | 
						if players.size() > 1:
 | 
				
			||||||
		players[1].score = pixel_count_compute_shader.blue_score
 | 
							players[1].score = pixel_count_compute_shader.blue_score
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_game_startup():
 | 
				
			||||||
 | 
						print("Switching to startup")
 | 
				
			||||||
 | 
						stop_gameplay()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						world_coloring_viewport.render_target_clear_mode = SubViewport.CLEAR_MODE_ONCE
 | 
				
			||||||
 | 
						world_coloring_viewport.render_target_update_mode = SubViewport.UPDATE_ONCE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_game_running():
 | 
				
			||||||
 | 
						print("Switching to gameplay")	
 | 
				
			||||||
 | 
						start_gameplay()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						world_coloring_viewport.render_target_clear_mode = SubViewport.CLEAR_MODE_NEVER
 | 
				
			||||||
 | 
						world_coloring_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_game_finished():
 | 
				
			||||||
 | 
						print("Switching to finished")		
 | 
				
			||||||
 | 
						stop_gameplay()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						world_coloring_viewport.render_target_clear_mode = SubViewport.CLEAR_MODE_NEVER
 | 
				
			||||||
 | 
						world_coloring_viewport.render_target_update_mode = SubViewport.UPDATE_ONCE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func stop_gameplay():
 | 
				
			||||||
 | 
						print("Stopping gameplay")
 | 
				
			||||||
 | 
						for player: Player in players:
 | 
				
			||||||
 | 
							player.coloring_sprite.visible = false
 | 
				
			||||||
 | 
							player.coloring_bomb_sprite.visible = false
 | 
				
			||||||
 | 
							player.set_process(false)
 | 
				
			||||||
 | 
							player.set_process_input(false)
 | 
				
			||||||
 | 
							player.set_physics_process(false)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					func start_gameplay():
 | 
				
			||||||
 | 
						print("Starting gameplay")
 | 
				
			||||||
 | 
						time_left = GAME_DURATION_SECONDS
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for player: Player in players:
 | 
				
			||||||
 | 
							player.coloring_sprite.visible = true
 | 
				
			||||||
 | 
							player.coloring_bomb_sprite.visible = false
 | 
				
			||||||
 | 
							player.set_process(true)
 | 
				
			||||||
 | 
							player.set_process_input(true)
 | 
				
			||||||
 | 
							player.set_physics_process(true)
 | 
				
			||||||
 | 
							player.state = Player.PlayerState.Dead
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
[gd_scene load_steps=13 format=3 uid="uid://b1nm5h3yccr16"]
 | 
					[gd_scene load_steps=14 format=3 uid="uid://b1nm5h3yccr16"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Script" path="res://scenes/World.gd" id="1_gtcjp"]
 | 
					[ext_resource type="Script" path="res://scenes/World.gd" id="1_gtcjp"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://bfyjtfdko3l7o" path="res://entities/Player.tscn" id="2_a343a"]
 | 
					[ext_resource type="PackedScene" uid="uid://bfyjtfdko3l7o" path="res://entities/Player.tscn" id="2_a343a"]
 | 
				
			||||||
@ -8,6 +8,7 @@
 | 
				
			|||||||
[ext_resource type="PackedScene" uid="uid://7a2ma10hq0qa" path="res://scenes/PlatformA.tscn" id="6_83plb"]
 | 
					[ext_resource type="PackedScene" uid="uid://7a2ma10hq0qa" path="res://scenes/PlatformA.tscn" id="6_83plb"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://bnmtyc1kkt6ku" path="res://scenes/PlatformB.tscn" id="7_cld3m"]
 | 
					[ext_resource type="PackedScene" uid="uid://bnmtyc1kkt6ku" path="res://scenes/PlatformB.tscn" id="7_cld3m"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://cc521i07ajufm" path="res://entities/SpawnPoint.tscn" id="8_ykvyf"]
 | 
					[ext_resource type="PackedScene" uid="uid://cc521i07ajufm" path="res://entities/SpawnPoint.tscn" id="8_ykvyf"]
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://0lrpepyejfxg" path="res://scenes/TestObstacles.tscn" id="9_eml1e"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_5gauv"]
 | 
					[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_5gauv"]
 | 
				
			||||||
sky_energy_multiplier = 5.0
 | 
					sky_energy_multiplier = 5.0
 | 
				
			||||||
@ -105,7 +106,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.76534, 0, 5.93242)
 | 
				
			|||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.68666, 0, 5.21494)
 | 
					transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.68666, 0, 5.21494)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Platforms3" parent="Level" instance=ExtResource("6_83plb")]
 | 
					[node name="Platforms3" parent="Level" instance=ExtResource("6_83plb")]
 | 
				
			||||||
transform = Transform3D(0.768741, 0, -0.63956, 0, 1, 0, 0.63956, 0, 0.768741, 9.90471, 0, 3.31265)
 | 
					transform = Transform3D(0.768741, 0, -0.63956, 0, 1, 0, 0.63956, 0, 0.768741, 8.83345, 0, 2.90911)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Platforms4" parent="Level" instance=ExtResource("6_83plb")]
 | 
					[node name="Platforms4" parent="Level" instance=ExtResource("6_83plb")]
 | 
				
			||||||
transform = Transform3D(-0.99988, 0, -0.0155154, 0, 1, 0, 0.0155154, 0, -0.99988, 13.9505, -4.76837e-07, -0.629952)
 | 
					transform = Transform3D(-0.99988, 0, -0.0155154, 0, 1, 0, 0.0155154, 0, -0.99988, 13.9505, -4.76837e-07, -0.629952)
 | 
				
			||||||
@ -136,3 +137,5 @@ player_index = 1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[node name="SpawnPointPlayer3" parent="Level" instance=ExtResource("8_ykvyf")]
 | 
					[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)
 | 
					transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.55561, 0, 3.26255)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Obstacles" parent="Level" instance=ExtResource("9_eml1e")]
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										7
									
								
								themes/GameUI.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								themes/GameUI.tres
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					[gd_resource type="Theme" load_steps=2 format=3 uid="uid://bb8mjy6l7umui"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="FontFile" uid="uid://bf6q51e8x2s1h" path="res://assets/fonts/Bangers-Regular/Bangers-Regular.ttf" id="1_k4p25"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[resource]
 | 
				
			||||||
 | 
					default_font = ExtResource("1_k4p25")
 | 
				
			||||||
 | 
					default_font_size = 30
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user