using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input.Touch; namespace MonoGame.Samples.Input { public class Game1 : Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; SpriteFont font; Color clearColor = Color.CornflowerBlue; KeyboardState currentKeyboardState; GamePadState currentGamePadState; TouchCollection currentTouchState; MouseState currentMouseState; MouseState previousMouseState; TimeSpan lastClickTime; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; graphics.PreferMultiSampling = true; // Only use fullscreen on mobile platforms #if MOBILE graphics.IsFullScreen = true; #endif graphics.PreferredBackBufferHeight = 640; graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight | DisplayOrientation.Portrait; IsMouseVisible = true; } /// /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// protected override void Initialize() { // TODO: Add your initialization logic here TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap; base.Initialize(); } /// /// LoadContent will be called once per game and is the place to load /// all of your content. /// protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); // TODO: use this.Content to load your game content here font = Content.Load("spriteFont1"); } /// /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// /// Provides a snapshot of timing values. protected override void Update(GameTime gameTime) { currentGamePadState = GamePad.GetState(PlayerIndex.One); currentKeyboardState = Keyboard.GetState(); currentMouseState = Mouse.GetState(); currentTouchState = TouchPanel.GetState(); // Handle ESC key to exit (for desktop platforms) if (currentKeyboardState.IsKeyDown(Keys.Escape) || // Handle gamepad back button (for mobile/console platforms) currentGamePadState.Buttons.Back == ButtonState.Pressed) { Exit(); } // Replicate TouchPanel tap/double-tap with mouse for non-touch platforms // Detect left mouse button click (tap) if (currentMouseState.LeftButton == ButtonState.Pressed && previousMouseState.LeftButton == ButtonState.Released) { clearColor = clearColor == Color.MonoGameOrange ? Color.Black : Color.MonoGameOrange; } // Detect double-click (double-tap) if (currentMouseState.LeftButton == ButtonState.Pressed && previousMouseState.LeftButton == ButtonState.Released) { // Simple double-click detection: check if click happened within 300ms if ((gameTime.TotalGameTime - lastClickTime).TotalMilliseconds < 300) { clearColor = clearColor == Color.MonoGameOrange ? Color.Red : Color.MonoGameOrange; } lastClickTime = gameTime.TotalGameTime; } while (TouchPanel.IsGestureAvailable) { var gesture = TouchPanel.ReadGesture(); switch (gesture.GestureType) { case GestureType.DoubleTap: clearColor = clearColor == Color.MonoGameOrange ? Color.Red : Color.MonoGameOrange; break; case GestureType.Tap: clearColor = clearColor == Color.MonoGameOrange ? Color.Black : Color.MonoGameOrange; break; } } previousMouseState = currentMouseState; base.Update(gameTime); } /// /// This is called when the game should draw itself. /// /// Provides a snapshot of timing values. protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(clearColor); // Won't be visible until we hide the movie spriteBatch.Begin(); Vector2 center = new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2); Vector2 s1 = font.MeasureString("Touch the Screen"); center.X -= (s1.X / 2); spriteBatch.DrawString(font, "Touch the Screen", center, Color.Red); center.Y += 20; spriteBatch.DrawString(font, GraphicsDevice.Viewport.Width.ToString() + " x " + GraphicsDevice.Viewport.Height.ToString(), center, Color.Red); center.Y += 20; spriteBatch.DrawString(font, GraphicsDevice.PresentationParameters.DisplayOrientation.ToString(), center, Color.Red); spriteBatch.DrawString(font, "0,0", new Vector2(0, 0), Color.Red); string s = GraphicsDevice.Viewport.Width.ToString() + ",0"; Vector2 v = font.MeasureString(s); spriteBatch.DrawString(font, s, new Vector2(GraphicsDevice.Viewport.Width - v.X, 0), Color.Red); s = "0," + GraphicsDevice.Viewport.Height.ToString(); v = font.MeasureString(s); spriteBatch.DrawString(font, s, new Vector2(0, GraphicsDevice.Viewport.Height - v.Y), Color.Red); string wandh = GraphicsDevice.Viewport.Width.ToString() + ", " + GraphicsDevice.Viewport.Height.ToString(); Vector2 wh = font.MeasureString(wandh); spriteBatch.DrawString(font, wandh, new Vector2(GraphicsDevice.Viewport.Width - wh.X, GraphicsDevice.Viewport.Height - wh.Y), Color.Red); if (currentTouchState.Count > 0) { for (int i = 0; i < currentTouchState.Count; i++) { center.Y += s1.Y; Vector2 p = currentTouchState[i].Position; spriteBatch.DrawString(font, "+", p, Color.Red); spriteBatch.DrawString(font, p.ToString(), center, Color.Red); } } spriteBatch.End(); } } }