diff --git a/Source/MonoGame.Extended/Gui/GuiButton.cs b/Source/MonoGame.Extended/Gui/GuiButton.cs index 79742453..3432342d 100644 --- a/Source/MonoGame.Extended/Gui/GuiButton.cs +++ b/Source/MonoGame.Extended/Gui/GuiButton.cs @@ -1,6 +1,7 @@ using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; +using MonoGame.Extended.InputListeners; namespace MonoGame.Extended.Gui { @@ -22,7 +23,7 @@ namespace MonoGame.Extended.Gui public bool IsPressed { get; private set; } public bool IsHovered { get; private set; } - public event EventHandler Clicked; + public event EventHandler Clicked; public override GuiControlStyle CurrentStyle { @@ -38,16 +39,29 @@ namespace MonoGame.Extended.Gui } } + public override void OnMouseDown(object sender, MouseEventArgs args) + { + IsPressed = true; + base.OnMouseDown(sender, args); + } + + public override void OnMouseUp(object sender, MouseEventArgs args) + { + if(IsPressed) + Clicked.Raise(this, args); + + IsPressed = false; + base.OnMouseUp(sender, args); + } + public override void Update(GameTime gameTime) { - var mouseState = Mouse.GetState(); - var previouslyPressed = IsPressed; - IsHovered = Shape.Contains(mouseState.X, mouseState.Y); - IsPressed = IsHovered && mouseState.LeftButton == ButtonState.Pressed; + //IsHovered = Contains(mouseState.X, mouseState.Y); + //IsPressed = IsHovered && mouseState.LeftButton == ButtonState.Pressed; - if(previouslyPressed && !IsPressed && IsHovered) - Clicked.Raise(this, EventArgs.Empty); + //if(previouslyPressed && !IsPressed && IsHovered) + // Clicked.Raise(this, EventArgs.Empty); } } } \ No newline at end of file diff --git a/Source/MonoGame.Extended/Gui/GuiControl.cs b/Source/MonoGame.Extended/Gui/GuiControl.cs index 4c8864f4..3ab4ab16 100644 --- a/Source/MonoGame.Extended/Gui/GuiControl.cs +++ b/Source/MonoGame.Extended/Gui/GuiControl.cs @@ -1,4 +1,5 @@ using Microsoft.Xna.Framework; +using MonoGame.Extended.InputListeners; using MonoGame.Extended.Shapes; namespace MonoGame.Extended.Gui @@ -6,6 +7,28 @@ namespace MonoGame.Extended.Gui public abstract class GuiControl : IUpdate { public abstract IShapeF Shape { get; set; } + public virtual void Update(GameTime gameTime) { } + + public bool Contains(Vector2 point) + { + return Shape.Contains(point); + } + + public bool Contains(Point point) + { + return Shape.Contains(point.ToVector2()); + } + + public bool Contains(int x, int y) + { + return Shape.Contains(x, y); + } + + public virtual void OnMouseEnter(object sender, MouseEventArgs args) { } + public virtual void OnMouseLeave(object sender, MouseEventArgs args) { } + public virtual void OnMouseMoved(object sender, MouseEventArgs args) { } + public virtual void OnMouseDown(object sender, MouseEventArgs args) { } + public virtual void OnMouseUp(object sender, MouseEventArgs args) { } } } \ No newline at end of file diff --git a/Source/MonoGame.Extended/Gui/GuiLayout.cs b/Source/MonoGame.Extended/Gui/GuiLayout.cs deleted file mode 100644 index 54d90c82..00000000 --- a/Source/MonoGame.Extended/Gui/GuiLayout.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; -using MonoGame.Extended.ViewportAdapters; - -namespace MonoGame.Extended.Gui -{ - public class GuiLayout : IDraw, IUpdate - { - private readonly ViewportAdapter _viewportAdapter; - - public GuiLayout(ViewportAdapter viewportAdapter, GraphicsDevice graphicsDevice) - { - _viewportAdapter = viewportAdapter; - _spriteBatch = new SpriteBatch(graphicsDevice); - - Controls = new List(); - } - - private readonly SpriteBatch _spriteBatch; - - public List Controls { get; private set; } - - public void Draw(GameTime gameTime) - { - _spriteBatch.Begin(transformMatrix: _viewportAdapter.GetScaleMatrix()); - - foreach (var control in Controls.OfType()) - control.Draw(_spriteBatch); - - _spriteBatch.End(); - } - - public void Update(GameTime gameTime) - { - foreach (var control in Controls) - control.Update(gameTime); - } - } -} \ No newline at end of file diff --git a/Source/MonoGame.Extended/Gui/GuiManager.cs b/Source/MonoGame.Extended/Gui/GuiManager.cs index e9468304..7d9af7e4 100644 --- a/Source/MonoGame.Extended/Gui/GuiManager.cs +++ b/Source/MonoGame.Extended/Gui/GuiManager.cs @@ -1,27 +1,60 @@ -using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using MonoGame.Extended.InputListeners; using MonoGame.Extended.ViewportAdapters; namespace MonoGame.Extended.Gui { public class GuiManager : IDraw, IUpdate { + private readonly ViewportAdapter _viewportAdapter; + private readonly InputListenerManager _inputManager; + private readonly SpriteBatch _spriteBatch; + public GuiManager(ViewportAdapter viewportAdapter, GraphicsDevice graphicsDevice) { - _layout = new GuiLayout(viewportAdapter, graphicsDevice); + _viewportAdapter = viewportAdapter; + _inputManager = new InputListenerManager(viewportAdapter); + _spriteBatch = new SpriteBatch(graphicsDevice); + + Controls = new List(); + + var mouseListener = _inputManager.AddListener(); + mouseListener.MouseMoved += (sender, args) => DelegateMouseEvent(args, c => c.OnMouseMoved(this, args)); + mouseListener.MouseDown += (sender, args) => DelegateMouseEvent(args, c => c.OnMouseDown(this, args)); + mouseListener.MouseUp += (sender, args) => DelegateMouseEvent(args, c => c.OnMouseUp(this, args)); } - private readonly GuiLayout _layout; - public GuiLayout Layout { get { return _layout; } } + public List Controls { get; private set; } + + private void DelegateMouseEvent(MouseEventArgs args, Action action) + { + foreach (var control in Controls + .Where(control => control.Contains(args.Position))) + { + action(control); + } + } public void Draw(GameTime gameTime) { - Layout.Draw(gameTime); + _spriteBatch.Begin(transformMatrix: _viewportAdapter.GetScaleMatrix()); + + foreach (var control in Controls.OfType()) + control.Draw(_spriteBatch); + + _spriteBatch.End(); } public void Update(GameTime gameTime) { - Layout.Update(gameTime); + _inputManager.Update(gameTime); + + foreach (var control in Controls) + control.Update(gameTime); } } } \ No newline at end of file diff --git a/Source/MonoGame.Extended/InputListeners/InputListener.cs b/Source/MonoGame.Extended/InputListeners/InputListener.cs index 1d03e2b6..58d23737 100644 --- a/Source/MonoGame.Extended/InputListeners/InputListener.cs +++ b/Source/MonoGame.Extended/InputListeners/InputListener.cs @@ -1,4 +1,5 @@ using Microsoft.Xna.Framework; +using MonoGame.Extended.ViewportAdapters; namespace MonoGame.Extended.InputListeners { @@ -8,6 +9,8 @@ namespace MonoGame.Extended.InputListeners { } + internal ViewportAdapter ViewportAdapter { get; set; } + internal abstract void Update(GameTime gameTime); } } \ No newline at end of file diff --git a/Source/MonoGame.Extended/InputListeners/InputListenerManager.cs b/Source/MonoGame.Extended/InputListeners/InputListenerManager.cs index 3e867a6f..8d01f2ff 100644 --- a/Source/MonoGame.Extended/InputListeners/InputListenerManager.cs +++ b/Source/MonoGame.Extended/InputListeners/InputListenerManager.cs @@ -3,16 +3,24 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.Xna.Framework; +using MonoGame.Extended.ViewportAdapters; namespace MonoGame.Extended.InputListeners { public class InputListenerManager : IUpdate { public InputListenerManager() + : this(null) { + } + + public InputListenerManager(ViewportAdapter viewportAdapter) + { + _viewportAdapter = viewportAdapter; _listeners = new List(); } + private readonly ViewportAdapter _viewportAdapter; private readonly List _listeners; public IEnumerable Listeners @@ -40,6 +48,7 @@ namespace MonoGame.Extended.InputListeners throw new InvalidOperationException(string.Format("No parameterless constructor defined for type {0}", typeof(T).Name)); var listener = (T)constructors[0].Invoke(new object[0]); + listener.ViewportAdapter = _viewportAdapter; _listeners.Add(listener); return listener; } diff --git a/Source/MonoGame.Extended/InputListeners/MouseEventArgs.cs b/Source/MonoGame.Extended/InputListeners/MouseEventArgs.cs index 90595518..e393e409 100644 --- a/Source/MonoGame.Extended/InputListeners/MouseEventArgs.cs +++ b/Source/MonoGame.Extended/InputListeners/MouseEventArgs.cs @@ -1,17 +1,20 @@ using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; +using MonoGame.Extended.ViewportAdapters; namespace MonoGame.Extended.InputListeners { public class MouseEventArgs : EventArgs { - internal MouseEventArgs(TimeSpan time, MouseState previousState, MouseState currentState, + internal MouseEventArgs(ViewportAdapter viewportAdapter, TimeSpan time, MouseState previousState, MouseState currentState, MouseButton button = MouseButton.None) { PreviousState = previousState; CurrentState = currentState; - Position = new Point(currentState.X, currentState.Y); + Position = viewportAdapter != null + ? viewportAdapter.PointToScreen(currentState.X, currentState.Y) + : new Point(currentState.X, currentState.Y); Button = button; ScrollWheelValue = currentState.ScrollWheelValue; ScrollWheelDelta = currentState.ScrollWheelValue - previousState.ScrollWheelValue; diff --git a/Source/MonoGame.Extended/InputListeners/MouseListener.cs b/Source/MonoGame.Extended/InputListeners/MouseListener.cs index 07c76ab2..6c5a45f5 100644 --- a/Source/MonoGame.Extended/InputListeners/MouseListener.cs +++ b/Source/MonoGame.Extended/InputListeners/MouseListener.cs @@ -40,7 +40,7 @@ namespace MonoGame.Extended.InputListeners if (getButtonState(_currentState) == ButtonState.Pressed && getButtonState(_previousState) == ButtonState.Released) { - var args = new MouseEventArgs(_gameTime.TotalGameTime, _previousState, _currentState, button); + var args = new MouseEventArgs(ViewportAdapter, _gameTime.TotalGameTime, _previousState, _currentState, button); MouseDown.Raise(this, args); _mouseDownArgs = args; @@ -66,7 +66,7 @@ namespace MonoGame.Extended.InputListeners if (getButtonState(_currentState) == ButtonState.Released && getButtonState(_previousState) == ButtonState.Pressed) { - var args = new MouseEventArgs(_gameTime.TotalGameTime, _previousState, _currentState, button); + var args = new MouseEventArgs(ViewportAdapter, _gameTime.TotalGameTime, _previousState, _currentState, button); if (_mouseDownArgs.Button == args.Button) { @@ -110,11 +110,11 @@ namespace MonoGame.Extended.InputListeners // Check for any sort of mouse movement. if (_previousState.X != _currentState.X || _previousState.Y != _currentState.Y) - MouseMoved.Raise(this, new MouseEventArgs(gameTime.TotalGameTime, _previousState, _currentState)); + MouseMoved.Raise(this, new MouseEventArgs(ViewportAdapter, gameTime.TotalGameTime, _previousState, _currentState)); // Handle mouse wheel events. if (_previousState.ScrollWheelValue != _currentState.ScrollWheelValue) - MouseWheelMoved.Raise(this, new MouseEventArgs(gameTime.TotalGameTime, _previousState, _currentState)); + MouseWheelMoved.Raise(this, new MouseEventArgs(ViewportAdapter, gameTime.TotalGameTime, _previousState, _currentState)); _previousState = _currentState; } diff --git a/Source/MonoGame.Extended/MonoGame.Extended.csproj b/Source/MonoGame.Extended/MonoGame.Extended.csproj index 8e8b7e39..d69d8e3b 100644 --- a/Source/MonoGame.Extended/MonoGame.Extended.csproj +++ b/Source/MonoGame.Extended/MonoGame.Extended.csproj @@ -56,7 +56,6 @@ - diff --git a/Source/SpaceGame/GameMain.cs b/Source/SpaceGame/GameMain.cs index 34915788..d0e08054 100644 --- a/Source/SpaceGame/GameMain.cs +++ b/Source/SpaceGame/GameMain.cs @@ -68,9 +68,10 @@ namespace SpaceGame }; button.Clicked += (sender, args) => { + Explode(_player.Position, 3); _player.Destroy(); }; - _guiManager.Layout.Controls.Add(button); + _guiManager.Controls.Add(button);