using Microsoft.Xna.Framework.Input; using Syntriax.Engine.Core; using Syntriax.Engine.Input; namespace Pong.Behaviours; public class CameraController : BehaviourOverride { private MonoGameCamera2DBehaviour cameraBehaviour = null!; private IButtonInputs buttonInputs = null!; private float defaultZoomLevel = 1f; protected override void OnFirstActiveFrame() { if (BehaviourController.TryGetBehaviour(out MonoGameCamera2DBehaviour? foundCameraBehaviour)) cameraBehaviour = foundCameraBehaviour; cameraBehaviour ??= BehaviourController.AddBehaviour(); if (BehaviourController.TryGetBehaviour(out IButtonInputs? foundButtonInputs)) buttonInputs = foundButtonInputs; buttonInputs ??= BehaviourController.AddBehaviour(); buttonInputs.RegisterOnPress(Keys.F, SwitchToFullScreen); buttonInputs.RegisterOnPress(Keys.R, ResetCamera); } protected override void OnUpdate() { if (buttonInputs.IsPressed(Keys.U)) cameraBehaviour.Zoom += Time.Elapsed.Nanoseconds * 0.00025f; if (buttonInputs.IsPressed(Keys.J)) cameraBehaviour.Zoom -= Time.Elapsed.Nanoseconds * 0.00025f; if (buttonInputs.IsPressed(Keys.NumPad8)) cameraBehaviour.BehaviourController.GameObject.Transform.Position += Vector2D.Up.Rotate(Transform.Rotation * Math.DegreeToRadian) * Time.DeltaTimeFrame; if (buttonInputs.IsPressed(Keys.NumPad2)) cameraBehaviour.BehaviourController.GameObject.Transform.Position -= Vector2D.Up.Rotate(Transform.Rotation * Math.DegreeToRadian) * Time.DeltaTimeFrame; if (buttonInputs.IsPressed(Keys.NumPad6)) cameraBehaviour.BehaviourController.GameObject.Transform.Position += Vector2D.Right.Rotate(Transform.Rotation * Math.DegreeToRadian) * Time.DeltaTimeFrame; if (buttonInputs.IsPressed(Keys.NumPad4)) cameraBehaviour.BehaviourController.GameObject.Transform.Position -= Vector2D.Right.Rotate(Transform.Rotation * Math.DegreeToRadian) * Time.DeltaTimeFrame; if (buttonInputs.IsPressed(Keys.Q)) cameraBehaviour.BehaviourController.GameObject.Transform.Rotation += Time.Elapsed.Nanoseconds * 0.0025f; if (buttonInputs.IsPressed(Keys.E)) cameraBehaviour.BehaviourController.GameObject.Transform.Rotation -= Time.Elapsed.Nanoseconds * 0.0025f; } private void SwitchToFullScreen(IButtonInputs inputs, Keys keys) { if (cameraBehaviour.Graphics.IsFullScreen) return; cameraBehaviour.Graphics.PreferMultiSampling = false; cameraBehaviour.Graphics.PreferredBackBufferWidth = cameraBehaviour.Graphics.GraphicsDevice.Adapter.CurrentDisplayMode.Width; cameraBehaviour.Graphics.PreferredBackBufferHeight = cameraBehaviour.Graphics.GraphicsDevice.Adapter.CurrentDisplayMode.Height; cameraBehaviour.Graphics.IsFullScreen = true; cameraBehaviour.Graphics.ApplyChanges(); float previousScreenSize = Math.Sqrt(Math.Sqr(cameraBehaviour.Viewport.Width) + Math.Sqr(cameraBehaviour.Viewport.Height)); float currentScreenSize = Math.Sqrt(Math.Sqr(cameraBehaviour.Graphics.GraphicsDevice.Viewport.Width) + Math.Sqr(cameraBehaviour.Graphics.GraphicsDevice.Viewport.Height)); defaultZoomLevel /= previousScreenSize / currentScreenSize; cameraBehaviour.Zoom /= previousScreenSize / currentScreenSize; cameraBehaviour.Viewport = cameraBehaviour.Graphics.GraphicsDevice.Viewport; } private void ResetCamera(IButtonInputs inputs, Keys keys) { cameraBehaviour.Zoom = defaultZoomLevel; Transform.Position = Vector2D.Zero; Transform.Rotation = 0f; } }