Browse Source

Input update to SDK project and MG 3.8.*

CartBlanche 3 weeks ago
parent
commit
4408b3f9ac

+ 49 - 0
Input/.vscode/launch.json

@@ -0,0 +1,49 @@
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Launch Windows",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-windows",
+            "program": "${workspaceFolder}/Platforms/Windows/bin/Debug/net8.0-windows/MonoGame.Samples.Input.Windows.exe",
+            "args": [],
+            "cwd": "${workspaceFolder}/Platforms/Windows",
+            "console": "internalConsole",
+            "stopAtEntry": false
+        },
+        {
+            "name": "Launch DesktopGL",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-desktopgl",
+            "program": "${workspaceFolder}/Platforms/Desktop/bin/Debug/net8.0/MonoGame.Samples.Input.DesktopGL.exe",
+            "args": [],
+            "cwd": "${workspaceFolder}/Platforms/Desktop",
+            "console": "internalConsole",
+            "stopAtEntry": false
+        },
+        {
+            "name": "Launch Android",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-android",
+            "program": "${workspaceFolder}/Platforms/Android/bin/Debug/net8.0-android/MonoGame.Samples.Input.Android.dll",
+            "args": [],
+            "cwd": "${workspaceFolder}/Platforms/Android",
+            "console": "internalConsole",
+            "stopAtEntry": false
+        },
+        {
+            "name": "Launch iOS",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-ios",
+            "program": "${workspaceFolder}/Platforms/iOS/bin/Debug/net8.0-ios/MonoGame.Samples.Input.iOS.dll",
+            "args": [],
+            "cwd": "${workspaceFolder}/Platforms/iOS",
+            "console": "internalConsole",
+            "stopAtEntry": false
+        }
+    ]
+}

+ 135 - 0
Input/.vscode/tasks.json

@@ -0,0 +1,135 @@
+{
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "build-windows",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/Windows/Input.Windows.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "build"
+        },
+        {
+            "label": "build-desktopgl",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/Desktop/Input.DesktopGL.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "build"
+        },
+        {
+            "label": "build-android",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/Android/Input.Android.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "build"
+        },
+        {
+            "label": "build-ios",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/iOS/Input.iOS.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "build"
+        },
+        {
+            "label": "run-windows",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "run",
+                "--project",
+                "${workspaceFolder}/Platforms/Windows/Input.Windows.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "test",
+            "dependsOn": "build-windows"
+        },
+        {
+            "label": "run-desktopgl",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "run",
+                "--project",
+                "${workspaceFolder}/Platforms/Desktop/Input.DesktopGL.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "test",
+            "dependsOn": "build-desktopgl"
+        },
+        {
+            "label": "run-android",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "run",
+                "--project",
+                "${workspaceFolder}/Platforms/Android/Input.Android.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "test",
+            "dependsOn": "build-android"
+        },
+        {
+            "label": "run-ios",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "run",
+                "--project",
+                "${workspaceFolder}/Platforms/iOS/Input.iOS.csproj"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": "test",
+            "dependsOn": "build-ios"
+        },
+        {
+            "label": "clean",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "clean",
+                "${workspaceFolder}/Input.sln"
+            ],
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "restore",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "restore",
+                "${workspaceFolder}/Input.sln"
+            ],
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "build-solution",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Input.sln"
+            ],
+            "problemMatcher": "$msCompile",
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            }
+        }
+    ]
+}

+ 0 - 0
Input/Content/spriteFont1.xnb → Input/Core/Content/spriteFont1.xnb


+ 178 - 0
Input/Core/Game1.cs

@@ -0,0 +1,178 @@
+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;
+        }
+
+        /// <summary>
+        /// 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.
+        /// </summary>
+        protected override void Initialize()
+        {
+            // TODO: Add your initialization logic here
+            TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap;
+
+            base.Initialize();
+        }
+
+        /// <summary>
+        /// LoadContent will be called once per game and is the place to load
+        /// all of your content.
+        /// </summary>
+        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<SpriteFont>("spriteFont1");
+
+        }
+
+        /// <summary>
+        /// Allows the game to run logic such as updating the world,
+        /// checking for collisions, gathering input, and playing audio.
+        /// </summary>
+        /// <param name="gameTime">Provides a snapshot of timing values.</param>
+        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);
+        }
+
+        /// <summary>
+        /// This is called when the game should draw itself.
+        /// </summary>
+        /// <param name="gameTime">Provides a snapshot of timing values.</param>
+        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();
+        }
+    }
+}

