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 }