Input XNA-如何判断拇指棒是否为;抽搐;朝某个方向

Input XNA-如何判断拇指棒是否为;抽搐;朝某个方向,input,xna,Input,Xna,API(3或4)中是否有任何内容可以告诉我斗杆是否朝一个方向移动,比如在菜单中,它相当于击中DPad上的一个方向?在按钮enum中似乎有一些Thumbstick*成员,但我找不到关于它们的合适文档 我只是想确保在我自己开始之前,我没有错过一些明显的东西。谢谢 您要查找的属性是什么?没有XNA方法可以告诉您此帧中是否有拇指棒被“抽动” 最简单的方法是存储旧的拇指棒状态。如果状态为零且现在为非零,则它已被抖动。 添加: 而不是检查状态是否为零,现在是否为非零。您可以使用您在问题中提到的枚举中的指

API(3或4)中是否有任何内容可以告诉我斗杆是否朝一个方向移动,比如在菜单中,它相当于击中DPad上的一个方向?在
按钮
enum中似乎有一些
Thumbstick*
成员,但我找不到关于它们的合适文档


我只是想确保在我自己开始之前,我没有错过一些明显的东西。谢谢

您要查找的属性是什么?

没有XNA方法可以告诉您此帧中是否有拇指棒被“抽动”

最简单的方法是存储旧的拇指棒状态。如果状态为零且现在为非零,则它已被抖动。

添加:

而不是检查状态是否为零,现在是否为非零。您可以使用您在问题中提到的枚举中的指杆按钮来确定该指杆是否已“抽动”。在这种情况下,您将斗杆视为DPad,必须独立测试每个方向。以下代码显示了此方法:

private void ProcessUserInput()
{
    GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);

    if (m_lastGamePadState.IsButtonUp(Buttons.LeftThumbstickUp) && gamePadState.IsButtonDown(Buttons.LeftThumbstickUp))
    {
        PrevMenuItem();
    }

    if (m_lastGamePadState.IsButtonUp(Buttons.LeftThumbstickDown) && gamePadState.IsButtonDown(Buttons.LeftThumbstickDown))
    {
        NextMenuItem();
    }

    m_lastGamePadState = gamePadState;
}

Xbox 360控制器上的拇指棒可以像按钮一样“按入”,映射到
GamePadButtons.LeftStick
GamePadButtons.RightStick
。这些显然不是你想要的

以下是我用于检测任何方向上的“按压”的代码(其中,
padLeftPushActive
存储在帧之间):

Vector2 padLeftVector=gamePadState.ThumbSticks.Left;
bool lastPadLeftPushActive=padLeftPushActive;
if(padLeftVector.Length()>0.85f)
padLeftPushActive=true;
else if(padLeftVector.Length()<0.75f)
padLeftPushActive=false;
如果(!lastPadLeftPushActive&&padLeftPushActive)
{
剂量测量(向量2.规格化(padLeftVector));
}

修改它应该相当简单,这样它就可以检测菜单所需的特定方向上的按键。

以下是我提出的解决方案,以防对任何人都有用:

    enum Stick {
        Left,
        Right,
    }
    GamePadState oldState;
    GamePadState newState;

    /// <summary>
    /// Checks if a thumbstick was quickly tapped in a certain direction. 
    /// This is useful for navigating menus and other situations where
    /// we treat a thumbstick as a D-Pad.
    /// </summary>
    /// <param name="which">Which stick to check: left or right</param>
    /// <param name="direction">A vector in the direction to check. 
    /// The length, which should be between 0.0 and 1.0, determines 
    /// the threshold.</param>
    /// <returns>True if a twitch was detected</returns>
    public bool WasStickTwitched(Stick which, Vector2 direction)
    {
        if (direction.X == 0 && direction.Y == 0)
            return false;

        Vector2 sold, snew;
        if (which == Stick.Left)
        {
            sold = oldState.ThumbSticks.Left;
            snew = newState.ThumbSticks.Left;
        }
        else
        {
            sold = oldState.ThumbSticks.Right;
            snew = newState.ThumbSticks.Right;
        }

        Vector2 twitch = snew;
        bool x = (direction.X == 0 || twitch.X / direction.X > 1);
        bool y = (direction.Y == 0 || twitch.Y / direction.Y > 1);
        bool tnew = x && y;

        twitch = sold;
        x      = (direction.X == 0 || twitch.X / direction.X > 1);
        y      = (direction.Y == 0 || twitch.Y / direction.Y > 1);
        bool told = x && y;

        return tnew && !told;
    }