+ 11 - 0
Input/Core/Input.Core.csproj

@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <AssemblyName>MonoGame.Samples.Input.Core</AssemblyName>
+    <RootNamespace>MonoGame.Samples.Input.Core</RootNamespace>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.*" />
+  </ItemGroup>
+</Project>

+ 0 - 150
Input/Game1.cs

@@ -1,150 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-#if ANDROID
-using Android.App;
-#endif
-
-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;
-using Microsoft.Xna.Framework.Media;
-using Microsoft.Xna.Framework.Storage;
-
-namespace MonoGame.Samples.Input
-{
-	public class Game1 : Microsoft.Xna.Framework.Game
-	{
-		GraphicsDeviceManager graphics;
-		SpriteBatch spriteBatch;		
-		
-		SpriteFont font;
-		Color clearColor = Color.CornflowerBlue;
-		
-		KeyboardState currentKeyboardState;
-		GamePadState currentGamePadState;
-		TouchCollection currentTouchState;
-		
-		public Game1 ()
-		{
-			graphics = new GraphicsDeviceManager (this);
-			
-			Content.RootDirectory = "Content";
-			
-			graphics.PreferMultiSampling = true;
-			graphics.IsFullScreen = true;	
-
-			graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight 
-				| DisplayOrientation.Portrait
-				;
-		}
-		
-		/// <summary>
-		/// 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.
-		/// </summary>
-		protected override void Initialize ()
-		{
-			// TODO: Add your initialization logic here
-			TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap;
-			
-			base.Initialize ();
-		}
-		
-		/// <summary>
-		/// LoadContent will be called once per game and is the place to load
-		/// all of your content.
-		/// </summary>
-		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<SpriteFont> ("spriteFont1");
-						
-		}
-
-		/// <summary>
-		/// Allows the game to run logic such as updating the world,
-		/// checking for collisions, gathering input, and playing audio.
-		/// </summary>
-		/// <param name="gameTime">Provides a snapshot of timing values.</param>
-		protected override void Update (GameTime gameTime)
-		{			
-			if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
-			{
-				Exit();
-			}
-			
-			currentKeyboardState = Keyboard.GetState ();
-			currentGamePadState = GamePad.GetState (PlayerIndex.One);
-			currentTouchState = TouchPanel.GetState();
-			while (TouchPanel.IsGestureAvailable)
-			{
-				var gesture = TouchPanel.ReadGesture();
-				switch (gesture.GestureType) {
-					case GestureType.DoubleTap:
-					        clearColor = clearColor == Color.CornflowerBlue ? Color.Red : Color.CornflowerBlue;
-							break;
-					case GestureType.Tap:
-					        clearColor = clearColor == Color.CornflowerBlue ? Color.Black : Color.CornflowerBlue;
-							break;
-				}
-			}
-			base.Update (gameTime);
-		}
-				
-		/// <summary>
-		/// This is called when the game should draw itself.
-		/// </summary>
-		/// <param name="gameTime">Provides a snapshot of timing values.</param>
-		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();
-		}
-	}
-}
-

+ 0 - 84
Input/Input.Android.csproj

