diff --git a/Scripts/Testing/LibraryTest.cs b/Scripts/Testing/LibraryTest.cs index 95d3d80..a5f9ced 100644 --- a/Scripts/Testing/LibraryTest.cs +++ b/Scripts/Testing/LibraryTest.cs @@ -1,4 +1,5 @@ using System; +using EinSoftworks.Camera; using EinSoftworks.Events; using EinSoftworks.Input; using EinSoftworks.StateManagement; @@ -17,6 +18,12 @@ public partial class LibraryTest : Node private RunningPlayerState _runningState; private JumpingPlayerState _jumpingState; + // Camera test fields + private FirstPersonCamera _fpCamera; + private OrbitCamera _orbitCamera; + private Node3D _cameraTarget; + private CameraController _activeCamera; + public override void _Ready() { GD.Print("=== EinSoftworks Library Integration Test ===\n"); @@ -26,6 +33,7 @@ public partial class LibraryTest : Node TestInput(); TestStateMachine(); TestHierarchicalStateMachine(); + TestCamera(); GD.Print("\n=== All Tests Initialized Successfully ==="); GD.Print("Watch console for runtime behavior...\n"); @@ -55,6 +63,27 @@ public partial class LibraryTest : Node GD.Print("\n[Frame 180] Testing hierarchical state change..."); _hierarchicalSM?.ChangeState("Combat"); } + else if (_frameCount == 240) + { + GD.Print("\n[Frame 240] Testing camera mode switch to Orbit..."); + if (_orbitCamera != null && _activeCamera != null) + { + _activeCamera.SetCameraMode(CameraController.CameraMode.Orbit, 1.5f); + _orbitCamera.Visible = true; + _fpCamera.Visible = false; + _activeCamera = _orbitCamera; + } + } + else if (_frameCount == 360) + { + GD.Print("\n[Frame 360] Testing camera shake effect..."); + _activeCamera?.Shake(0.3f, 0.5f); + } + else if (_frameCount == 420) + { + GD.Print("\n[Frame 420] Testing camera zoom effect..."); + _activeCamera?.Zoom(60f, 1.0f); + } } private void TestUtilities() @@ -190,6 +219,64 @@ public partial class LibraryTest : Node GD.Print(""); } + private void TestCamera() + { + GD.Print("--- Testing EinSoftworks.Camera ---"); + + // Create a target node for cameras to follow + _cameraTarget = new Node3D(); + _cameraTarget.Name = "CameraTarget"; + _cameraTarget.Position = new Vector3(0, 1, 0); + AddChild(_cameraTarget); + + // Create FirstPersonCamera + _fpCamera = new FirstPersonCamera(); + _fpCamera.Name = "FirstPersonCamera"; + _fpCamera.Target = _cameraTarget; + _fpCamera.MouseSensitivity = 0.15f; + _fpCamera.MinPitch = -85f; + _fpCamera.MaxPitch = 85f; + _fpCamera.Position = new Vector3(0, 1.6f, 0); + AddChild(_fpCamera); + _fpCamera.Camera.MakeCurrent(); + _activeCamera = _fpCamera; + + GD.Print($"✓ Created FirstPersonCamera (Active)"); + GD.Print($" - Target: {_fpCamera.Target?.Name}"); + GD.Print($" - Mouse Sensitivity: {_fpCamera.MouseSensitivity}"); + GD.Print($" - Pitch Range: {_fpCamera.MinPitch}° to {_fpCamera.MaxPitch}°"); + + // Create OrbitCamera (initially hidden) + _orbitCamera = new OrbitCamera(); + _orbitCamera.Name = "OrbitCamera"; + _orbitCamera.Target = _cameraTarget; + _orbitCamera.MinDistance = 3f; + _orbitCamera.MaxDistance = 10f; + _orbitCamera.ZoomSpeed = 1f; + _orbitCamera.EnableCollisionAvoidance = true; + _orbitCamera.Visible = false; + AddChild(_orbitCamera); + + GD.Print($"✓ Created OrbitCamera (Standby)"); + GD.Print($" - Distance Range: {_orbitCamera.MinDistance} to {_orbitCamera.MaxDistance}"); + GD.Print($" - Collision Avoidance: {_orbitCamera.EnableCollisionAvoidance}"); + + // Subscribe to camera events + _fpCamera.EventBus.Subscribe(evt => + { + GD.Print($" → Camera event: {evt.OldMode} → {evt.NewMode} (Transition: {evt.TransitionTime}s)"); + }); + + _fpCamera.CameraModeChanged += (oldMode, newMode) => + { + GD.Print($" → Camera signal: Mode changed from {oldMode} to {newMode}"); + }; + + GD.Print("✓ Subscribed to camera events and signals"); + GD.Print(" (Camera will switch modes and demonstrate effects during runtime)"); + GD.Print(""); + } + private void OnTestEvent(TestEvent evt) { GD.Print($" → Event received: {evt.Message} (Value: {evt.Value})"); @@ -201,6 +288,11 @@ public partial class LibraryTest : Node _eventBus?.Unsubscribe(OnTestEvent); _stateMachine?.Clear(); _hierarchicalSM?.Clear(); + + // Camera cleanup happens automatically + _fpCamera?.QueueFree(); + _orbitCamera?.QueueFree(); + _cameraTarget?.QueueFree(); } } diff --git a/Voider.csproj b/Voider.csproj index c2d7485..b96153a 100644 --- a/Voider.csproj +++ b/Voider.csproj @@ -11,5 +11,6 @@ +