XNA - как определить, что палка для большого пальца «дернулась» в определенном направлении - PullRequest
0 голосов
/ 22 февраля 2011

Есть ли что-нибудь в API (3 или 4), чтобы сказать мне, если ручка двигалась в одном направлении, как в меню, где это эквивалентно нажатию направления на DPad?Кажется, что в перечислении Buttons есть Thumbstick* члены, но я не могу найти приличную документацию по ним.

Просто хочу убедиться, что я не пропустил что-то очевидное, прежде чем я пойду и сверну свое.Спасибо!

Ответы [ 4 ]

1 голос
/ 22 февраля 2011

Не существует метода 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;
}
1 голос
/ 22 февраля 2011

Кнопки управления на контроллере 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;

if(!lastPadLeftPushActive && padLeftPushActive)
{
    DoSomething(Vector2.Normalize(padLeftVector));
}

Это должно быть довольно просто изменить, чтобы он обнаруживал просто нажатия в определенных направлениях, необходимых для вашего меню.

0 голосов
/ 23 февраля 2011

Вот решение, которое я придумал, на случай, если оно кому-нибудь пригодится:

    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;
    }
0 голосов
/ 22 февраля 2011

Является ли свойство GamePadState.Thumbsticks тем, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...