@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>10.0.0</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{CB2084E4-BEC8-4318-8011-93CC2E3C9E94}</ProjectGuid>
-    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <OutputType>Library</OutputType>
-    <RootNamespace>MonoGame.Samples.Input</RootNamespace>
-    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
-    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
-    <AndroidResgenClass>Resource</AndroidResgenClass>
-    <AndroidApplication>True</AndroidApplication>
-    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
-    <AssemblyName>MonoGame.Samples.Input</AssemblyName>
-    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>True</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>False</Optimize>
-    <OutputPath>bin\Debug</OutputPath>
-    <DefineConstants>DEBUG;</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <ConsolePause>False</ConsolePause>
-    <AndroidLinkMode>None</AndroidLinkMode>
-    <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>none</DebugType>
-    <Optimize>False</Optimize>
-    <OutputPath>bin\Release</OutputPath>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
-    <ConsolePause>False</ConsolePause>
-    <AndroidLinkMode>SdkOnly</AndroidLinkMode>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Xml" />
-    <Reference Include="System.Core" />
-    <Reference Include="Mono.Android" />
-    <Reference Include="OpenTK" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Activity1.cs" />
-    <Compile Include="Resources\Resource.designer.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Game1.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <AndroidResource Include="Resources\layout\Main.axml" />
-    <AndroidResource Include="Resources\values\Strings.xml" />
-    <AndroidResource Include="Resources\drawable\Icon.png" />
-    <AndroidResource Include="Resources\drawable\Splash.png" />
-    <AndroidResource Include="Resources\values\Styles.xml" />
-  </ItemGroup>
-  <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
-  <ItemGroup>
-    <Folder Include="Assets\Content\" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Properties\AndroidManifest.xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <AndroidAsset Include="Content\spriteFont1.xnb">
-      <Link>Assets\Content\spriteFont1.xnb</Link>
-    </AndroidAsset>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ThirdParty\Lidgren.Network\Lidgren.Network.Android.csproj">
-      <Project>{565129E0-4EE5-4F6F-B403-C3484C9740BE}</Project>
-      <Name>Lidgren.Network.Android</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\MonoGame.Framework\MonoGame.Framework.Android.csproj">
-      <Project>{BA9476CF-99BA-4D03-92F2-73D2C5E58883}</Project>
-      <Name>MonoGame.Framework.Android</Name>
-    </ProjectReference>
-  </ItemGroup>
-</Project>

+ 0 - 81
Input/Input.iOS.csproj

@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>
-    <ProductVersion>10.0.0</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{5FFC1EED-2AD5-4C3C-9824-84D9991A1F30}</ProjectGuid>
-    <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <OutputType>Exe</OutputType>
-    <RootNamespace>MonoGame.Samples.Input</RootNamespace>
-    <AssemblyName>MonoGameSamplesInput</AssemblyName>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
-    <DebugSymbols>True</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>False</Optimize>
-    <OutputPath>bin\iPhoneSimulator\Debug</OutputPath>
-    <DefineConstants>DEBUG;</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <ConsolePause>False</ConsolePause>
-    <MtouchDebug>True</MtouchDebug>
-    <MtouchProfiling>True</MtouchProfiling>
-    <MtouchLink>None</MtouchLink>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
-    <DebugType>none</DebugType>
-    <Optimize>False</Optimize>
-    <OutputPath>bin\iPhoneSimulator\Release</OutputPath>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <ConsolePause>False</ConsolePause>
-    <MtouchLink>None</MtouchLink>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
-    <DebugSymbols>True</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>False</Optimize>
-    <OutputPath>bin\iPhone\Debug</OutputPath>
-    <DefineConstants>DEBUG;</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <ConsolePause>False</ConsolePause>
-    <CodesignKey>iPhone Developer</CodesignKey>
-    <MtouchDebug>True</MtouchDebug>
-    <MtouchProfiling>True</MtouchProfiling>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
-    <DebugType>none</DebugType>
-    <Optimize>False</Optimize>
-    <OutputPath>bin\iPhone\Release</OutputPath>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <ConsolePause>False</ConsolePause>
-    <CodesignKey>iPhone Developer</CodesignKey>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Xml" />
-    <Reference Include="System.Core" />
-    <Reference Include="monotouch" />
-    <Reference Include="OpenTK" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Info.iOS.plist">
-      <Link>Info.plist</Link>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Main.cs" />
-    <Compile Include="Game1.cs">
-    </Compile>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <ItemGroup>
-    <Content Include="..\Draw2D\Content\spriteFont1.xnb">
-      <Link>Content\spriteFont1.xnb</Link>
-    </Content>
-  </ItemGroup>
-</Project>

+ 48 - 0
Input/Input.sln

