Boot screen

This commit is contained in:
2024-08-09 14:14:51 +08:00
parent 34100ee727
commit 40b0f2e176
7 changed files with 126 additions and 24 deletions

View File

@ -1,4 +1,5 @@
using AceField.Scripts.Logic;
using AceField.Scripts.UI;
using Godot;
namespace AceField.Scripts;
@ -6,6 +7,9 @@ namespace AceField.Scripts;
public partial class Launcher : Node
{
[Export] public World World;
[Export] public BootScreen BootMenu;
[Export] public CanvasLayer Overlay;
private void GameFreeze()
@ -20,6 +24,7 @@ public partial class Launcher : Node
GetTree().Paused = false;
World.Show();
Overlay.Show();
BootMenu.StartGame -= GameUnfreeze;
}
public override void _Ready()
@ -33,13 +38,12 @@ public partial class Launcher : Node
}
}
public void StartAsSingle(string currentPlayerName = null)
public void StartAsSingle()
{
GameUnfreeze();
World.StartGame(currentPlayerName);
}
public bool StartAsServer(int port, string currentPlayerName = null)
public bool StartAsServer(int port)
{
var peer = new ENetMultiplayerPeer();
peer.CreateServer(port);
@ -53,13 +57,13 @@ public partial class Launcher : Node
GD.Print("Running game as server...");
Multiplayer.MultiplayerPeer = peer;
GameUnfreeze();
World.StartGame(currentPlayerName);
BootMenu.StartGame += GameUnfreeze;
BootMenu.Show();
return true;
}
public bool StartAsClient(string addr, int port, string currentPlayerName = null)
public bool StartAsClient(string addr, int port)
{
if (string.IsNullOrEmpty(addr)) return false;
@ -76,8 +80,8 @@ public partial class Launcher : Node
GD.Print("Running game as client...");
Multiplayer.MultiplayerPeer = peer;
GameUnfreeze();
World.StartGame(currentPlayerName);
BootMenu.StartGame += GameUnfreeze;
BootMenu.Show();
return true;
}

View File

@ -27,6 +27,15 @@ public partial class World : Node2D
AddChild(_roundTimer);
_roundTimer.Start();
// Add players into the game
PutPlayers(currentPlayerName);
}
public override void _Ready()
{
if (!Multiplayer.IsServer())
return;
// Handling player connect / disconnect after this client connected
Multiplayer.PeerDisconnected += RemovePlayer_Adaptor;
Multiplayer.PeerConnected += AddPlayer_Adaptor;
@ -37,10 +46,7 @@ public partial class World : Node2D
// Add this client as a player if client isn't a dedicated server
if (!OS.HasFeature("dedicated_server"))
Scoreboard.AddPlayer(1, currentPlayerName);
// Add players into the game
PutPlayers(currentPlayerName);
Scoreboard.AddPlayer(1);
}
public override void _ExitTree()

40
Scripts/UI/BootScreen.cs Normal file
View File

@ -0,0 +1,40 @@
using AceField.Scripts.Logic;
using Godot;
namespace AceField.Scripts.UI;
public partial class BootScreen : Control
{
[Export] public World World;
[Export] public Button StartGameButton;
[Export] public LineEdit PlayerNameInput;
[Export] public Label PlayerCountLabel;
[Signal]
public delegate void StartGameEventHandler();
public override void _Ready()
{
StartGameButton.Pressed += () => { Rpc(nameof(Start)); };
}
public override void _Process(double delta)
{
var count = Multiplayer.GetPeers().Length;
PlayerCountLabel.Text = $"{(count + 1):00}/{16}";
StartGameButton.Disabled = !Multiplayer.IsServer();
}
[Rpc(MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)]
private void Start()
{
EmitSignal(SignalName.StartGame);
var name = string.IsNullOrEmpty(PlayerNameInput.Text) ? null : PlayerNameInput.Text;
// TODO Fix this I don't know why the first round player's name won't fully apply
World.Scoreboard.SetName(Multiplayer.GetUniqueId(), name);
World.StartGame(currentPlayerName: name);
Hide();
}
}

View File

@ -8,8 +8,7 @@ public partial class LaunchScreen : Control
[Export] public string DefaultServerAddr = "127.0.0.1";
[Export] public Launcher Launcher;
[Export] public LineEdit PlayerNameInput;
[Export] public LineEdit ServerPortInput;
[Export] public LineEdit ServerAddrInput;
[Export] public Button StartAsServerButton;
@ -51,8 +50,7 @@ public partial class LaunchScreen : Control
}
var port = ServerPortInput.Text;
var name = string.IsNullOrEmpty(PlayerNameInput.Text) ? null : PlayerNameInput.Text;
var result = Launcher.StartAsServer(int.Parse(port), currentPlayerName: name);
var result = Launcher.StartAsServer(int.Parse(port));
if (result)
Hide();
@ -67,8 +65,7 @@ public partial class LaunchScreen : Control
var addr = ServerAddrInput.Text;
var port = ServerPortInput.Text;
var name = string.IsNullOrEmpty(PlayerNameInput.Text) ? null : PlayerNameInput.Text;
var result = Launcher.StartAsClient(addr, int.Parse(port), currentPlayerName: name);
var result = Launcher.StartAsClient(addr, int.Parse(port));
if (result)
Hide();