Monogame, C# - Использование нескольких типов ввода для многопользовательской игры
Я делаю местную многопользовательскую игру. Мне нужно иметь возможность использовать как ввод с клавиатуры (скорее всего, только для первого игрока), так и другие контроллеры джойстика для остальных игроков. Я не могу использовать PlayerIndex, как это делают большинство других игр, так как он сделан для контроллеров и не включает ввод с клавиатуры. Каков будет лучший способ пойти по этому поводу?
1 ответ
Не совсем ясно, хотите ли вы поддерживать OPTION для выбора типа ввода, или вы действительно хотите использовать несколько типов ввода одновременно. Тем не менее, поскольку вы упоминаете Multiplayer, я полагаю, вы просто ищете решение, позволяющее игроку выбирать между клавиатурой и контроллером.
Это действительно довольно просто:
interface IGameInput
{
float GetXMovement();
float GetYMovement();
}
class KeyboardInput : IGameInput
{
public float GetXMovement()
{
var state = Keyboard.GetState();
var leftDown = state.IsKeyDown(Keys.A);
var rightDown = state.IsKeyDown(Keys.D);
float finalValue = 0;
if (leftDown)
finalValue -= 1;
if (rightDown )
finalValue += 1;
return finalValue;
}
public float GetYMovement()
{
// Same as X, just check for W and S instead.
}
}
class ControllerInput : IGameInput
{
public float GetXMovement()
{
var state = Gamepad.GetState(0); // or whatever the syntax is, I forgot.
var xMovement = state.LeftThumb.X;
return xMovement;
}
public float GetYMovement()
{
var state = Gamepad.GetState(0); // same as above
var yMovement = state.LeftThumb.Y;
return yMovement;
}
}
// other class
var x = this.input.GetXMovement() * this.MovementSpeed;
var y = this.input.GetYMovement() * this.MovementSpeed;
this.Position = this.Position + new Vector2(x, y);
Очень базовая концепция. Обратите внимание, что это означает, что на клавиатуре вы всегда будете перемещать 100% или 0% скорости движения, в то время как при использовании контроллера, если вы перемещаете большой палец только на 50% влево, он будет двигаться только со скоростью 50% до левый.
Подводя итог: создайте интерфейс, который делегирует запросы средств управления движением, и замените реализацию в зависимости от того, использует ли пользователь клавиатуру или контроллер геймпада.