@@ -0,0 +1,48 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.2.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Input.Core", "Core\Input.Core.csproj", "{C9ED3D4A-75B0-44D6-3AD2-FF59E8C6E207}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Input.Windows", "Platforms\Windows\Input.Windows.csproj", "{1F197294-850A-A6D7-1F16-3AB777044386}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Input.DesktopGL", "Platforms\Desktop\Input.DesktopGL.csproj", "{CB2084E4-BEC8-4318-8011-93CC2E3C9E94}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Input.Android", "Platforms\Android\Input.Android.csproj", "{5FFC1EED-2AD5-4C3C-9824-84D9991A1F30}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Input.iOS", "Platforms\iOS\Input.iOS.csproj", "{81986908-1495-41CB-A93B-C772D01B44DB}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{C9ED3D4A-75B0-44D6-3AD2-FF59E8C6E207}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C9ED3D4A-75B0-44D6-3AD2-FF59E8C6E207}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C9ED3D4A-75B0-44D6-3AD2-FF59E8C6E207}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C9ED3D4A-75B0-44D6-3AD2-FF59E8C6E207}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1F197294-850A-A6D7-1F16-3AB777044386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1F197294-850A-A6D7-1F16-3AB777044386}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1F197294-850A-A6D7-1F16-3AB777044386}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1F197294-850A-A6D7-1F16-3AB777044386}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CB2084E4-BEC8-4318-8011-93CC2E3C9E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB2084E4-BEC8-4318-8011-93CC2E3C9E94}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CB2084E4-BEC8-4318-8011-93CC2E3C9E94}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CB2084E4-BEC8-4318-8011-93CC2E3C9E94}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5FFC1EED-2AD5-4C3C-9824-84D9991A1F30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FFC1EED-2AD5-4C3C-9824-84D9991A1F30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5FFC1EED-2AD5-4C3C-9824-84D9991A1F30}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5FFC1EED-2AD5-4C3C-9824-84D9991A1F30}.Release|Any CPU.Build.0 = Release|Any CPU
+		{81986908-1495-41CB-A93B-C772D01B44DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{81986908-1495-41CB-A93B-C772D01B44DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{81986908-1495-41CB-A93B-C772D01B44DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{81986908-1495-41CB-A93B-C772D01B44DB}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {81986908-1495-41CB-A93B-C772D01B44DB}
+	EndGlobalSection
+EndGlobal

+ 0 - 27
Input/Main.cs

@@ -1,27 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-
-namespace MonoGame.Samples.Input
-{
-	[Register ("AppDelegate")]
-	class Program : UIApplicationDelegate 
-	{
-		private Game1 game;
-
-		public override void FinishedLaunching (UIApplication app)
-		{
-			// Fun begins..
-			game = new Game1();
-			game.Run();
-		}
-
-		static void Main (string [] args)
-		{
-			UIApplication.Main (args,null,"AppDelegate");
-		}
-	}
-}

+ 2 - 3
Input/Activity1.cs → Input/Platforms/Android/Activity1.cs

@@ -22,9 +22,8 @@ namespace MonoGame.Samples.Input
 		{
 		{
 			base.OnCreate (bundle);
 			base.OnCreate (bundle);
 	        Game1.Activity = this;
 	        Game1.Activity = this;
-            var g = new Game1();
-            SetContentView(g.Window);
-            g.Run();
+            var game = new Game1();
+            game.Run();
 		}
 		}
 	}
 	}
 }
 }

+ 32 - 0
Input/Platforms/Android/AndroidManifest.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
+    android:versionCode="1" 
+    android:versionName="1.0" 
+    package="monogame.samples.input">
+    
+    <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="34" />
+    
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.SET_ORIENTATION" />
+    
+    <application 
+        android:label="MonoGame Input Sample" 
+        android:debuggable="true" 
+        android:icon="@drawable/icon"
+        android:theme="@style/Theme.Splash">
+        
+        <activity 
+            android:name="monogame.samples.input.Activity1"
+            android:label="MonoGame Input Sample"
+            android:exported="true"
+            android:icon="@drawable/icon"
+            android:theme="@style/Theme.Splash"
+            android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
+            android:screenOrientation="sensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>

