From a5dbfb721a9548ca433a65228d620bd11f147d6c Mon Sep 17 00:00:00 2001 From: "SND\\simsmaster_cp" Date: Tue, 20 Dec 2011 20:16:50 +0000 Subject: [PATCH] Modified the RecordingSystem to work with the new InputSystem. Fixes #532 --- .../ANX.InputSystem.Recording/Creator.cs | 22 ++++++++-- .../RecordingMouse.cs | 28 ++++++++++-- RecordingSample/RecordingSample/Game1.cs | 43 +++++++++---------- RecordingSample/RecordingSample/Program.cs | 7 +-- .../RecordingSample/RecordingSample.csproj | 4 ++ 5 files changed, 70 insertions(+), 34 deletions(-) diff --git a/InputSystems/ANX.InputSystem.Recording/Creator.cs b/InputSystems/ANX.InputSystem.Recording/Creator.cs index 58d76577..f291371b 100644 --- a/InputSystems/ANX.InputSystem.Recording/Creator.cs +++ b/InputSystems/ANX.InputSystem.Recording/Creator.cs @@ -58,12 +58,20 @@ namespace ANX.InputSystem.Recording { public class Creator : IInputSystemCreator { + //It not a good idea to have more than one RecordingDevice per Input Device, so we cache the request. + RecordingMouse mouse; + RecordingKeyboard keyboard; + RecordingGamePad gamePad; + RecordingMotionSensingDevice msd; + public IGamePad GamePad { get { AddInSystemFactory.Instance.PreventInputSystemChange(); - return new RecordingGamePad(); + if (gamePad == null) + gamePad = new RecordingGamePad(); + return gamePad; } } @@ -72,7 +80,9 @@ namespace ANX.InputSystem.Recording get { AddInSystemFactory.Instance.PreventInputSystemChange(); - return new RecordingMouse(); + if (mouse == null) + mouse = new RecordingMouse(); + return mouse; } } @@ -81,7 +91,9 @@ namespace ANX.InputSystem.Recording get { AddInSystemFactory.Instance.PreventInputSystemChange(); - return new RecordingKeyboard(); + if (keyboard == null) + keyboard = new RecordingKeyboard(); + return keyboard; } } @@ -91,7 +103,9 @@ namespace ANX.InputSystem.Recording get { AddInSystemFactory.Instance.PreventInputSystemChange(); - return new RecordingMotionSensingDevice(); + if (msd == null) + msd = new RecordingMotionSensingDevice(); + return msd; } } #endif diff --git a/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs b/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs index b27ddfdf..7c87722e 100644 --- a/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs +++ b/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs @@ -99,14 +99,31 @@ namespace ANX.InputSystem.Recording protected IMouse realMouse; protected MouseRecordInfo recordInfo; + private IntPtr tmpWindowHandle = IntPtr.Zero; + public IntPtr WindowHandle { - get { return realMouse.WindowHandle; } - set { realMouse.WindowHandle = value; } + get + { + if (!isInitialized) + return IntPtr.Zero; + else + return realMouse.WindowHandle; + } + set + { + if (!isInitialized) //The GameWindow might assign a WindowHadle even before the real Mouse is loaded. We save this Handle and assign it in Initialize() + tmpWindowHandle = value; + else + realMouse.WindowHandle = value; + } } public MouseState GetState() //The main recording/playback logic is placed here { + if (!isInitialized) + throw new InvalidOperationException("This instance is not initialized! Refer to documenation for details."); + switch (RecordingState) { case RecordingState.None: @@ -216,7 +233,7 @@ namespace ANX.InputSystem.Recording /// public void Initialize(MouseRecordInfo info) { - this.Initialize(info, new MemoryStream(), AddInSystemFactory.Instance.GetDefaultCreator().Mouse); + this.Initialize(info, new MemoryStream(), InputDeviceFactory.Instance.GetDefaultMouse()); } /// @@ -234,7 +251,7 @@ namespace ANX.InputSystem.Recording /// public void Initialize(MouseRecordInfo info, Stream bufferStream) { - this.Initialize(info, bufferStream, AddInSystemFactory.Instance.GetDefaultCreator().Mouse); + this.Initialize(info, bufferStream, InputDeviceFactory.Instance.GetDefaultMouse()); } /// @@ -245,6 +262,9 @@ namespace ANX.InputSystem.Recording { realMouse = mouse; + if (tmpWindowHandle != IntPtr.Zero) + WindowHandle = tmpWindowHandle; + recordInfo = info; PacketLenght = GetPaketSize(info); diff --git a/RecordingSample/RecordingSample/Game1.cs b/RecordingSample/RecordingSample/Game1.cs index 57ff4953..0c411b5e 100644 --- a/RecordingSample/RecordingSample/Game1.cs +++ b/RecordingSample/RecordingSample/Game1.cs @@ -68,7 +68,6 @@ namespace RecordingSample SpriteBatch spriteBatch; Texture2D logo; - RecordingMouse mouse; KeyboardState oldState; public Game1() @@ -81,10 +80,8 @@ namespace RecordingSample { Window.Title = "Use Mouse to move arround, press r to record, p for playback and n for none"; - mouse = (RecordingMouse)AddInSystemFactory.Instance.GetCreator("Recording").Mouse; - mouse.Initialize(MouseRecordInfo.Position); - mouse.WindowHandle = Window.Handle; - mouse.EndOfPlaybackReached += new EventHandler((sender, args) => mouse.StopPlayback()); + //We know the Mouse is a RecordingMouse - this is quite ugly... could this be improved? + ((RecordingMouse)AddInSystemFactory.Instance.GetDefaultCreator().Mouse).Initialize(MouseRecordInfo.Position); base.Initialize(); } @@ -94,32 +91,32 @@ namespace RecordingSample spriteBatch = new SpriteBatch(GraphicsDevice); logo = Content.Load(@"Textures/ANX.Framework.Logo_459x121"); - oldState = Keyboard.GetState(); + //oldState = Keyboard.GetState(); } protected override void Update(GameTime gameTime) { - KeyboardState newState = Keyboard.GetState(); + //KeyboardState newState = Keyboard.GetState(); - if (oldState.IsKeyUp(Keys.R) && newState.IsKeyDown(Keys.R)) - mouse.StartRecording(); + //if (oldState.IsKeyUp(Keys.R) && newState.IsKeyDown(Keys.R)) + // mouse.StartRecording(); - if (oldState.IsKeyUp(Keys.P) && newState.IsKeyDown(Keys.P)) - { - if (mouse.RecordingState == RecordingState.Recording) - mouse.StopRecording(); - mouse.StartPlayback(); - } + //if (oldState.IsKeyUp(Keys.P) && newState.IsKeyDown(Keys.P)) + //{ + // if (mouse.RecordingState == RecordingState.Recording) + // mouse.StopRecording(); + // mouse.StartPlayback(); + //} - if (oldState.IsKeyUp(Keys.N) && newState.IsKeyDown(Keys.N)) - { - if (mouse.RecordingState == RecordingState.Recording) - mouse.StartRecording(); + //if (oldState.IsKeyUp(Keys.N) && newState.IsKeyDown(Keys.N)) + //{ + // if (mouse.RecordingState == RecordingState.Recording) + // mouse.StartRecording(); - mouse.StopPlayback(); - } + // mouse.StopPlayback(); + //} - oldState = newState; + //oldState = newState; base.Update(gameTime); } @@ -129,7 +126,7 @@ namespace RecordingSample GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); - spriteBatch.Draw(logo, new Rectangle(mouse.GetState().X, mouse.GetState().Y, 115, 30), Color.White); + spriteBatch.Draw(logo, new Rectangle(Mouse.GetState().X, Mouse.GetState().Y, 115, 30), Color.White); spriteBatch.End(); base.Draw(gameTime); diff --git a/RecordingSample/RecordingSample/Program.cs b/RecordingSample/RecordingSample/Program.cs index 4b886da9..1532c0a9 100644 --- a/RecordingSample/RecordingSample/Program.cs +++ b/RecordingSample/RecordingSample/Program.cs @@ -1,15 +1,16 @@ using System; +using ANX.Framework.NonXNA; namespace RecordingSample { #if WINDOWS || XBOX static class Program { - /// - /// Der Haupteinstiegspunkt für die Anwendung. - /// static void Main(string[] args) { + //This is technically unessasary, because there is only a reference to the RecordingSystem... + AddInSystemFactory.Instance.PreferredInputSystem = "Recording"; + using (Game1 game = new Game1()) { game.Run(); diff --git a/RecordingSample/RecordingSample/RecordingSample.csproj b/RecordingSample/RecordingSample/RecordingSample.csproj index 45aac4ac..8b8a8fdc 100644 --- a/RecordingSample/RecordingSample/RecordingSample.csproj +++ b/RecordingSample/RecordingSample/RecordingSample.csproj @@ -83,6 +83,10 @@ {6899F0C9-70B9-4EB0-9DD3-E598D4BE3E35} ANX.Framework + + {60D08399-244F-46A3-91F1-4CFD26D961A3} + ANX.InputDevices.Windows.XInput + {DB88DDEB-7281-405D-8FCA-5681B6B2BD7A} ANX.InputSystem.Recording