diff --git a/MonoGame.Extended/Game1/Game1.cs b/MonoGame.Extended/Game1/Game1.cs index e69f63a3..1b4046d5 100644 --- a/MonoGame.Extended/Game1/Game1.cs +++ b/MonoGame.Extended/Game1/Game1.cs @@ -46,10 +46,13 @@ namespace Game1 { } + private int _previousScrollWheelValue = 0; + protected override void Update(GameTime gameTime) { var deltaTime = (float) gameTime.ElapsedGameTime.TotalSeconds; var keyboardState = Keyboard.GetState(); + var mouseState = Mouse.GetState(); var gamePadState = GamePad.GetState(PlayerIndex.One); if (gamePadState.Buttons.Back == ButtonState.Pressed || keyboardState.IsKeyDown(Keys.Escape)) @@ -58,23 +61,41 @@ namespace Game1 var up = new Vector2(0, -250); var right = new Vector2(250, 0); + // rotation if (keyboardState.IsKeyDown(Keys.Q)) _camera.Rotation -= deltaTime; if (keyboardState.IsKeyDown(Keys.W)) _camera.Rotation += deltaTime; + // movement + var direction = Vector2.Zero; + if (keyboardState.IsKeyDown(Keys.Up)) - _camera.Position += up * deltaTime; + direction += up * deltaTime; if (keyboardState.IsKeyDown(Keys.Down)) - _camera.Position += -up * deltaTime; + direction += -up * deltaTime; if (keyboardState.IsKeyDown(Keys.Left)) - _camera.Position += -right * deltaTime; + direction += -right * deltaTime; if (keyboardState.IsKeyDown(Keys.Right)) - _camera.Position += right * deltaTime; + direction += right * deltaTime; + + _camera.Move(direction); + + // zoom + var scrollWheelDelta = mouseState.ScrollWheelValue - _previousScrollWheelValue; + + if (scrollWheelDelta != 0) + _camera.Zoom += scrollWheelDelta * 0.0001f; + + _previousScrollWheelValue = mouseState.ScrollWheelValue; + + // look at + if (mouseState.LeftButton == ButtonState.Pressed) + _camera.LookAt(_camera.ToScreenSpace(new Vector2(mouseState.X, mouseState.Y))); base.Update(gameTime); } @@ -87,12 +108,12 @@ namespace Game1 _spriteBatch.Draw(_backgroundTextureSky, Vector2.Zero); _spriteBatch.Draw(_backgroundTextureClouds, Vector2.Zero); _spriteBatch.End(); - - for(var i = 0; i < 4; i++) + + for (var i = 0; i < 4; i++) { - var parallaxFactor = new Vector2(1.0f + 0.2f * i, 1.0f - 0.05f * i); - var transformMatrix = _camera.GetViewMatrix(parallaxFactor); - _spriteBatch.Begin(transformMatrix: transformMatrix); + var parallaxFactor = new Vector2(0.5f + 0.25f * i, 1.0f - 0.05f * i); + var viewMatrix = _camera.GetViewMatrix(parallaxFactor); + _spriteBatch.Begin(transformMatrix: viewMatrix); _spriteBatch.Draw(_backgroundTexture[i], Vector2.Zero); _spriteBatch.End(); } diff --git a/MonoGame.Extended/MonoGame.Extended/Camera2D.cs b/MonoGame.Extended/MonoGame.Extended/Camera2D.cs index 5e49c0d8..a6791d45 100644 --- a/MonoGame.Extended/MonoGame.Extended/Camera2D.cs +++ b/MonoGame.Extended/MonoGame.Extended/Camera2D.cs @@ -3,19 +3,18 @@ using Microsoft.Xna.Framework.Graphics; namespace MonoGame.Extended { - public class Camera2D : IMovable, IRotatable + public class Camera2D { - public Camera2D(Viewport viewport) - : this(viewport.Width, viewport.Height) - { - } + private readonly Viewport _viewport; - public Camera2D(int viewportWidth, int viewportHeight) + public Camera2D(Viewport viewport) { + _viewport = viewport; + Rotation = 0; Zoom = 1; - Origin = new Vector2(viewportWidth / 2f, viewportHeight / 2f); - Position = Origin; + Origin = new Vector2(viewport.Width / 2f, viewport.Height / 2f); + Position = Vector2.Zero; } public Vector2 Position { get; set; } @@ -23,45 +22,26 @@ namespace MonoGame.Extended public float Zoom { get; set; } public Vector2 Origin { get; set; } - public Vector2 ToWorldSpace(Vector2 position) + public void Move(Vector2 direction) { - return Vector2.Transform(position, Matrix.Invert(GetViewMatrix())); + Position += Vector2.Transform(direction, Matrix.CreateRotationZ(-Rotation)); } - public Vector2 ToWorldSpace(float x, float y) + public void LookAt(Vector2 position) { - return ToWorldSpace(new Vector2(x, y)); + Position = position - new Vector2(_viewport.Width / 2f, _viewport.Height / 2f); } - public Vector2 ToScreenSpace(Vector2 position) + public Vector2 WorldToScreen(Vector2 worldPosition) { - return Vector2.Transform(position, GetViewMatrix()); + return Vector2.Transform(worldPosition, GetViewMatrix()); } - public Vector2 ToScreenSpace(float x, float y) + public Vector2 ScreenToWorld(Vector2 screenPosition) { - return ToScreenSpace(new Vector2(x, y)); + return Vector2.Transform(screenPosition, Matrix.Invert(GetViewMatrix())); } - //public Rectangle GetVisibileRectangle(int screenWidth, int screenHeight) - //{ - // // NOT TESTED - Source: http://gamedev.stackexchange.com/questions/59301/xna-2d-camera-scrolling-why-use-matrix-transform - // var viewMatrix = GetViewMatrix(); - // var inverseViewMatrix = Matrix.Invert(viewMatrix); - // var topLeft = Vector2.Transform(Vector2.Zero, inverseViewMatrix); - // var topRight = Vector2.Transform(new Vector2(screenWidth, 0), inverseViewMatrix); - // var bottomLeft = Vector2.Transform(new Vector2(0, screenHeight), inverseViewMatrix); - // var bottomRight = Vector2.Transform(new Vector2(screenWidth, screenHeight), inverseViewMatrix); - // var min = new Vector2( - // MathHelper.Min(topLeft.X, MathHelper.Min(topRight.X, MathHelper.Min(bottomLeft.X, bottomRight.X))), - // MathHelper.Min(topLeft.Y, MathHelper.Min(topRight.Y, MathHelper.Min(bottomLeft.Y, bottomRight.Y)))); - // var max = new Vector2( - // MathHelper.Max(topLeft.X, MathHelper.Max(topRight.X, MathHelper.Max(bottomLeft.X, bottomRight.X))), - // MathHelper.Max(topLeft.Y, MathHelper.Max(topRight.Y, MathHelper.Max(bottomLeft.Y, bottomRight.Y)))); - - // return new Rectangle((int)min.X, (int)min.Y, (int)(max.X - min.X), (int)(max.Y - min.Y)); - //} - public Matrix GetViewMatrix(Vector2 parallaxFactor) { return diff --git a/MonoGame.Extended/MonoGame.Extended/IMovable.cs b/MonoGame.Extended/MonoGame.Extended/IMovable.cs deleted file mode 100644 index a8510884..00000000 --- a/MonoGame.Extended/MonoGame.Extended/IMovable.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.Xna.Framework; - -namespace MonoGame.Extended -{ - public interface IMovable - { - Vector2 Position { get; set; } - } -} \ No newline at end of file diff --git a/MonoGame.Extended/MonoGame.Extended/IRotatable.cs b/MonoGame.Extended/MonoGame.Extended/IRotatable.cs deleted file mode 100644 index 7a7d622b..00000000 --- a/MonoGame.Extended/MonoGame.Extended/IRotatable.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MonoGame.Extended -{ - public interface IRotatable - { - float Rotation { get; set; } - } -} \ No newline at end of file diff --git a/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj b/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj index ba341473..aedbdf04 100644 --- a/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj +++ b/MonoGame.Extended/MonoGame.Extended/MonoGame.Extended.csproj @@ -35,8 +35,6 @@ - -