From 88f60fcbf08a9f9a8d422d48e910a7cf1cb63aef Mon Sep 17 00:00:00 2001 From: Ian C Date: Sat, 26 May 2012 22:05:23 +0000 Subject: Moved source files for reorganisation. --- .../Joystick/JoystickDriver.cs | 177 ++++++++++++++++ .../Joystick/JoystickState.cs | 43 ++++ .../Keyboard/KeyboardDriver.cs | 236 +++++++++++++++++++++ 3 files changed, 456 insertions(+) create mode 100644 src/Noddybox.Emulation.Xna.Input/Joystick/JoystickDriver.cs create mode 100644 src/Noddybox.Emulation.Xna.Input/Joystick/JoystickState.cs create mode 100644 src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs (limited to 'src/Noddybox.Emulation.Xna.Input') diff --git a/src/Noddybox.Emulation.Xna.Input/Joystick/JoystickDriver.cs b/src/Noddybox.Emulation.Xna.Input/Joystick/JoystickDriver.cs new file mode 100644 index 0000000..f0d2b63 --- /dev/null +++ b/src/Noddybox.Emulation.Xna.Input/Joystick/JoystickDriver.cs @@ -0,0 +1,177 @@ +// This file is part of the Noddybox.Emulation C# suite. +// +// Noddybox.Emulation is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Noddybox.Emulation is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Noddybox.Emulation. If not, see . +// +// Copyright (c) 2012 Ian Cowburn +// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input.Touch; + +namespace Noddybox.Emulation.Xna.Joystick +{ + /// + /// Displays and drives the joystick. Unlike the keyboard this is not + /// not done event driven, but as a clasic Joystick interface. + /// + public class JoystickDriver + { + #region Private data + + private Texture2D backgroundImage; + private Texture2D joystickImage; + private Texture2D buttonImage; + private Vector2 position; + private JoystickState state; + + #endregion + + #region Private members + + #endregion + + #region Public properties + + /// + /// Get the current state of the joystick and fire buttons. + /// + public JoystickState State {get {return state;}} + + #endregion + + #region Public members + + /// + /// Updates the keyboard. Note that this will consume all the key press events. + /// + public void Update() + { + foreach (TouchLocation t in TouchPanel.GetState()) + { + // int x = (int)t.Position.X; + // int y = (int)t.Position.Y; + // int f = 0; + // KeyState key = null; + + + // if (t.State == TouchLocationState.Pressed) + // { + // for(f = 0; f < keymapSize && key == null; f++) + // { + // if (keymapPos[f].Contains(x, y)) + // { + // key = keymapState[f]; + // } + // } + + // if (key != null) + // { + // key.TouchId = t.Id; + + // if (key.IsSticky) + // { + // key.IsPressed = !key.IsPressed; + // } + // else + // { + // key.IsPressed = true; + // } + + // if (KeyEvent != null) + // { + // KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); + // } + // } + // } + // else if (t.State == TouchLocationState.Released) + // { + // for(f = 0; f < keymapSize && key == null; f++) + // { + // if (keymapState[f].TouchId == t.Id) + // { + // key = keymapState[f]; + // } + // } + + // if (key != null) + // { + // if (!key.IsSticky) + // { + // key.IsPressed = false; + + // if (KeyEvent != null) + // { + // KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); + // } + // } + // } + // } + + // // If no key handled, pass on the event + // // + // if (key == null && keymapState.Where(r => r.TouchId == t.Id).Count() == 0) + // { + // if (TouchEvent != null) + // { + // TouchEvent(this, new TouchLocationEventArgs() {Location = t}); + // } + // } + } + } + + /// + /// Draw the keyboard + /// + /// + public void Draw(SpriteBatch spriteBatch) + { + //spriteBatch.Draw(image, position, Color.White); + + //for(int f = 0; f < keymapSize; f++) + //{ + // if (keymapState[f].IsPressed) + // { + // spriteBatch.Draw(overlay, keymapPos[f], new Color(200, 200, 0, 25)); + // } + //} + } + + #endregion + + #region Constructors + + /// + /// Constructor. + /// + /// The graphics device to associate textures with. + /// The image for the joystick background. + /// The image for the joystick knob. + /// The image for a joystick button. + /// Where to draw and offset the joystick to. + public JoystickDriver(GraphicsDevice graphics, Texture2D backgroundImage, Texture2D joystickImage, Texture2D buttonImage, Vector2 position) + { + this.backgroundImage = backgroundImage; + this.joystickImage = joystickImage; + this.buttonImage = buttonImage; + this.position = position; + this.state = JoystickState.None; + } + + #endregion + } +} diff --git a/src/Noddybox.Emulation.Xna.Input/Joystick/JoystickState.cs b/src/Noddybox.Emulation.Xna.Input/Joystick/JoystickState.cs new file mode 100644 index 0000000..97219bc --- /dev/null +++ b/src/Noddybox.Emulation.Xna.Input/Joystick/JoystickState.cs @@ -0,0 +1,43 @@ +// This file is part of the Noddybox.Emulation C# suite. +// +// Noddybox.Emulation is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Noddybox.Emulation is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Noddybox.Emulation. If not, see . +// +// Copyright (c) 2012 Ian Cowburn +// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input.Touch; + +namespace Noddybox.Emulation.Xna.Joystick +{ + /// + /// Defines the state of the joystick. + /// + public enum JoystickState + { + None = 0x00, + Up = 0x01, + Down = 0x02, + Left = 0x04, + Right = 0x08, + Fire1 = 0x10, + Fire2 = 0x20, + Fire3 = 0x40, + Fire4 = 0x80 + } +} diff --git a/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs b/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs new file mode 100644 index 0000000..7d802da --- /dev/null +++ b/src/Noddybox.Emulation.Xna.Input/Keyboard/KeyboardDriver.cs @@ -0,0 +1,236 @@ +// This file is part of the Noddybox.Emulation C# suite. +// +// Noddybox.Emulation is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Noddybox.Emulation is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Noddybox.Emulation. If not, see . +// +// Copyright (c) 2012 Ian Cowburn +// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Noddybox.Emulation.Keyboard.Schema; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input.Touch; + +namespace Noddybox.Emulation.Xna.Keyboard +{ + /// + /// Displays and drives the keyboard. + /// + /// The enumerated type matching the symbols in the used keyboard definition. + public class KeyboardDriver where T: struct,IConvertible + { + #region Event arguments + + /// + /// Event data when a key is pressed or released. + /// + public class KeyPressEventArgs : EventArgs + { + /// + /// The key that was pressed. + /// + public T Key {get;set;} + + /// + /// True if the key was pressed. False if released. + /// + public bool Pressed {get; set;} + } + + /// + /// Event data when the screen is touched away from a key. + /// + public class TouchLocationEventArgs : EventArgs + { + /// + /// The touch. + /// + public TouchLocation Location {get; set;} + } + + #endregion + + #region Private data + + private class KeyState + { + public T Symbol {get;set;} + public bool IsPressed {get; set;} + public bool IsSticky {get; set;} + public int TouchId {get; set;} + } + + private Rectangle[] keymapPos; + private KeyState[] keymapState; + private int keymapSize; + private KeyboardDefinition keyboard; + private Texture2D image; + private Vector2 position; + private Texture2D overlay; + + #endregion + + #region Private members + + #endregion + + #region Public members + + /// + /// Updates the keyboard. Note that this will consume all the key press events. + /// + public void Update() + { + foreach (TouchLocation t in TouchPanel.GetState()) + { + int x = (int)t.Position.X; + int y = (int)t.Position.Y; + int f = 0; + KeyState key = null; + + + if (t.State == TouchLocationState.Pressed) + { + for(f = 0; f < keymapSize && key == null; f++) + { + if (keymapPos[f].Contains(x, y)) + { + key = keymapState[f]; + } + } + + if (key != null) + { + key.TouchId = t.Id; + + if (key.IsSticky) + { + key.IsPressed = !key.IsPressed; + } + else + { + key.IsPressed = true; + } + + if (KeyEvent != null) + { + KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); + } + } + } + else if (t.State == TouchLocationState.Released) + { + for(f = 0; f < keymapSize && key == null; f++) + { + if (keymapState[f].TouchId == t.Id) + { + key = keymapState[f]; + } + } + + if (key != null) + { + if (!key.IsSticky) + { + key.IsPressed = false; + + if (KeyEvent != null) + { + KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed}); + } + } + } + } + + // If no key handled, pass on the event + // + if (key == null && keymapState.Where(r => r.TouchId == t.Id).Count() == 0) + { + if (TouchEvent != null) + { + TouchEvent(this, new TouchLocationEventArgs() {Location = t}); + } + } + } + } + + /// + /// Draw the keyboard + /// + /// + public void Draw(SpriteBatch spriteBatch) + { + spriteBatch.Draw(image, position, Color.White); + + for(int f = 0; f < keymapSize; f++) + { + if (keymapState[f].IsPressed) + { + spriteBatch.Draw(overlay, keymapPos[f], new Color(200, 200, 0, 25)); + } + } + } + + #endregion + + #region Events + + public EventHandler KeyEvent; + public EventHandler TouchEvent; + + #endregion + + #region Constructors + + /// + /// Constructor. + /// + /// The graphics device to associate textures with. + /// The image for the keyboard. + /// Where to draw and offset the keyboard to. + /// The keyboard to drive this from. + public KeyboardDriver(GraphicsDevice graphics, Texture2D image, Vector2 position, KeyboardDefinition keyboard) + { + this.keyboard = keyboard; + this.image = image; + this.position = position; + + keymapSize = keyboard.Definitions.Count; + keymapPos = new Rectangle[keymapSize]; + keymapState = new KeyState[keymapSize]; + + for(int f = 0; f < keymapSize; f++) + { + KeyboardKey k = keyboard.Definitions[f]; + + keymapPos[f] = new Rectangle((int)position.X + k.X, (int)position.Y + k.Y, k.Width, k.Height); + + keymapState[f] = new KeyState() + { + Symbol = (T)Enum.Parse(typeof(T), k.KeySymbol, false), + IsPressed = false, + IsSticky = k.Sticky + }; + } + + Color c = Color.White; + overlay = new Texture2D(graphics, 2, 2, false, SurfaceFormat.Color); + overlay.SetData(new Color[] {c, c, c, c}); + } + + #endregion + } +} -- cgit v1.2.3