make a main menu and score system
i added a main menu scene and a score system that is written in GDScript instead of C# for a change. the WallManager, the thing that detects collisions, calls the score method on the ScoreManager.
This commit is contained in:
parent
b27a44a9b3
commit
f84479e03a
9 changed files with 160 additions and 9 deletions
29
Scenes/MainMenu.tscn
Normal file
29
Scenes/MainMenu.tscn
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
[gd_scene load_steps=3 format=3 uid="uid://0vkrkvlevwkj"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://Scripts/Managers/MainMenuManager.cs" id="1_tuygx"]
|
||||||
|
|
||||||
|
[sub_resource type="LabelSettings" id="LabelSettings_vv6u3"]
|
||||||
|
font_size = 64
|
||||||
|
|
||||||
|
[node name="MainMenu" type="VBoxContainer"]
|
||||||
|
offset_right = 800.0
|
||||||
|
offset_bottom = 600.0
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
size_flags_vertical = 3
|
||||||
|
script = ExtResource("1_tuygx")
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="."]
|
||||||
|
layout_mode = 2
|
||||||
|
text = "Pong
|
||||||
|
"
|
||||||
|
label_settings = SubResource("LabelSettings_vv6u3")
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Button" type="Button" parent="."]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_font_sizes/font_size = 32
|
||||||
|
text = "Play
|
||||||
|
"
|
||||||
|
|
||||||
|
[connection signal="pressed" from="Button" to="." method="OnButtonPressed"]
|
|
@ -1,7 +1,8 @@
|
||||||
[gd_scene load_steps=6 format=3 uid="uid://wn48xnd0lstq"]
|
[gd_scene load_steps=7 format=3 uid="uid://wn48xnd0lstq"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" path="res://Scenes/Paddle.tscn" id="1_5rs0o"]
|
[ext_resource type="PackedScene" path="res://Scenes/Paddle.tscn" id="1_5rs0o"]
|
||||||
[ext_resource type="Script" path="res://Scripts/Managers/SceneManager.cs" id="1_m8437"]
|
[ext_resource type="Script" path="res://Scripts/Managers/SceneManager.cs" id="1_m8437"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://co2rv0nci8sbm" path="res://Scenes/Score.tscn" id="2_f3jwj"]
|
||||||
[ext_resource type="PackedScene" uid="uid://67qguep14iko" path="res://Scenes/Ball.tscn" id="2_u2ksv"]
|
[ext_resource type="PackedScene" uid="uid://67qguep14iko" path="res://Scenes/Ball.tscn" id="2_u2ksv"]
|
||||||
[ext_resource type="PackedScene" uid="uid://dsvv7vqonylr1" path="res://Scenes/Walls.tscn" id="3_jfis7"]
|
[ext_resource type="PackedScene" uid="uid://dsvv7vqonylr1" path="res://Scenes/Walls.tscn" id="3_jfis7"]
|
||||||
[ext_resource type="PackedScene" path="res://Scenes/Enemy.tscn" id="4_uwvof"]
|
[ext_resource type="PackedScene" path="res://Scenes/Enemy.tscn" id="4_uwvof"]
|
||||||
|
@ -9,6 +10,8 @@
|
||||||
[node name="Pong" type="Node2D"]
|
[node name="Pong" type="Node2D"]
|
||||||
script = ExtResource("1_m8437")
|
script = ExtResource("1_m8437")
|
||||||
|
|
||||||
|
[node name="Score" parent="." instance=ExtResource("2_f3jwj")]
|
||||||
|
|
||||||
[node name="Paddle" parent="." instance=ExtResource("1_5rs0o")]
|
[node name="Paddle" parent="." instance=ExtResource("1_5rs0o")]
|
||||||
position = Vector2(-350, 0)
|
position = Vector2(-350, 0)
|
||||||
_moveSpeed = 50.0
|
_moveSpeed = 50.0
|
||||||
|
|
30
Scenes/Score.tscn
Normal file
30
Scenes/Score.tscn
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
[gd_scene load_steps=3 format=3 uid="uid://co2rv0nci8sbm"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://Scripts/Managers/ScoreManager.gd" id="1_bdtqr"]
|
||||||
|
|
||||||
|
[sub_resource type="LabelSettings" id="LabelSettings_piogj"]
|
||||||
|
font_size = 64
|
||||||
|
|
||||||
|
[node name="Score" type="HFlowContainer"]
|
||||||
|
z_index = 1
|
||||||
|
offset_left = -378.0
|
||||||
|
offset_top = -272.0
|
||||||
|
offset_right = 378.0
|
||||||
|
offset_bottom = 268.0
|
||||||
|
script = ExtResource("1_bdtqr")
|
||||||
|
|
||||||
|
[node name="Player1" type="Label" parent="."]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "0
|
||||||
|
"
|
||||||
|
label_settings = SubResource("LabelSettings_piogj")
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Player2" type="Label" parent="."]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "0"
|
||||||
|
label_settings = SubResource("LabelSettings_piogj")
|
||||||
|
horizontal_alignment = 2
|
||||||
|
vertical_alignment = 1
|
|
@ -3,28 +3,30 @@
|
||||||
[ext_resource type="Script" path="res://Scripts/Managers/WallManager.cs" id="1_mxer2"]
|
[ext_resource type="Script" path="res://Scripts/Managers/WallManager.cs" id="1_mxer2"]
|
||||||
|
|
||||||
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_f7jy5"]
|
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_f7jy5"]
|
||||||
size = Vector2(30, 600)
|
size = Vector2(30, 1)
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_1mqst"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_1mqst"]
|
||||||
size = Vector2(30, 600)
|
size = Vector2(30, 1)
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_sip7s"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_sip7s"]
|
||||||
size = Vector2(30, 600)
|
size = Vector2(30, 1)
|
||||||
|
|
||||||
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_868ov"]
|
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_868ov"]
|
||||||
size = Vector2(756, 30)
|
size = Vector2(1, 30)
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_rw4mt"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_rw4mt"]
|
||||||
size = Vector2(756, 30)
|
size = Vector2(1, 30)
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_dydpt"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_dydpt"]
|
||||||
size = Vector2(756, 30)
|
size = Vector2(1, 30)
|
||||||
|
|
||||||
[node name="Walls" type="Node2D"]
|
[node name="Walls" type="Node2D"]
|
||||||
|
|
||||||
[node name="Left" type="Area2D" parent="."]
|
[node name="Left" type="Area2D" parent="."]
|
||||||
position = Vector2(-393, -2)
|
position = Vector2(-393, -2)
|
||||||
|
scale = Vector2(1, 600)
|
||||||
script = ExtResource("1_mxer2")
|
script = ExtResource("1_mxer2")
|
||||||
|
PlayerNumber = 1
|
||||||
|
|
||||||
[node name="Left" type="Sprite2D" parent="Left"]
|
[node name="Left" type="Sprite2D" parent="Left"]
|
||||||
position = Vector2(2.08165e-12, 2.08165e-12)
|
position = Vector2(2.08165e-12, 2.08165e-12)
|
||||||
|
@ -36,6 +38,7 @@ shape = SubResource("RectangleShape2D_1mqst")
|
||||||
|
|
||||||
[node name="Right" type="Area2D" parent="."]
|
[node name="Right" type="Area2D" parent="."]
|
||||||
position = Vector2(393, -2)
|
position = Vector2(393, -2)
|
||||||
|
scale = Vector2(1, 600)
|
||||||
script = ExtResource("1_mxer2")
|
script = ExtResource("1_mxer2")
|
||||||
|
|
||||||
[node name="Right" type="Sprite2D" parent="Right"]
|
[node name="Right" type="Sprite2D" parent="Right"]
|
||||||
|
@ -48,6 +51,7 @@ shape = SubResource("RectangleShape2D_sip7s")
|
||||||
|
|
||||||
[node name="Top" type="StaticBody2D" parent="."]
|
[node name="Top" type="StaticBody2D" parent="."]
|
||||||
position = Vector2(2.08165e-12, -287)
|
position = Vector2(2.08165e-12, -287)
|
||||||
|
scale = Vector2(756, 1)
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
|
@ -61,6 +65,7 @@ shape = SubResource("RectangleShape2D_rw4mt")
|
||||||
|
|
||||||
[node name="Bottom" type="StaticBody2D" parent="."]
|
[node name="Bottom" type="StaticBody2D" parent="."]
|
||||||
position = Vector2(2.08165e-12, 283)
|
position = Vector2(2.08165e-12, 283)
|
||||||
|
scale = Vector2(756, 1)
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
|
@ -71,3 +76,6 @@ texture = SubResource("PlaceholderTexture2D_868ov")
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Bottom"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="Bottom"]
|
||||||
position = Vector2(-2.08165e-12, 0)
|
position = Vector2(-2.08165e-12, 0)
|
||||||
shape = SubResource("RectangleShape2D_dydpt")
|
shape = SubResource("RectangleShape2D_dydpt")
|
||||||
|
|
||||||
|
[connection signal="body_entered" from="Left" to="Left" method="OnBodyEntered"]
|
||||||
|
[connection signal="body_entered" from="Right" to="Right" method="OnBodyEntered"]
|
||||||
|
|
7
Scripts/Data/PlayerNumber.cs
Normal file
7
Scripts/Data/PlayerNumber.cs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Pong.Scripts.Data;
|
||||||
|
|
||||||
|
public enum PlayerNumber
|
||||||
|
{
|
||||||
|
PlayerOne,
|
||||||
|
PlayerTwo
|
||||||
|
}
|
28
Scripts/Managers/MainMenuManager.cs
Normal file
28
Scripts/Managers/MainMenuManager.cs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace Pong.Scripts.Managers;
|
||||||
|
|
||||||
|
public partial class MainMenuManager : VBoxContainer
|
||||||
|
{
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
GetTree().Root.SizeChanged += AdaptUiToScreenResolution;
|
||||||
|
AdaptUiToScreenResolution();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// code that executes when the start button is pressed. this loads the Pong scene to the root
|
||||||
|
/// of the scene tree.
|
||||||
|
/// </summary>
|
||||||
|
private void OnButtonPressed()
|
||||||
|
{
|
||||||
|
GetTree().Root.SizeChanged -= AdaptUiToScreenResolution;
|
||||||
|
GetTree().ChangeSceneToFile("res://Scenes/Pong.tscn");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AdaptUiToScreenResolution()
|
||||||
|
{
|
||||||
|
Size = DisplayServer.WindowGetSize();
|
||||||
|
}
|
||||||
|
}
|
34
Scripts/Managers/ScoreManager.gd
Normal file
34
Scripts/Managers/ScoreManager.gd
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
extends HFlowContainer
|
||||||
|
|
||||||
|
var PlayerOneScore: int
|
||||||
|
var PlayerTwoScore: int
|
||||||
|
|
||||||
|
var PlayerOneLabel: Label
|
||||||
|
var PlayerTwoLabel: Label
|
||||||
|
|
||||||
|
enum {PlayerOne, PlayerTwo}
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
PlayerOneLabel = get_node("Player1")
|
||||||
|
PlayerTwoLabel = get_node("Player2")
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(_delta):
|
||||||
|
pass
|
||||||
|
|
||||||
|
## when the ball collides with the wall, this method is called by the WallManager
|
||||||
|
func score(player_number: int):
|
||||||
|
if player_number == PlayerOne:
|
||||||
|
PlayerOneScore += 1
|
||||||
|
update_label(player_number)
|
||||||
|
elif player_number == PlayerTwo:
|
||||||
|
PlayerTwoScore += 1
|
||||||
|
update_label(player_number)
|
||||||
|
|
||||||
|
## this method takes care of updating labels
|
||||||
|
func update_label(player_number: int):
|
||||||
|
if player_number == PlayerOne:
|
||||||
|
PlayerOneLabel.text = str(PlayerOneScore)
|
||||||
|
elif player_number == PlayerTwo:
|
||||||
|
PlayerTwoLabel.text = str(PlayerTwoScore)
|
|
@ -1,17 +1,29 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using Pong.Scripts.Data;
|
||||||
|
|
||||||
namespace Pong.Scripts.Managers;
|
namespace Pong.Scripts.Managers;
|
||||||
|
|
||||||
public partial class WallManager : Area2D
|
public partial class WallManager : Area2D
|
||||||
{
|
{
|
||||||
|
[Export] internal PlayerNumber PlayerNumber;
|
||||||
|
|
||||||
|
private GodotObject _scoreManager;
|
||||||
|
private StringName _score = "score";
|
||||||
|
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
BodyEntered += OnBodyEntered;
|
_scoreManager = GetNode<GodotObject>("/root/Pong/Score");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// code that runs when a ball collides the wall.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="body">the body of the collider.</param>
|
||||||
private void OnBodyEntered(Node2D body)
|
private void OnBodyEntered(Node2D body)
|
||||||
{
|
{
|
||||||
if (body is not Nodes.Ball ball) return;
|
if (body is not Nodes.Ball ball) return;
|
||||||
|
_scoreManager.Call(_score, (long)PlayerNumber);
|
||||||
|
|
||||||
ResetBall(ball);
|
ResetBall(ball);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ config_version=5
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="Pong"
|
config/name="Pong"
|
||||||
run/main_scene="res://Scenes/Pong.tscn"
|
run/main_scene="res://Scenes/MainMenu.tscn"
|
||||||
config/features=PackedStringArray("4.0", "C#", "Double Precision", "Mobile")
|
config/features=PackedStringArray("4.0", "C#", "Double Precision", "Mobile")
|
||||||
config/icon="res://icon.svg"
|
config/icon="res://icon.svg"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue