From 2ca391d610f442f6d2ac680275a07e9b80288676 Mon Sep 17 00:00:00 2001 From: polten0 Date: Mon, 14 Aug 2023 13:21:33 +0300 Subject: [PATCH 1/3] CreateGamePadInputManager --- DangerousD/GameCore/InputManager.cs | 72 +++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 DangerousD/GameCore/InputManager.cs diff --git a/DangerousD/GameCore/InputManager.cs b/DangerousD/GameCore/InputManager.cs new file mode 100644 index 0000000..d01d969 --- /dev/null +++ b/DangerousD/GameCore/InputManager.cs @@ -0,0 +1,72 @@ +using Microsoft.Xna.Framework.Input; +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Xml.Serialization; +using System.Runtime.InteropServices.WindowsRuntime; + +namespace DangerousD.GameCore +{ + public enum ScopeState { Up, Middle, Down } + class InputManager + { + public delegate void Delegat(); + public event Delegat MovEventJump; + public event Delegat MovEventDown; + + Vector2 vectorMovementDirection; + ScopeState scopeState; // Положение оружия. Up, Middle, Down. + + private bool isJumpDown; // Блокирует физическое нажатие прыжка и спуска + + public Vector2 VectorMovementDirection { get => vectorMovementDirection; } + public ScopeState ScopeState { get => scopeState; } + + public InputManager() + { + this.isJumpDown = false; + scopeState = ScopeState.Middle; + } + + public void Update() + { + // Обработка гейм-пада. Задает Vector2 vectorMovementDirection являющийся вектором отклонения левого стика. + GamePadState gamePadState = GamePad.GetState(0); + vectorMovementDirection = gamePadState.ThumbSticks.Left; + + // Обработка нажатия прыжка и спуска. Вызывает события MovEvent. + if (vectorMovementDirection.Y < -0.2 && gamePadState.Buttons.A == ButtonState.Pressed && !isJumpDown) + { + isJumpDown = true; + MovEventDown?.Invoke(); + Debug.WriteLine("Спуск"); + } + else if (gamePadState.Buttons.A == ButtonState.Pressed && !isJumpDown) + { + isJumpDown = true; + MovEventJump?.Invoke(); + Debug.WriteLine("Прыжок"); + } + else if (gamePadState.Buttons.A == ButtonState.Released) + { + isJumpDown = false; + } + + // Обработка положения оружия. Задает значение полю scopeState. + if (vectorMovementDirection.Y >= 0.7) + { + scopeState = ScopeState.Up; + } + else if (vectorMovementDirection.Y <= -0.7) + { + scopeState = ScopeState.Down; + } + else + { + scopeState = ScopeState.Middle; + } + } + } +} From e26e75308d1400089583d009e6725b3e128256b0 Mon Sep 17 00:00:00 2001 From: polten0 Date: Mon, 14 Aug 2023 14:52:58 +0300 Subject: [PATCH 2/3] FinishedInputManager --- DangerousD/GameCore/AppManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DangerousD/GameCore/AppManager.cs b/DangerousD/GameCore/AppManager.cs index 53dfd39..e28b429 100644 --- a/DangerousD/GameCore/AppManager.cs +++ b/DangerousD/GameCore/AppManager.cs @@ -14,6 +14,7 @@ namespace DangerousD.GameCore { private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; + InputManager _inputManager = new InputManager(); GameState gameState; IHUD MenuGUI; @@ -47,7 +48,7 @@ namespace DangerousD.GameCore { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); - + _inputManager.Update(); switch (gameState) { From 069e88a08ca85865b1a3248e89b2f9df15bea1e3 Mon Sep 17 00:00:00 2001 From: polten0 Date: Mon, 14 Aug 2023 14:58:57 +0300 Subject: [PATCH 3/3] FinishedInputManager2 --- DangerousD/GameCore/AppManager.cs | 2 - DangerousD/GameCore/InputManager.cs | 142 ++++++++++++++++++++++------ 2 files changed, 113 insertions(+), 31 deletions(-) diff --git a/DangerousD/GameCore/AppManager.cs b/DangerousD/GameCore/AppManager.cs index e28b429..96d943d 100644 --- a/DangerousD/GameCore/AppManager.cs +++ b/DangerousD/GameCore/AppManager.cs @@ -14,7 +14,6 @@ namespace DangerousD.GameCore { private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; - InputManager _inputManager = new InputManager(); GameState gameState; IHUD MenuGUI; @@ -48,7 +47,6 @@ namespace DangerousD.GameCore { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); - _inputManager.Update(); switch (gameState) { diff --git a/DangerousD/GameCore/InputManager.cs b/DangerousD/GameCore/InputManager.cs index d01d969..a3efc29 100644 --- a/DangerousD/GameCore/InputManager.cs +++ b/DangerousD/GameCore/InputManager.cs @@ -15,11 +15,13 @@ namespace DangerousD.GameCore public delegate void Delegat(); public event Delegat MovEventJump; public event Delegat MovEventDown; + public event Delegat ShootEvent; Vector2 vectorMovementDirection; ScopeState scopeState; // Положение оружия. Up, Middle, Down. private bool isJumpDown; // Блокирует физическое нажатие прыжка и спуска + private bool isShoot; public Vector2 VectorMovementDirection { get => vectorMovementDirection; } public ScopeState ScopeState { get => scopeState; } @@ -27,45 +29,127 @@ namespace DangerousD.GameCore public InputManager() { this.isJumpDown = false; + this.isShoot = false; scopeState = ScopeState.Middle; + vectorMovementDirection = new Vector2(0, 0); } public void Update() { - // Обработка гейм-пада. Задает Vector2 vectorMovementDirection являющийся вектором отклонения левого стика. - GamePadState gamePadState = GamePad.GetState(0); - vectorMovementDirection = gamePadState.ThumbSticks.Left; + // Работа с GamePad + if (GamePad.GetState(0).IsConnected) + { + // Обработка гейм-пада. Задает Vector2 vectorMovementDirection являющийся вектором отклонения левого стика. + GamePadState gamePadState = GamePad.GetState(0); + vectorMovementDirection = gamePadState.ThumbSticks.Left; - // Обработка нажатия прыжка и спуска. Вызывает события MovEvent. - if (vectorMovementDirection.Y < -0.2 && gamePadState.Buttons.A == ButtonState.Pressed && !isJumpDown) - { - isJumpDown = true; - MovEventDown?.Invoke(); - Debug.WriteLine("Спуск"); - } - else if (gamePadState.Buttons.A == ButtonState.Pressed && !isJumpDown) - { - isJumpDown = true; - MovEventJump?.Invoke(); - Debug.WriteLine("Прыжок"); - } - else if (gamePadState.Buttons.A == ButtonState.Released) - { - isJumpDown = false; + // Обработка нажатия прыжка и спуска. Вызывает события MovEvent. + if (vectorMovementDirection.Y < -0.2 && gamePadState.Buttons.A == ButtonState.Pressed && !isJumpDown) + { + isJumpDown = true; + MovEventDown?.Invoke(); + Debug.WriteLine("Спуск"); + } + else if (gamePadState.Buttons.A == ButtonState.Pressed && !isJumpDown) + { + isJumpDown = true; + MovEventJump?.Invoke(); + Debug.WriteLine("Прыжок"); + } + else if (gamePadState.Buttons.A == ButtonState.Released) + { + isJumpDown = false; + } + + // Обработка положения оружия. Задает значение полю scopeState. + if (vectorMovementDirection.Y >= 0.7) + { + scopeState = ScopeState.Up; + } + else if (vectorMovementDirection.Y <= -0.7 && !isJumpDown) + { + scopeState = ScopeState.Down; + } + else + { + scopeState = ScopeState.Middle; + } + + // Обработка нажатия выстрела. Вызывает событие ShootEvent + if (gamePadState.Buttons.X == ButtonState.Pressed && !isJumpDown && !isShoot) + { + isShoot = true; + ShootEvent?.Invoke(); + Debug.WriteLine("Выстрел"); + } + else if (gamePadState.Buttons.X == ButtonState.Released && !isJumpDown) + { + isShoot = false; + } } - // Обработка положения оружия. Задает значение полю scopeState. - if (vectorMovementDirection.Y >= 0.7) - { - scopeState = ScopeState.Up; - } - else if (vectorMovementDirection.Y <= -0.7) - { - scopeState = ScopeState.Down; - } + // Работа с KeyBoard else { - scopeState = ScopeState.Middle; + KeyboardState keyBoardState = Keyboard.GetState(); // Состояние клавиатуры + + // Обработка движения вправо-влево. Меняет у вектора vectorMovementDirection значение X на -1/0/1. + if (keyBoardState.IsKeyDown(Keys.Left)) + { + vectorMovementDirection.X = -1; + } + else if (keyBoardState.IsKeyDown(Keys.Right)) + { + vectorMovementDirection.X = 1; + } + else + { + vectorMovementDirection.X = 0; + } + + // Обработка прыжка и спуска. Вызываются события MovEvent. + if (keyBoardState.IsKeyDown(Keys.LeftShift) && !isJumpDown && keyBoardState.IsKeyDown(Keys.Down)) + { + isJumpDown = true; + MovEventDown?.Invoke(); + Debug.WriteLine("Спуск"); + } + else if (keyBoardState.IsKeyDown(Keys.LeftShift) && !isJumpDown) + { + isJumpDown = true; + MovEventJump?.Invoke(); + Debug.WriteLine("Прыжок"); + } + else if (keyBoardState.IsKeyUp(Keys.LeftShift)) + { + isJumpDown = false; + } + + // Обработка положения оружия. Задает значение полю scopeState. + if (keyBoardState.IsKeyDown(Keys.Up)) + { + scopeState = ScopeState.Up; + } + else if (keyBoardState.IsKeyDown(Keys.Down) && !isJumpDown) + { + scopeState = ScopeState.Down; + } + else + { + scopeState = ScopeState.Middle; + } + + // Обработка нажатия выстрела. Вызывает событие ShootEvent + if (keyBoardState.IsKeyDown(Keys.X) && !isJumpDown && !isShoot) + { + isShoot = true; + ShootEvent?.Invoke(); + Debug.WriteLine("Выстрел"); + } + else if (keyBoardState.IsKeyUp(Keys.X) && !isJumpDown) + { + isShoot = false; + } } } }