枚举棒{
左边
正确的,
}
GamePadState-oldState;
配子状态新闻状态;
/// 
///检查是否在某个方向上快速敲击了指杆。
///这对于导航菜单和其他需要
///我们把一根手杖当作D-Pad。
/// 
///要检查哪一个杆:左杆还是右杆
///要检查的方向上的向量。
///长度(应介于0.0和1.0之间)决定
///门槛。
///如果检测到抽搐,则为True
公共布尔值为Stick开关(Stick which,矢量2方向)
{
if(direction.X==0&&direction.Y==0)
返回false;
Vector2已售出,新南威尔士州;
if(which==Stick.Left)
{
已售出=oldState.ThumbSticks.Left;
snew=newState.ThumbSticks.Left;
}
其他的
{
已售出=oldState.ThumbSticks.Right;
snew=newState.ThumbSticks.Right;
}
向量2抽搐=snew;
boolx=(direction.x==0 | | twitch.x/direction.x>1);
bool y=(direction.y==0 | | twitch.y/direction.y>1);
bool tnew=x&&y;
twitch=售出;
x=(direction.x==0 | | twitch.x/direction.x>1);
y=(方向y==0 | | twitch.y/方向y>1);
bool-teld=x&&y;
返回新的&&!告知;
}

不,该结构告诉我它们在哪里,但不告诉我它们做了什么。不过,如果没有任何东西弹出,我会用这个。我一定要分享它=p虽然这是一个正确的想法,但阈值必须高于零(用于菜单),并且在激活和禁用之间需要有一个余量,以防止它弹动(参见我的答案)。我不确定你是否正确。我就此提出了一个新问题。参见。由于Martin Stone对我自己的问题的回答,添加了更干净的方法来检测棍子中的“轻弹”。看起来他说的是按钮枚举,而不是GamePadButtons枚举。按钮包含LeftThumbstickUp、LeftThumbstickDown、LeftThumbstickLeft、LeftThumbstickRight等。这些按钮与GamePadState.IsButtonUp和GamePadState.IsButtonDown一起使用,允许您将拇指棒视为DPad。啊-您说得很对。我认为API是存在的,但很惊讶我找不到它。看来我找错地方了。不过,我会把我的答案留在这里,以防人们觉得有用。还有一些关于自定义输入处理程序的优点的讨论。
    enum Stick {
        Left,
        Right,
    }
    GamePadState oldState;
    GamePadState newState;

    /// <summary>
    /// Checks if a thumbstick was quickly tapped in a certain direction. 
    /// This is useful for navigating menus and other situations where
    /// we treat a thumbstick as a D-Pad.
    /// </summary>
    /// <param name="which">Which stick to check: left or right</param>
    /// <param name="direction">A vector in the direction to check. 
    /// The length, which should be between 0.0 and 1.0, determines 
    /// the threshold.</param>
    /// <returns>True if a twitch was detected</returns>
    public bool WasStickTwitched(Stick which, Vector2 direction)
    {
        if (direction.X == 0 && direction.Y == 0)
            return false;

        Vector2 sold, snew;
        if (which == Stick.Left)
        {
            sold = oldState.ThumbSticks.Left;
            snew = newState.ThumbSticks.Left;
        }
        else
        {
            sold = oldState.ThumbSticks.Right;
            snew = newState.ThumbSticks.Right;
        }

        Vector2 twitch = snew;
        bool x = (direction.X == 0 || twitch.X / direction.X > 1);
        bool y = (direction.Y == 0 || twitch.Y / direction.Y > 1);
        bool tnew = x && y;

        twitch = sold;
        x      = (direction.X == 0 || twitch.X / direction.X > 1);
        y      = (direction.Y == 0 || twitch.Y / direction.Y > 1);
        bool told = x && y;

        return tnew && !told;
    }