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% до левый.

Подводя итог: создайте интерфейс, который делегирует запросы средств управления движением, и замените реализацию в зависимости от того, использует ли пользователь клавиатуру или контроллер геймпада.

Другие вопросы по тегам