在XNA中将Thumbstick Input添加到队列中

本文关键字:队列 添加 Input XNA 中将 Thumbstick | 更新日期: 2023-09-27 17:53:45

我正试图使用XNA的GamePadStates将用户最近的控制器输入存储在队列中。我试图做到这一点的方法是在当前帧中获取GamePadState,将其与前一帧中的状态进行比较,将所有按钮按下和拇指棒输入转换为字符,并将其全部添加到队列中。稍后,我检查队列中最近的输入,并相应地更新游戏状态。当队列太满时,会删除最早的输入。

然而,我遇到了一个拇指摇杆输入的问题。我试图以类似于按下按钮的方式处理每个定向输入,将其转换为字符并添加到队列中。就是一个例子

if(newGamePadState.ThumbSticks.Left.X > thumbStickDeadZone && 
oldGamePadState.ThumbSticks.Left.X < thumbStickDeadZone &&
newGamePadState.ThumbSticks.Left.Y > -1.0f * thumbStickDeadZone &&
newGamePadState.ThumbSticks.Left.Y < thumbStickDeadZone)
{
     inputQueue.Add('9'); // 9 in this case is the character representation of "Right"
}

正如你所看到的,这种逻辑非常混乱,而且很快就会失控,尤其是在引入顺序方向检查时。

如果按住拇指操纵杆上的方向,有没有更好的方法可以正确地写下这类内容,而不会导致输入重复?我最接近的解决方案是检查添加到队列中的最后一组输入是否有重复,并将其删除,如果用户在拇指棒上按两次相同的方向作为两个单独的输入,就会出现问题。

*注:作为程序的要求,最近的输入必须存储,因为程序最终将能够检查是否输入了某些命令序列。

在XNA中将Thumbstick Input添加到队列中

我假设拇指操纵杆可以有两种状态"中性"answers"方向"。

所以,你的逻辑应该是这样的(警告,很多伪代码(:

bool thumbstickActive = false;
void CheckInput()
{
    //Pseudo-code, fix to match how you are getting the position
    Vector2 currentPostiion = thumbstick1.Position;
    if (ThumbstickInDeadZone(currentPosition))
    {
        thumbStickActive = false;
    }
    else if (!thumbStickActive)
    {
        ActionQueue.Enqueue(GetDirection(currentPosition));
        thumbStickActive = true;
    }
}

基本上,当棒返回到"neutral"时设置一个标志,并且只有当我们从neutral进入时才向队列添加一个操作。如果你只想说"不是最后一个方向",请将其更改为:

Direction lastDirection = Direction.None; //Pseudo-enum
void CheckInput()
{
    //Pseudo-code, fix to match how you are getting the position
    Vector2 currentPostiion = thumbstick1.Position;
    Direction currentDirection = GetDirection(currentPosition);
    //If GetDirection returns Direction.None for neutral,
    //The old check doesn't matter.
    if (currentDirection != lastDirection)
    {
        ActionQueue.Enqueue(currentDirection);
        lastDirection = currentDirection;
    }
}

还是同样的想法,设置存储"最后"状态的变量,并检查该状态是否已经改变到需要排队执行操作的程度。

它有两个辅助函数,您应该已经有了。如果拇指操纵杆处于空档位置,则第一个(ThumbstickInDeadZone(返回true,否则返回false。第二个(GetDirection(返回由拇指操纵杆的当前位置表示的方向。