diff --git a/MonoGame.Extended/Game1/Game1.cs b/MonoGame.Extended/Game1/Game1.cs index 19dbb55f..304bdb9c 100644 --- a/MonoGame.Extended/Game1/Game1.cs +++ b/MonoGame.Extended/Game1/Game1.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using MonoGame.Extended; @@ -14,26 +13,22 @@ namespace Game1 private Texture2D[] _backgroundTexture; private Texture2D _backgroundTextureClouds; private Texture2D _backgroundTextureSky; - private VirtualViewportAdapter _virtualViewportAdapter; public Game1() { _graphicsDeviceManager = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; IsMouseVisible = true; - Window.AllowUserResizing = true; - Window.ClientSizeChanged += WindowOnClientSizeChanged; - } - - private void WindowOnClientSizeChanged(object sender, EventArgs eventArgs) - { - _virtualViewportAdapter.OnClientSizeChanged(); } protected override void Initialize() { - _virtualViewportAdapter = new VirtualViewportAdapter(GraphicsDevice, 800, 480); - _camera = new Camera2D(GraphicsDevice.Viewport); + var viewportAdapter = new ViewportAdapter(GraphicsDevice); + _camera = new Camera2D(viewportAdapter); + + Window.AllowUserResizing = true; + Window.ClientSizeChanged += (s,e) => viewportAdapter.OnClientSizeChanged(); + base.Initialize(); } @@ -112,21 +107,21 @@ namespace Game1 base.Update(gameTime); } - private MouseState _previousMouseState; + //private MouseState _previousMouseState; protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); - _spriteBatch.Begin(transformMatrix: _camera.GetViewMatrix(new Vector2(0.0f, 1.0f)) * _virtualViewportAdapter.GetScaleMatrix()); + _spriteBatch.Begin(transformMatrix: _camera.GetViewMatrix(new Vector2(0.25f, 1.0f))); _spriteBatch.Draw(_backgroundTextureSky, Vector2.Zero); _spriteBatch.Draw(_backgroundTextureClouds, Vector2.Zero); _spriteBatch.End(); for (var i = 0; i < 4; i++) { - var parallaxFactor = new Vector2(0.5f + 0.25f * i, 1.0f); - var viewMatrix = _camera.GetViewMatrix(parallaxFactor) * _virtualViewportAdapter.GetScaleMatrix(); + var parallaxFactor = new Vector2(0.5f + 0.5f * i, 1.0f); + var viewMatrix = _camera.GetViewMatrix(parallaxFactor); _spriteBatch.Begin(transformMatrix: viewMatrix); _spriteBatch.Draw(_backgroundTexture[i], Vector2.Zero); _spriteBatch.End(); diff --git a/MonoGame.Extended/MonoGame.Extended/BoxingViewportAdapter.cs b/MonoGame.Extended/MonoGame.Extended/BoxingViewportAdapter.cs new file mode 100644 index 00000000..81860184 --- /dev/null +++ b/MonoGame.Extended/MonoGame.Extended/BoxingViewportAdapter.cs @@ -0,0 +1,42 @@ +using Microsoft.Xna.Framework.Graphics; + +namespace MonoGame.Extended +{ + public enum BoxingMode + { + Letterbox, Pillarbox + } + + public class BoxingViewportAdapter : ScalingViewportAdapter + { + public BoxingViewportAdapter(GraphicsDevice graphicsDevice, int virtualWidth, int virtualHeight) + : base(graphicsDevice, virtualWidth, virtualHeight) + { + } + + public BoxingMode BoxingMode { get; private set; } + + public override void OnClientSizeChanged() + { + var viewport = GraphicsDevice.Viewport; + var aspectRatio = (float) VirtualWidth / VirtualHeight; + var width = viewport.Width; + var height = (int)(width / aspectRatio + 0.5f); + + if (height > viewport.Height) + { + BoxingMode = BoxingMode.Pillarbox; + height = viewport.Height; + width = (int) (height * aspectRatio + 0.5f); + } + else + { + BoxingMode = BoxingMode.Letterbox; + } + + var x = (viewport.Width / 2) - (width / 2); + var y = (viewport.Height / 2) - (height / 2); + GraphicsDevice.Viewport = new Viewport(x, y, width, height); + } + } +} \ No newline at end of file diff --git a/MonoGame.Extended/MonoGame.Extended/Camera2D.cs b/MonoGame.Extended/MonoGame.Extended/Camera2D.cs index a6791d45..a90d815f 100644 --- a/MonoGame.Extended/MonoGame.Extended/Camera2D.cs +++ b/MonoGame.Extended/MonoGame.Extended/Camera2D.cs @@ -5,15 +5,20 @@ namespace MonoGame.Extended { public class Camera2D { - private readonly Viewport _viewport; + private readonly ViewportAdapter _viewportAdapter; - public Camera2D(Viewport viewport) + public Camera2D(GraphicsDevice graphicsDevice) + : this(new ViewportAdapter(graphicsDevice)) { - _viewport = viewport; + } + + public Camera2D(ViewportAdapter viewportAdapter) + { + _viewportAdapter = viewportAdapter; Rotation = 0; Zoom = 1; - Origin = new Vector2(viewport.Width / 2f, viewport.Height / 2f); + Origin = new Vector2(viewportAdapter.VirtualWidth / 2f, viewportAdapter.VirtualHeight / 2f); Position = Vector2.Zero; } @@ -29,7 +34,7 @@ namespace MonoGame.Extended public void LookAt(Vector2 position) { - Position = position - new Vector2(_viewport.Width / 2f, _viewport.Height / 2f); + Position = position - new Vector2(_viewportAdapter.VirtualWidth / 2f, _viewportAdapter.VirtualHeight / 2f); } public Vector2 WorldToScreen(Vector2 worldPosition) @@ -49,7 +54,8 @@ namespace MonoGame.Extended Matrix.CreateTranslation(new Vector3(-Origin, 0.0f)) * Matrix.CreateRotationZ(Rotation) * Matrix.CreateScale(Zoom, Zoom, 1) * - Matrix.CreateTranslation(new Vector3(Origin, 0.0f)); + Matrix.CreateTranslation(new Vector3(Origin, 0.0f)) * + _viewportAdapter.GetScaleMatrix(); } public Matrix GetViewMatrix() diff --git a/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj b/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj index d4372fa7..c722981c 100644 --- a/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj +++ b/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj @@ -35,10 +35,12 @@ + - + + diff --git a/MonoGame.Extended/MonoGame.Extended/ScalingViewportAdapter.cs b/MonoGame.Extended/MonoGame.Extended/ScalingViewportAdapter.cs new file mode 100644 index 00000000..aca2accb --- /dev/null +++ b/MonoGame.Extended/MonoGame.Extended/ScalingViewportAdapter.cs @@ -0,0 +1,34 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace MonoGame.Extended +{ + public class ScalingViewportAdapter : ViewportAdapter + { + public ScalingViewportAdapter(GraphicsDevice graphicsDevice, int virtualWidth, int virtualHeight) + : base(graphicsDevice) + { + _virtualWidth = virtualWidth; + _virtualHeight = virtualHeight; + } + + private readonly int _virtualWidth; + public override int VirtualWidth + { + get { return _virtualWidth; } + } + + private readonly int _virtualHeight; + public override int VirtualHeight + { + get { return _virtualHeight; } + } + + public override Matrix GetScaleMatrix() + { + var scaleX = (float)ActualWidth / VirtualWidth; + var scaleY = (float)ActualHeight / VirtualHeight; + return Matrix.CreateScale(scaleX, scaleY, 1.0f); + } + } +} \ No newline at end of file diff --git a/MonoGame.Extended/MonoGame.Extended/ViewportAdapter.cs b/MonoGame.Extended/MonoGame.Extended/ViewportAdapter.cs new file mode 100644 index 00000000..29e5a67f --- /dev/null +++ b/MonoGame.Extended/MonoGame.Extended/ViewportAdapter.cs @@ -0,0 +1,44 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace MonoGame.Extended +{ + public class ViewportAdapter + { + public ViewportAdapter(GraphicsDevice graphicsDevice) + { + GraphicsDevice = graphicsDevice; + } + + protected GraphicsDevice GraphicsDevice { get; private set; } + + public virtual int VirtualWidth + { + get { return ActualWidth; } + } + + public virtual int VirtualHeight + { + get { return ActualHeight; } + } + + public int ActualWidth + { + get { return GraphicsDevice.Viewport.Width; } + } + + public int ActualHeight + { + get { return GraphicsDevice.Viewport.Height; } + } + + public virtual void OnClientSizeChanged() + { + } + + public virtual Matrix GetScaleMatrix() + { + return Matrix.Identity; + } + } +} \ No newline at end of file diff --git a/MonoGame.Extended/MonoGame.Extended/VirtualViewportAdapter.cs b/MonoGame.Extended/MonoGame.Extended/VirtualViewportAdapter.cs deleted file mode 100644 index 309a3461..00000000 --- a/MonoGame.Extended/MonoGame.Extended/VirtualViewportAdapter.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; - -namespace MonoGame.Extended -{ - public class VirtualViewportAdapter - { - private readonly GraphicsDevice _graphicsDevice; - - public VirtualViewportAdapter(GraphicsDevice graphicsDevice, int virtualWidth, int virtualHeight) - { - _graphicsDevice = graphicsDevice; - - VirtualWidth = virtualWidth; - VirtualHeight = virtualHeight; - } - - public int VirtualWidth { get; private set; } - public int VirtualHeight { get; private set; } - - public int ActualWidth - { - get { return _graphicsDevice.Viewport.Width; } - } - - public int ActualHeight - { - get { return _graphicsDevice.Viewport.Height; } - } - - public Matrix GetScaleMatrix() - { - var scaleX = (float) ActualWidth / VirtualWidth; - var scaleY = (float) ActualHeight / VirtualHeight; - return Matrix.CreateScale(scaleX, scaleY, 1.0f); - } - - public void OnClientSizeChanged() - { - var viewport = _graphicsDevice.Viewport; - var aspectRatio = (float) VirtualWidth / VirtualHeight; - var width = viewport.Width; - var height = (int)(width / aspectRatio + 0.5f); - - if (height > viewport.Height) - { - height = viewport.Height; - width = (int)(height * aspectRatio + 0.5f); - } - - var x = (viewport.Width / 2) - (width / 2); - var y = (viewport.Height / 2) - (height / 2); - _graphicsDevice.Viewport = new Viewport(x, y, width, height); - } - } -} \ No newline at end of file