68 lines
2.9 KiB
C#
68 lines
2.9 KiB
C#
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<Keys> buttonInputs = null!;
|
|
|
|
private float defaultZoomLevel = 1f;
|
|
|
|
protected override void OnFirstActiveFrame()
|
|
{
|
|
if (BehaviourController.TryGetBehaviour(out MonoGameCameraBehaviour? foundCameraBehaviour))
|
|
cameraBehaviour = foundCameraBehaviour;
|
|
|
|
cameraBehaviour ??= BehaviourController.AddBehaviour<MonoGameCameraBehaviour>();
|
|
|
|
if (BehaviourController.TryGetBehaviour(out IButtonInputs<Keys>? foundButtonInputs))
|
|
buttonInputs = foundButtonInputs;
|
|
|
|
buttonInputs ??= BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
|
|
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.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<Keys> 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<Keys> inputs, Keys keys)
|
|
{
|
|
cameraBehaviour.Zoom = defaultZoomLevel;
|
|
Transform.Position = Vector2D.Zero;
|
|
Transform.Rotation = 0f;
|
|
}
|
|
}
|