C# 在XNA中将拇指棒输入添加到队列
我试图使用XNA的GamePadState将用户最近的控制器输入存储在队列中。我尝试这样做的方式是获取当前帧中的GamePadState,将其与前一帧中的状态进行比较,将所有按钮按下和拇指杆输入转换为字符,并将其全部添加到队列中。稍后,我检查队列中最近的输入是什么,并相应地更新游戏状态。当队列太满时,最早的输入将被删除 然而,我遇到了一个拇指棒输入的问题。我试图以类似于按钮按下的方式处理每个方向输入,将其转换为一个字符,并将其添加到队列中。这方面的一个例子是C# 在XNA中将拇指棒输入添加到队列,c#,input,xna,C#,Input,Xna,我试图使用XNA的GamePadState将用户最近的控制器输入存储在队列中。我尝试这样做的方式是获取当前帧中的GamePadState,将其与前一帧中的状态进行比较,将所有按钮按下和拇指杆输入转换为字符,并将其全部添加到队列中。稍后,我检查队列中最近的输入是什么,并相应地更新游戏状态。当队列太满时,最早的输入将被删除 然而,我遇到了一个拇指棒输入的问题。我试图以类似于按钮按下的方式处理每个方向输入,将其转换为一个字符,并将其添加到队列中。这方面的一个例子是 if(newGamePadState
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"
}
if(newGamePadState.ThumbSticks.Left.X>thumbStickDeadZone&&
oldGamePadState.ThumbSticks.Left.X-1.0f*ThumbstickDadZone&&
newGamePadState.ThumbSticks.Left.Y
正如您所看到的,这种逻辑非常混乱,并且很快就会失控,特别是在引入顺序方向检查时
有没有更好的方法来正确地写这类东西,而不导致输入重复,如果保持拇指上的方向?我得到的最接近解决方案是检查添加到队列中的最后一组输入是否存在任何重复项并将其删除,如果用户在拇指上按两次相同的方向作为两个单独的输入,则会导致问题
*注:
作为程序的一项要求,必须存储最新的输入,因为程序最终将能够检查是否输入了某些命令序列。我假设您的拇指可以有两种状态“空档”和“方向” 因此,您的逻辑应该如下所示(警告,大量伪代码): 基本上,当棍子返回到“空档”时设置一个标志,并且仅当我们来自空档时才向队列添加一个动作。如果您只想说“不是最后一个方向”,请将其更改为:
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;
}
}
还是同样的想法,设置存储“last”状态的变量,并检查该状态是否发生了足够的变化,您希望将操作排队
它有两个您应该已经拥有的助手函数。如果拇指杆处于空档位置,则第一个(
ThumbstickInDeadZone
)返回true
,否则返回false
。第二个(GetDirection
)返回由指杆当前位置表示的方向 谢谢。第二个代码示例和解释正是我想要的,它确实帮助我从代码中删除了一些不需要的行。我感谢你的帮助。@brettbstock很乐意帮忙
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;
}
}