/ godot / nodes / FightScene.cs
FightScene.cs
 1  using Godot;
 2  using Game.Util;
 3  
 4  namespace Game.Nodes;
 5  
 6  public partial class FightScene : Node3D
 7  {
 8  	private Camera3D camera;
 9  	private Node3D cameraPivot;
10  	private Fighter fighter1;
11  	private Fighter fighter2;
12  	private FightInputManager fightInputManager;
13  	private PanelContainer inGameMenu;
14  	private Button mainMenuButton;
15  
16  	public bool Playing
17  	{
18  		get => fightInputManager.Playing;
19  		set => fightInputManager.Playing = value;
20  	}
21  	
22  	public override void _PhysicsProcess(double delta)
23  	{
24  		if(Input.IsActionJustPressed("MenuOpen"))
25  		{
26  			inGameMenu.Visible = !inGameMenu.Visible;
27  			Playing = !Playing;
28  			
29  			if(inGameMenu.Visible)
30  				mainMenuButton.GrabFocus();
31  		}
32  		
33  		if(Playing)
34  			updateCamera((float)delta);
35  	}
36  	
37  	public override void _Ready()
38  	{
39  		camera = GetNode<Camera3D>("%Camera");
40  		cameraPivot = GetNode<Node3D>("%CameraPivot");
41  		fightInputManager = GetNode<FightInputManager>("%FightInputManager");
42  		inGameMenu = GetNode<PanelContainer>("%InGameMenu");
43  		mainMenuButton = GetNode<Button>("%MainMenuButton");
44  		mainMenuButton.Pressed += goToMainMenu;
45  
46  		var fighterScene = GD.Load<PackedScene>("res://nodes/Fighter.tscn");
47  		if(fighterScene.CanInstantiate())
48  		{
49  			fighter1 = fighterScene.Instantiate<Fighter>();
50  			AddChild(fighter1);
51  			fighter1.GlobalPosition = GetNode<Node3D>("%SpawnP1").GlobalPosition;
52  			fighter1.Active = true;
53  			
54  			fighter2 = fighterScene.Instantiate<Fighter>();
55  			fighter2.MirrorInputs = true;
56  			AddChild(fighter2);
57  			fighter2.GlobalPosition = GetNode<Node3D>("%SpawnP2").GlobalPosition;
58  			
59  			fightInputManager.PlayerOne = fighter1;
60  			fightInputManager.PlayerTwo = fighter2;
61  			
62  			fighter1.Opponent = fighter2;
63  			fighter2.Opponent = fighter1;
64  			
65  			Playing = true;
66  		}
67  		else
68  			Playing = false;
69  	}
70  	
71  	private void goToMainMenu()
72  	{
73  		var mainMenuScene = GD.Load<PackedScene>("res://nodes/MainMenu.tscn");
74  		if(mainMenuScene.CanInstantiate())
75  			GetTree().ChangeSceneToPacked(mainMenuScene);
76  	}
77  	
78  	private void updateCamera(float delta)
79  	{
80  		var f1Pos = fighter1.GlobalPosition;
81  		var f2Pos = fighter2.GlobalPosition;
82  		
83  		var centerPoint = (f1Pos + f2Pos) / 2;
84  		var newPos = cameraPivot.GlobalPosition.Lerp(centerPoint, 5f * delta);;
85  		var newBasis = fighter1.GlobalBasis.Rotated(Vector3.Up, 1.5f).Orthonormalized();
86  		
87  		cameraPivot.GlobalPosition = new(newPos.X, cameraPivot.GlobalPosition.Y, newPos.Z);
88  		cameraPivot.GlobalBasis = cameraPivot.GlobalBasis.Slerp(newBasis, 5f * delta).Orthonormalized();
89  	}
90  }