+ 21 - 0
Input/Platforms/Android/Input.Android.csproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net8.0-android</TargetFramework>
+    <OutputType>Exe</OutputType>
+    <AssemblyName>MonoGame.Samples.Input.Android</AssemblyName>
+    <RootNamespace>MonoGame.Samples.Input.Android</RootNamespace>
+    <AndroidManifest>AndroidManifest.xml</AndroidManifest>
+    <SupportedOSPlatformVersion>28</SupportedOSPlatformVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Core\Input.Core.csproj" />
+    <PackageReference Include="MonoGame.Framework.Android" Version="3.8.*" />
+    <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.*" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="..\..\Core\Content\**\*.xnb" Link="Content\%(RecursiveDir)%(Filename)%(Extension)">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+</Project>

+ 31 - 0
Input/Platforms/Android/MainActivity.cs

@@ -0,0 +1,31 @@
+using System;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace MonoGame.Samples.Input.Android
+{
+	[Activity (Label = "MonoGame.Samples.Input"
+	           , MainLauncher = true
+	           ,Icon = "@drawable/icon"
+	           , Theme = "@style/Theme.Splash"
+	           ,ConfigurationChanges=ConfigChanges.Orientation|ConfigChanges.Keyboard|ConfigChanges.KeyboardHidden
+	           )]
+	public class Activity1 : AndroidGameActivity
+	{
+		protected override void OnCreate (Bundle bundle)
+		{
+			base.OnCreate (bundle);
+	        Game1.Activity = this;
+            var game = new Game1();
+            game.Run();
+		}
+	}
+}
+
+

+ 0 - 0
Input/Resources/drawable/Icon.png → Input/Platforms/Android/Resources/drawable/Icon.png


+ 0 - 0
Input/Resources/drawable/Splash.png → Input/Platforms/Android/Resources/drawable/Splash.png


+ 0 - 0
Input/Resources/layout/Main.axml → Input/Platforms/Android/Resources/layout/Main.axml


+ 0 - 0
Input/Resources/values/Strings.xml → Input/Platforms/Android/Resources/values/Strings.xml


+ 0 - 0
Input/Resources/values/Styles.xml → Input/Platforms/Android/Resources/values/Styles.xml


+ 19 - 0
Input/Platforms/Desktop/Input.DesktopGL.csproj

@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <OutputType>WinExe</OutputType>
+    <AssemblyName>MonoGame.Samples.Input.DesktopGL</AssemblyName>
+    <RootNamespace>MonoGame.Samples.Input.DesktopGL</RootNamespace>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Core\Input.Core.csproj" />
+    <PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.*" />
+    <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.*" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="..\..\Core\Content\**\*.xnb" Link="Content\%(RecursiveDir)%(Filename)%(Extension)">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+</Project>

+ 14 - 0
Input/Platforms/Desktop/Program.cs

@@ -0,0 +1,14 @@
+using System;
+
+namespace MonoGame.Samples.Input.DesktopGL
+{
+    public static class Program
+    {
+        [STAThread]
+        static void Main()
+        {
+            using (var game = new Game1())
+                game.Run();
+        }
+    }
+}

+ 20 - 0
Input/Platforms/Windows/Input.Windows.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net8.0-windows</TargetFramework>
+    <OutputType>WinExe</OutputType>
+    <UseWindowsForms>true</UseWindowsForms>
+    <AssemblyName>MonoGame.Samples.Input.Windows</AssemblyName>
+    <RootNamespace>MonoGame.Samples.Input.Windows</RootNamespace>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Core\Input.Core.csproj" />
+    <PackageReference Include="MonoGame.Framework.WindowsDX" Version="3.8.*" />
+    <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.*" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="..\..\Core\Content\**\*.xnb" Link="Content\%(RecursiveDir)%(Filename)%(Extension)">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+</Project>

+ 14 - 0
Input/Platforms/Windows/Program.cs

@@ -0,0 +1,14 @@
+using System;
+
+namespace MonoGame.Samples.Input.Windows
+{
+    public static class Program
+    {
+        [STAThread]
+        static void Main()
+        {
+            using (var game = new Game1())
+                game.Run();
+        }
+    }
+}

