单游戏,C#-在多人游戏中使用多种输入类型

单游戏,C#-在多人游戏中使用多种输入类型,c#,input,monogame,joystick,C#,Input,Monogame,Joystick,我正在制作一个本地多人游戏。我需要能够使用键盘输入(最有可能只对玩家一)和其他游戏杆控制器为其余的玩家。我不能像大多数其他游戏那样使用PlayerIndex,因为它是为控制器设计的,不包括键盘输入。最好的方法是什么?不完全清楚您是想支持选择输入类型的选项,还是想同时使用多个输入类型。然而,既然你提到了多人游戏,我猜你只是在寻找一个解决方案,让玩家在键盘和控制器输入之间进行选择 这其实很简单: interface IGameInput { float GetXMovement();

我正在制作一个本地多人游戏。我需要能够使用键盘输入(最有可能只对玩家一)和其他游戏杆控制器为其余的玩家。我不能像大多数其他游戏那样使用PlayerIndex,因为它是为控制器设计的,不包括键盘输入。最好的方法是什么?

不完全清楚您是想支持选择输入类型的选项,还是想同时使用多个输入类型。然而,既然你提到了多人游戏,我猜你只是在寻找一个解决方案,让玩家在键盘和控制器输入之间进行选择

这其实很简单:

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%的速度向左移动


总而言之:创建一个界面,委托移动控件的请求,并根据用户是使用键盘还是Gamepad控制器来替换实现。

不完全清楚您是否要支持选择输入类型的选项,或者,如果您确实希望同时使用多个输入类型。然而,既然你提到了多人游戏,我猜你只是在寻找一个解决方案,让玩家在键盘和控制器输入之间进行选择

这其实很简单:

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%的速度向左移动

总而言之:创建一个界面,委托移动控件的请求,并根据用户是使用键盘还是Gamepad控制器替换实现