Beeg checkin
This commit is contained in:
0
GameLogic/.gitkeep
Normal file
0
GameLogic/.gitkeep
Normal file
174
GameLogic/GameManager.cs
Normal file
174
GameLogic/GameManager.cs
Normal file
@@ -0,0 +1,174 @@
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public partial class GameManager : Node
|
||||
{
|
||||
[Signal]
|
||||
public delegate void OnGameOverEventHandler();
|
||||
[Signal]
|
||||
public delegate void ReselectCharacterEventHandler(PlayerManager player);
|
||||
|
||||
[Export]
|
||||
private Array<PackedScene> PlayerScenes;
|
||||
|
||||
public Array<Controls> P1CharactersOut = new Array<Controls>();
|
||||
public Array<Controls> P2CharactersOut = new Array<Controls>();
|
||||
|
||||
public IEnumerable<PlayerManager> Players = new List<PlayerManager>();
|
||||
|
||||
private int _levelIndex;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
var main = GetTree().Root.GetNode<Main>("/root/Main");
|
||||
for (var i = 0; i < main.NumberOfPlayers; i++)
|
||||
{
|
||||
var player = PlayerScenes[i].Instantiate();
|
||||
Players = Players.Append((PlayerManager)player);
|
||||
GetTree().Root.AddChild(player);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnAllEnemiesDefeated()
|
||||
{
|
||||
GD.Print("All enemies defeated");
|
||||
OnLevelClear();
|
||||
}
|
||||
|
||||
public void OnHandleCharacterSelectUI(PlayerManager player)
|
||||
{
|
||||
EmitSignal(SignalName.ReselectCharacter, player);
|
||||
}
|
||||
|
||||
public void SetToNextCharacter(PlayerManager player)
|
||||
{
|
||||
player._characterIndex = (++player._characterIndex) % player.CharactersLeftOnStage.Count();
|
||||
GD.Print(player.CharactersLeftOnStage.ElementAt(player._characterIndex));
|
||||
}
|
||||
|
||||
public void SetToPreviousCharacter(PlayerManager player)
|
||||
{
|
||||
player._characterIndex = player._characterIndex == 0 ? player.CharactersLeftOnStage.Count() - 1 : --player._characterIndex;
|
||||
}
|
||||
|
||||
public void ResetPlayerPosition(PlayerManager player)
|
||||
{
|
||||
player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter);
|
||||
GD.Print(player.CharactersLeftOnStage.ElementAt(player._characterIndex));
|
||||
}
|
||||
|
||||
public void OnCharacterSelected(PlayerManager player)
|
||||
{
|
||||
var sfxPlayer = GetTree().Root.GetNode<AudioStreamPlayer>("Main/SFXPlayer");
|
||||
var audioStream = ResourceLoader.Load<AudioStream>("Audio/SFX/Select.wav");
|
||||
sfxPlayer.Stream = audioStream;
|
||||
sfxPlayer.Play();
|
||||
GD.Print("Instancing...");
|
||||
var names = player.CharactersLeftOnStage.Select(x => x.Name).ToArray();
|
||||
GD.Print(names);
|
||||
if (player.CharactersLeftOnStage.Any())
|
||||
{
|
||||
var selectedCharacter = player.CharactersLeftOnStage[player._characterIndex];
|
||||
player.SelectedCharacter = selectedCharacter;
|
||||
GetTree().Root.AddChild(player.SelectedCharacter);
|
||||
player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveCharacter(P1Controls character)
|
||||
{
|
||||
Players.ElementAt(0).CharactersLeftOnStage.Remove(character);
|
||||
|
||||
GetTree().Root.RemoveChild(character);
|
||||
|
||||
GD.Print(Players.ElementAt(0).CharactersLeftOnStage.Select(x => x.Name).ToArray());
|
||||
|
||||
Players.ElementAt(0)._characterIndex = 0;
|
||||
if (Players.ElementAt(0).CharactersLeftOnStage.Any())
|
||||
EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0));
|
||||
|
||||
if (!P1CharactersOut.Any() && !Players.ElementAt(0).CharactersLeftOnStage.Any())
|
||||
SetGameOver(Players.ElementAt(0), true);
|
||||
|
||||
if (Players.Count() == 2 && !P2CharactersOut.Any() && !Players.ElementAt(1).CharactersLeftOnStage.Any())
|
||||
SetGameOver(Players.ElementAt(1), true);
|
||||
}
|
||||
|
||||
public void RemoveCharacter(P2Controls character)
|
||||
{
|
||||
Players.ElementAt(1).CharactersLeftOnStage.Remove(character);
|
||||
|
||||
GetTree().Root.RemoveChild(character);
|
||||
|
||||
GD.Print(Players.ElementAt(1).CharactersLeftOnStage.Select(x => x.Name).ToArray());
|
||||
|
||||
Players.ElementAt(1)._characterIndex = 0;
|
||||
if (Players.ElementAt(1).CharactersLeftOnStage.Any())
|
||||
EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(1));
|
||||
}
|
||||
|
||||
public void RemoveCharacterAndAddToExit(P1Controls character)
|
||||
{
|
||||
P1CharactersOut.Add(character);
|
||||
Players.ElementAt(0).CharactersLeftOnStage.Remove(character);
|
||||
|
||||
GetTree().Root.RemoveChild(character);
|
||||
|
||||
GD.Print(Players.ElementAt(0).CharactersLeftOnStage.Select(x => x.Name).ToArray());
|
||||
|
||||
Players.ElementAt(0)._characterIndex = 0;
|
||||
if (Players.ElementAt(0).CharactersLeftOnStage.Any())
|
||||
EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0));
|
||||
}
|
||||
|
||||
public void RemoveCharacterAndAddToExit(P2Controls character)
|
||||
{
|
||||
P2CharactersOut.Add(character);
|
||||
Players.ElementAt(1).CharactersLeftOnStage.Remove(character);
|
||||
|
||||
GetTree().Root.RemoveChild(character);
|
||||
|
||||
Players.ElementAt(1)._characterIndex = 0;
|
||||
if (Players.ElementAt(1).CharactersLeftOnStage.Any())
|
||||
EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(1));
|
||||
}
|
||||
|
||||
public void SetGameOver(PlayerManager player, bool isGameOver)
|
||||
{
|
||||
player.GameOver = isGameOver;
|
||||
if (isGameOver)
|
||||
EmitSignal(SignalName.OnGameOver);
|
||||
GD.Print($"Game over for {player.Name}");
|
||||
}
|
||||
|
||||
public void OnLevelClear()
|
||||
{
|
||||
Players.ElementAt(0).CharactersLeftOnStage.AddRange(P1CharactersOut);
|
||||
if (Players.Count() == 2)
|
||||
Players.ElementAt(1).CharactersLeftOnStage.AddRange(P2CharactersOut);
|
||||
|
||||
P1CharactersOut.Clear();
|
||||
if (Players.Count() == 2)
|
||||
P2CharactersOut.Clear();
|
||||
|
||||
Players.ElementAt(0)._characterIndex = 0;
|
||||
if (Players.Count() == 2)
|
||||
Players.ElementAt(1)._characterIndex = 0;
|
||||
|
||||
var players = GetTree().GetNodesInGroup("Player");
|
||||
foreach (var player in players)
|
||||
GetTree().Root.RemoveChild(player);
|
||||
|
||||
var projectiles = GetTree().Root.GetChildren().OfType<Projectile>();
|
||||
foreach (var projectile in projectiles)
|
||||
GetTree().Root.RemoveChild(projectile);
|
||||
|
||||
var main = GetTree().Root.GetNode<Main>("/root/Main");
|
||||
main.LoadNextLevel(_levelIndex++);
|
||||
|
||||
foreach (var player in Players)
|
||||
EmitSignal(SignalName.ReselectCharacter, player);
|
||||
}
|
||||
}
|
||||
24
GameLogic/GameManager.tscn
Normal file
24
GameLogic/GameManager.tscn
Normal file
@@ -0,0 +1,24 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://cxj6yeddshy16"]
|
||||
|
||||
[ext_resource type="Script" path="res://GameLogic/GameManager.cs" id="1_ya2kt"]
|
||||
[ext_resource type="PackedScene" uid="uid://b57xus5rqasy8" path="res://Player/Base/Player2.tscn" id="3_y1wkr"]
|
||||
[ext_resource type="PackedScene" uid="uid://xcmspevaqcrc" path="res://Player/Base/Player1.tscn" id="4_3fl70"]
|
||||
[ext_resource type="PackedScene" uid="uid://dq1gtd55p04do" path="res://UI/StageGUI.tscn" id="4_xi0i5"]
|
||||
|
||||
[node name="GameManager" type="Node3D"]
|
||||
script = ExtResource("1_ya2kt")
|
||||
PlayerScenes = Array[PackedScene]([ExtResource("4_3fl70"), ExtResource("3_y1wkr")])
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.5, 0.866025, 0, -0.866025, 0.5, -0.527878, 10.966, 6.61121)
|
||||
projection = 1
|
||||
current = true
|
||||
size = 10.8546
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -0.504317, 0.863519, 0, -0.863519, -0.504317, 0, 19.9508, 0)
|
||||
|
||||
[node name="StageGUI" parent="." instance=ExtResource("4_xi0i5")]
|
||||
|
||||
[connection signal="ReselectCharacter" from="." to="StageGUI" method="OnCharacterSelect"]
|
||||
[connection signal="OnCharacterSelectionMade" from="StageGUI" to="." method="OnCharacterSelected"]
|
||||
63
GameLogic/Main.cs
Normal file
63
GameLogic/Main.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
using System.Linq;
|
||||
|
||||
public partial class Main : Node
|
||||
{
|
||||
[Export]
|
||||
public Array<PackedScene> Levels;
|
||||
[Export]
|
||||
public PackedScene GameManager;
|
||||
|
||||
public int NumberOfPlayers = 0;
|
||||
|
||||
public void LoadLevel(int indexToLoad, int numberOfPlayers)
|
||||
{
|
||||
var sceneToLoad = Levels.ElementAt(indexToLoad);
|
||||
CallDeferred(nameof(DeferredGoToScene), sceneToLoad);
|
||||
|
||||
NumberOfPlayers = numberOfPlayers;
|
||||
|
||||
var gameManager = GameManager.Instantiate();
|
||||
AddChild(gameManager);
|
||||
var gameManagerInstance = (GameManager)gameManager;
|
||||
|
||||
gameManagerInstance.OnHandleCharacterSelectUI(gameManagerInstance.Players.ElementAt(0));
|
||||
if (numberOfPlayers == 2)
|
||||
gameManagerInstance.OnHandleCharacterSelectUI(gameManagerInstance.Players.ElementAt(1));
|
||||
|
||||
var bgmPlayer = GetTree().Root.GetNode<BGMPlayer>("BgmPlayer");
|
||||
bgmPlayer.ProcessMode = ProcessModeEnum.Always;
|
||||
bgmPlayer.SetBGMFromFilepath("Audio/BGM/LevelTheme.wav");
|
||||
bgmPlayer.PlayBGM();
|
||||
|
||||
GetTree().Paused = true;
|
||||
}
|
||||
|
||||
public void LoadNextLevel(int currentSceneIndex)
|
||||
{
|
||||
if (currentSceneIndex < Levels.Count())
|
||||
{
|
||||
var currentScene = Levels.ToList().ElementAt(currentSceneIndex);
|
||||
var nextScene = currentSceneIndex + 1;
|
||||
CallDeferred(nameof(DeferredGoToScene), Levels.ElementAt(nextScene), currentScene);
|
||||
}
|
||||
}
|
||||
|
||||
private void DeferredGoToScene(PackedScene sceneToAdd)
|
||||
{
|
||||
var nextScene = GD.Load<PackedScene>(sceneToAdd.ResourcePath);
|
||||
var newScene = nextScene.Instantiate();
|
||||
GetTree().Root.AddChild(newScene);
|
||||
GetTree().Paused = true;
|
||||
}
|
||||
|
||||
private void DeferredGoToScene(PackedScene sceneToAdd, PackedScene sceneToRemove)
|
||||
{
|
||||
GetTree().GetFirstNodeInGroup("Level").QueueFree();
|
||||
var nextScene = GD.Load<PackedScene>(sceneToAdd.ResourcePath);
|
||||
var newScene = nextScene.Instantiate();
|
||||
GetTree().Root.AddChild(newScene);
|
||||
GetTree().Paused = true;
|
||||
}
|
||||
}
|
||||
25
GameLogic/Main.tscn
Normal file
25
GameLogic/Main.tscn
Normal file
@@ -0,0 +1,25 @@
|
||||
[gd_scene load_steps=13 format=3 uid="uid://vwrw05ob2caq"]
|
||||
|
||||
[ext_resource type="Script" path="res://GameLogic/Main.cs" id="1_g4hua"]
|
||||
[ext_resource type="PackedScene" uid="uid://dqv03pua4j8ga" path="res://Levels/Scenes/Level1.tscn" id="2_8xl51"]
|
||||
[ext_resource type="PackedScene" uid="uid://b12gq4yqc3d8i" path="res://UI/MainMenu.tscn" id="2_kvovw"]
|
||||
[ext_resource type="PackedScene" uid="uid://basequfmpg04f" path="res://Levels/Scenes/Level2.tscn" id="3_t7swd"]
|
||||
[ext_resource type="PackedScene" uid="uid://btl5fdyjewnwc" path="res://Levels/Scenes/Level3.tscn" id="4_bs7wi"]
|
||||
[ext_resource type="PackedScene" uid="uid://ctvkevnc0wxka" path="res://Levels/Scenes/Level4.tscn" id="5_n8o1o"]
|
||||
[ext_resource type="PackedScene" uid="uid://col60npvg7wr1" path="res://Levels/Scenes/Level6.tscn" id="6_pqdlv"]
|
||||
[ext_resource type="PackedScene" uid="uid://8ukphol1isp2" path="res://Levels/Scenes/Level5.tscn" id="7_8fpis"]
|
||||
[ext_resource type="PackedScene" uid="uid://bsq7edeueqyjg" path="res://Levels/Scenes/Level7.tscn" id="8_mi3pb"]
|
||||
[ext_resource type="PackedScene" uid="uid://c4xcka4ekuur8" path="res://Levels/Scenes/Level8.tscn" id="9_1ajc1"]
|
||||
[ext_resource type="PackedScene" uid="uid://djwln4at4ho44" path="res://Levels/Scenes/Level9.tscn" id="11_hkjaq"]
|
||||
[ext_resource type="PackedScene" uid="uid://cxj6yeddshy16" path="res://GameLogic/GameManager.tscn" id="11_wiyvp"]
|
||||
|
||||
[node name="Main" type="Node3D"]
|
||||
script = ExtResource("1_g4hua")
|
||||
Levels = Array[PackedScene]([ExtResource("2_8xl51"), ExtResource("3_t7swd"), ExtResource("4_bs7wi"), ExtResource("5_n8o1o"), ExtResource("6_pqdlv"), ExtResource("7_8fpis"), ExtResource("8_mi3pb"), ExtResource("9_1ajc1"), ExtResource("11_hkjaq"), ExtResource("11_hkjaq")])
|
||||
GameManager = ExtResource("11_wiyvp")
|
||||
|
||||
[node name="MainMenu" parent="." instance=ExtResource("2_kvovw")]
|
||||
z_index = 100
|
||||
|
||||
[node name="SFXPlayer" type="AudioStreamPlayer" parent="."]
|
||||
max_polyphony = 10
|
||||
Reference in New Issue
Block a user