+ 32 - 0
Input/Platforms/iOS/Info.plist

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDisplayName</key>
+	<string>MonoGame Input Sample</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.monogame.samples.input</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>11.0</string>
+	<key>UIDeviceFamily</key>
+	<array>
+		<integer>1</integer>
+		<integer>2</integer>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIStatusBarHidden</key>
+	<true/>
+	<key>UIRequiresFullScreen</key>
+	<true/>
+</dict>
+</plist>

+ 20 - 0
Input/Platforms/iOS/Input.iOS.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net8.0-ios</TargetFramework>
+    <OutputType>Exe</OutputType>
+    <AssemblyName>MonoGame.Samples.Input.iOS</AssemblyName>
+    <RootNamespace>MonoGame.Samples.Input.iOS</RootNamespace>
+    <SupportedOSPlatformVersion>11.0</SupportedOSPlatformVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Core\Input.Core.csproj" />
+    <PackageReference Include="MonoGame.Framework.iOS" Version="3.8.*" />
+    <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.*" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="..\..\Core\Content\**\*.xnb" Link="Content\%(RecursiveDir)%(Filename)%(Extension)">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+</Project>

+ 22 - 0
Input/Platforms/iOS/Program.cs

@@ -0,0 +1,22 @@
+using Foundation;
+using UIKit;
+
+namespace MonoGame.Samples.Input.iOS
+{
+    [Register("AppDelegate")]
+    class Program : UIApplicationDelegate
+    {
+        private Game1 game;
+
+        public override void FinishedLaunching(UIApplication app)
+        {
+            game = new Game1();
+            game.Run();
+        }
+
+        static void Main(string[] args)
+        {
+            UIApplication.Main(args, null, "AppDelegate");
+        }
+    }
+}

+ 0 - 7
Input/Properties/AndroidManifest.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="monogamesamplesinput.monogamesamplesinput">
-	<application android:label="MonoGame.Samples.Input" android:debuggable="true" android:icon="@drawable/icon"></application>
-	<uses-sdk android:minSdkVersion="8" />
-	<uses-permission android:name="android.permission.INTERNET" />
-	<uses-permission android:name="android.permission.SET_ORIENTATION" />
-</manifest>

+ 0 - 28
Input/Properties/AssemblyInfo.cs

