diff --git a/Game/Behaviours/CameraController.cs b/Game/Behaviours/CameraController.cs new file mode 100644 index 0000000..641a51d --- /dev/null +++ b/Game/Behaviours/CameraController.cs @@ -0,0 +1,55 @@ +using Microsoft.Xna.Framework.Input; +using Syntriax.Engine.Core; +using Syntriax.Engine.Input; + +namespace Pong.Behaviours; + +public class CameraController : BehaviourOverride +{ + private MonoGameCameraBehaviour cameraBehaviour = null!; + private IButtonInputs buttonInputs = null!; + + protected override void OnFirstActiveFrame() + { + if (BehaviourController.TryGetBehaviour(out MonoGameCameraBehaviour? foundCameraBehaviour)) + cameraBehaviour = foundCameraBehaviour; + + cameraBehaviour ??= BehaviourController.AddBehaviour(); + + if (BehaviourController.TryGetBehaviour(out IButtonInputs? foundButtonInputs)) + buttonInputs = foundButtonInputs; + + buttonInputs ??= BehaviourController.AddBehaviour(); + buttonInputs.RegisterOnPress(Keys.F, SwitchToFullScreen); + } + + 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.Q)) + cameraBehaviour.BehaviourController.GameObject.Transform.Rotation += Time.Elapsed.Nanoseconds * 0.000025f; + if (buttonInputs.IsPressed(Keys.E)) + cameraBehaviour.BehaviourController.GameObject.Transform.Rotation -= Time.Elapsed.Nanoseconds * 0.000025f; + } + + private void SwitchToFullScreen(IButtonInputs inputs, Keys keys) + { + if (Game1.graphics.IsFullScreen) + return; + + Game1.graphics.PreferMultiSampling = false; + Game1.graphics.PreferredBackBufferWidth = Game1.graphics.GraphicsDevice.Adapter.CurrentDisplayMode.Width; + Game1.graphics.PreferredBackBufferHeight = Game1.graphics.GraphicsDevice.Adapter.CurrentDisplayMode.Height; + Game1.graphics.IsFullScreen = true; + Game1.graphics.ApplyChanges(); + + float previousScreenSize = Math.Sqrt(Math.Pow(cameraBehaviour.Viewport.Width, 2f) + Math.Pow(cameraBehaviour.Viewport.Height, 2f)); + float currentScreenSize = Math.Sqrt(Math.Pow(Game1.graphics.GraphicsDevice.Viewport.Width, 2f) + Math.Pow(Game1.graphics.GraphicsDevice.Viewport.Height, 2f)); + cameraBehaviour.Zoom /= previousScreenSize / currentScreenSize; + cameraBehaviour.Viewport = Game1.graphics.GraphicsDevice.Viewport; + } +} diff --git a/Game/Behaviours/MonoGameCameraBehaviour.cs b/Game/Behaviours/MonoGameCameraBehaviour.cs index 09e5d19..f04f56f 100644 --- a/Game/Behaviours/MonoGameCameraBehaviour.cs +++ b/Game/Behaviours/MonoGameCameraBehaviour.cs @@ -1,17 +1,12 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; - using Syntriax.Engine.Core; -using Syntriax.Engine.Core.Abstract; namespace Pong.Behaviours; - public class MonoGameCameraBehaviour : BehaviourOverride { - public System.Action? OnPositionChanged { get; set; } = null; public System.Action? OnMatrixTransformChanged { get; set; } = null; public System.Action? OnViewportChanged { get; set; } = null; - public System.Action? OnRotationChanged { get; set; } = null; public System.Action? OnZoomChanged { get; set; } = null; private Matrix _matrixTransform = Matrix.Identity; @@ -81,19 +76,4 @@ public class MonoGameCameraBehaviour : BehaviourOverride Matrix.CreateScale(Zoom) * Matrix.CreateTranslation(new Vector3(_viewport.Width * .5f, _viewport.Height * .5f, 0f)); } - - protected override void OnInitialize() - { - Transform.OnRotationChanged += OnTransformRotationChanged; - Transform.OnPositionChanged += OnTransformPositionChanged; - } - - protected override void OnFinalize() - { - Transform.OnRotationChanged -= OnTransformRotationChanged; - Transform.OnPositionChanged -= OnTransformPositionChanged; - } - - private void OnTransformRotationChanged(ITransform _) => OnRotationChanged?.Invoke(this); - private void OnTransformPositionChanged(ITransform _) => OnPositionChanged?.Invoke(this); } diff --git a/Game/Game1.cs b/Game/Game1.cs index 23f2170..2e4b853 100644 --- a/Game/Game1.cs +++ b/Game/Game1.cs @@ -16,12 +16,12 @@ namespace Pong; public class Game1 : Game { - private GraphicsDeviceManager _graphics = null!; - private IPhysicsEngine2D engine = null!; - private SpriteBatch _spriteBatch = null!; - private ShapeBatch _shapeBatch = null!; + public static GraphicsDeviceManager graphics = null!; + public static IPhysicsEngine2D engine = null!; + public static SpriteBatch spriteBatch = null!; + public static ShapeBatch shapeBatch = null!; public static GameManager gameManager = null!; - public static Sprite spriteBox = null!; + private MonoGameCameraBehaviour cameraBehaviour = null!; private PongScoreboard pongScoreboard; @@ -32,7 +32,7 @@ public class Game1 : Game IterationCount = 3 }; - _graphics = new GraphicsDeviceManager(this) + graphics = new GraphicsDeviceManager(this) { PreferredBackBufferWidth = 1024, PreferredBackBufferHeight = 576, @@ -55,17 +55,16 @@ public class Game1 : Game protected override void LoadContent() { - _spriteBatch = new SpriteBatch(GraphicsDevice); - _shapeBatch = new ShapeBatch(GraphicsDevice, Content); + spriteBatch = new SpriteBatch(GraphicsDevice); + shapeBatch = new ShapeBatch(GraphicsDevice, Content); SpriteFont spriteFont = Content.Load("UbuntuMono"); - // spriteBox = new Sprite() { Texture2D = Content.Load("Sprites/Pixel") }; - // Sprite spriteBall = new Sprite() { Texture2D = Content.Load("Sprites/Circle") }; - IGameObject gameObjectCamera = gameManager.InstantiateGameObject(); gameObjectCamera.Name = "Camera"; gameObjectCamera.Transform.Position = Vector2D.Zero; + gameObjectCamera.BehaviourController.AddBehaviour(); + cameraBehaviour = gameObjectCamera.BehaviourController.AddBehaviour(); cameraBehaviour.Viewport = GraphicsDevice.Viewport; @@ -193,33 +192,6 @@ public class Game1 : Game if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); - if (Keyboard.GetState().IsKeyDown(Keys.F)) - { - if (_graphics.IsFullScreen) - return; - - _graphics.PreferMultiSampling = false; - _graphics.PreferredBackBufferWidth = GraphicsDevice.Adapter.CurrentDisplayMode.Width; - _graphics.PreferredBackBufferHeight = GraphicsDevice.Adapter.CurrentDisplayMode.Height; - _graphics.IsFullScreen = true; - _graphics.ApplyChanges(); - - float previousScreenSize = MathF.Sqrt(MathF.Pow(cameraBehaviour.Viewport.Width, 2f) + MathF.Pow(cameraBehaviour.Viewport.Height, 2f)); - float currentScreenSize = MathF.Sqrt(MathF.Pow(GraphicsDevice.Viewport.Width, 2f) + MathF.Pow(GraphicsDevice.Viewport.Height, 2f)); - cameraBehaviour.Zoom /= previousScreenSize / currentScreenSize; - cameraBehaviour.Viewport = GraphicsDevice.Viewport; - } - - if (Keyboard.GetState().IsKeyDown(Keys.U)) - cameraBehaviour.Zoom += gameTime.ElapsedGameTime.Nanoseconds * 0.00025f; - if (Keyboard.GetState().IsKeyDown(Keys.J)) - cameraBehaviour.Zoom -= gameTime.ElapsedGameTime.Nanoseconds * 0.00025f; - - if (Keyboard.GetState().IsKeyDown(Keys.Q)) - cameraBehaviour.BehaviourController.GameObject.Transform.Rotation += gameTime.ElapsedGameTime.Nanoseconds * 0.000025f; - if (Keyboard.GetState().IsKeyDown(Keys.E)) - cameraBehaviour.BehaviourController.GameObject.Transform.Rotation -= gameTime.ElapsedGameTime.Nanoseconds * 0.000025f; - if (Keyboard.GetState().IsKeyDown(Keys.Space)) pongScoreboard.Reset(); @@ -243,17 +215,17 @@ public class Game1 : Game // TODO: Add your drawing code here gameManager.PreDraw(); - _spriteBatch.Begin(SpriteSortMode.Deferred, transformMatrix: cameraBehaviour.MatrixTransform); + spriteBatch.Begin(SpriteSortMode.Deferred, transformMatrix: cameraBehaviour.MatrixTransform); foreach (IGameObject gameObject in gameManager) foreach (var displayable in gameObject.BehaviourController.GetBehaviours()) - displayable.Draw(_spriteBatch); - _spriteBatch.End(); + displayable.Draw(spriteBatch); + spriteBatch.End(); - _shapeBatch.Begin(cameraBehaviour.MatrixTransform); + shapeBatch.Begin(cameraBehaviour.MatrixTransform); foreach (IGameObject gameObject in gameManager) foreach (var displayableShape in gameObject.BehaviourController.GetBehaviours()) - displayableShape.Draw(_shapeBatch); - _shapeBatch.End(); + displayableShape.Draw(shapeBatch); + shapeBatch.End(); base.Draw(gameTime); }