@@ -1,28 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using Android.App;
-
-// Information about this assembly is defined by the following attributes. 
-// Change them to the values specific to your project.
-
-[assembly: AssemblyTitle("MonoGame.Samples.Input")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("technomage")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
-// The form "{Major}.{Minor}.*" will automatically update the build and revision,
-// and "{Major}.{Minor}.{Build}.*" will update just the revision.
-
-[assembly: AssemblyVersion("1.0.*")]
-
-// The following attributes are used to specify the signing key for the assembly, 
-// if desired. See the Mono documentation for more information about signing.
-
-//[assembly: AssemblyDelaySign(false)]
-//[assembly: AssemblyKeyFile("")]
-

+ 113 - 0
Input/README.md

@@ -0,0 +1,113 @@
+# MonoGame Input Sample
+
+This project demonstrates input handling in MonoGame 3.8.4, including keyboard, gamepad, and touch input across multiple platforms.
+
+## Project Overview
+
+The Input sample showcases:
+- Keyboard input detection
+- GamePad controller input
+- Touch input with gesture recognition (tap and double-tap)
+- Cross-platform input handling
+- Real-time display of input coordinates and screen information
+
+## Supported Platforms
+
+- **Windows** (.NET 8.0 with Windows Forms)
+- **DesktopGL** (.NET 8.0 cross-platform)
+- **Android** (.NET 8.0 Android)
+- **iOS** (.NET 8.0 iOS)
+
+## Building the Project
+
+### Prerequisites
+
+- .NET 8.0 SDK or later
+- Visual Studio 2022 or VS Code
+- For Android: Android SDK with API level 21 or higher
+- For iOS: Xcode and iOS SDK 11.0 or higher
+
+### Using Visual Studio
+
+1. Open `Input.sln` in Visual Studio
+2. Select your target platform from the solution configuration
+3. Build and run the project
+
+### Using VS Code
+
+1. Open the project folder in VS Code
+2. Use Ctrl+Shift+P and run "Tasks: Run Task"
+3. Choose from:
+   - `build-windows` - Build Windows version
+   - `build-desktopgl` - Build DesktopGL version
+   - `build-android` - Build Android version
+   - `build-solution` - Build entire solution
+
+### Using Command Line
+
+#### Build Windows version:
+```bash
+dotnet build Input.Windows.csproj
+```
+
+#### Build DesktopGL version:
+```bash
+dotnet build Input.DesktopGL.csproj
+```
+
+#### Build Android version:
+```bash
+dotnet build Input.Android.csproj
+```
+
+#### Build entire solution:
+```bash
+dotnet build Input.sln
+```
+
+## Running the Project
+
+### Windows/DesktopGL
+```bash
+dotnet run --project Input.Windows.csproj
+# or
+dotnet run --project Input.DesktopGL.csproj
+```
+
+### Using VS Code Debug
+- Press F5 to launch with debugger
+- Choose "Launch Windows" or "Launch DesktopGL" configuration
+
+## Project Structure
+
+- `Game1.cs` - Main game class with input handling logic
+- `Program.Windows.cs` - Windows platform entry point
+- `Program.DesktopGL.cs` - DesktopGL platform entry point
+- `Program.iOS.cs` - iOS platform entry point
+- `Activity1.cs` - Android activity
+- `Content/` - Game assets (sprite fonts, textures)
+- `Properties/AndroidManifest.xml` - Android app configuration
+- `Info.iOS.plist` - iOS app configuration
+
+## Features Demonstrated
+
+1. **Touch Input**: Tap to change background color, double-tap for different color
+2. **Keyboard Input**: Real-time keyboard state detection
+3. **GamePad Input**: Controller input handling with back button exit
+4. **Screen Information**: Display of screen dimensions and orientation
+5. **Multi-touch**: Support for multiple simultaneous touch points
+
+## Technical Details
+
+- Built with MonoGame 3.8.4 framework
+- Uses SDK-style project files for modern .NET development
+- Target framework: .NET 8.0 for all platforms
+- Content pipeline: Uses pre-built .xnb files directly
+- Cross-platform input abstraction through MonoGame APIs
+
+## Notes
+
+- The project uses existing compiled content (.xnb files) instead of a content pipeline
+- Android minimum SDK version: API 21 (Android 5.0)
+- iOS minimum version: 11.0
+- All platforms support landscape and portrait orientations

+ 0 - 101
Input/Resources/Resource.designer.cs

@@ -1,101 +0,0 @@
-#pragma warning disable 1591
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.586
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-[assembly: Android.Runtime.ResourceDesignerAttribute("MonoGame.Samples.Input.Resource", IsApplication=true)]
-
-namespace MonoGame.Samples.Input
-{
-	
-	
-	[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
-	public partial class Resource
-	{
-		
-		Resource()
-		{
-			global::Android.Runtime.ResourceIdManager.UpdateIdValues ();
-		}
-		
-		public static void UpdateIdValues()
-		{
-		}
-		
-		public partial class Attribute
-		{
-			
-			private Attribute()
-			{
-			}
-		}
-		
-		public partial class Drawable
-		{
-			
-			// aapt resource value: 0x7f020000
-			public const int Icon = 2130837504;
-			
-			// aapt resource value: 0x7f020001
-			public const int Splash = 2130837505;
-			
-			private Drawable()
-			{
-			}
-		}
-		
-		public partial class Id
-		{
-			
-			// aapt resource value: 0x7f060000
-			public const int myButton = 2131099648;
-			
-			private Id()
-			{
-			}
-		}
-		
-		public partial class Layout
-		{
-			
-			// aapt resource value: 0x7f030000
-			public const int Main = 2130903040;
-			
-			private Layout()
-			{
-			}
-		}
-		
-		public partial class String
-		{
-			
-			// aapt resource value: 0x7f040001
-			public const int app_name = 2130968577;
-			
-			// aapt resource value: 0x7f040000
-			public const int hello = 2130968576;
-			
-			private String()
-			{
-			}
-		}
-		
-		public partial class Style
-		{
-			
-			// aapt resource value: 0x7f050000
-			public const int Theme_Splash = 2131034112;
-			
-			private Style()
-			{
-			}
-		}
-	}
-}
-#pragma warning restore 1591