Обнаружение «Any Button Press»

Я пытаюсь разрешить игроку нажимать любую кнопку для продолжения с главной страницы. Я смог сделать это, создав список кнопок и прокручивая их и проверяя, что один из них не работает; тем не менее, я чувствую, что этот код отчасти уродлив и удивлен, есть ли более простой способ сделать это, о котором я просто не думаю?

Вот мой код, который выглядит сейчас:

            if (GamePad.GetState(PlayerIndex.One).IsConnected)
            {
                var buttonList = new List<Buttons>()
                {
                    {Buttons.A},
                    {Buttons.B},
                    {Buttons.Y},
                    {Buttons.X},
                    {Buttons.Start},
                    {Buttons.Back},
                    {Buttons.RightShoulder},
                    {Buttons.LeftShoulder},
                    {Buttons.RightTrigger},
                    {Buttons.LeftTrigger}
                };

                foreach (var button in buttonList)
                {
                    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
                        ExitMainMenu= true;
                }
            }
10 голосов | спросил LogicaLInsanity 5 AM00000060000001931 2013, 06:03:19

4 ответа


9

Это должно выполнить эту работу. В конце каждого цикла обновления сохраните состояние previousGamePadState. Тогда вы можете сравнить их. Это быстрый способ обнаружения изменений. Нет необходимости в цикле.

GamePadState.PacketNumber

Вы можете использовать PacketNumber, чтобы определить, изменилось ли состояние ввода. Если значение PacketNumber остается неизменным между двумя последовательными вызовами в GetState, то никаких изменений ввода не было.

public bool HasInputChanged(GamePadState previousGamePadState, bool ignoreThumbsticks)
{ 
    GamePadState currentState = GamePad.GetState( PlayerIndex.One );
    if ((currentState.IsConnected) && (currentState.PacketNumber != previousGamePadState.PacketNumber))
    {
        //ignore thumbstick movement
        if(ignoreThumbsticks == true) && ((currentState.ThumbSticks.Left.Length() != previousGamePadState.ThumbSticks.Left.Length() )&&(currentState.ThumbSticks.Right.Length() != previousGamePadState.ThumbSticks.Right.Length()) ))
            return false;
        return true
    }
    return false;
}

EDIT: Изменен метод. Он не гарантированно работает правильно, как есть, но должен работать. Кроме того, поскольку это действительно определяет изменения ввода, поэтому, если пользователь выпускает кнопку, это видно и с этим. Я также добавил IF, чтобы обнаружить движение пальца, поэтому вы можете игнорировать их по крайней мере.

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

Как определить, была ли нажата кнопка контроллера на этом кадре Свойство GamePadState.PacketNumber

ответил Katu 5 AM00000090000004131 2013, 09:05:41
1

Если вы не против использования Reflection, вы можете использовать что-то вроде этого (возможно, даже это точно):

        var properties = typeof(GamePadButtons).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var property in properties)
        {
            var value = property.GetValue(GamePad.GetState(PlayerIndex.One).Buttons);
            if (value is ButtonState && (ButtonState)value == ButtonState.Pressed)
                ExitMainMenu = true;
        }
ответил Pandacoder 5 AM00000070000004931 2013, 07:44:49
1

Вы можете вручную создать пустой GamePadState , а затем проверить его для (в) равенстве с текущим реальным, который вы выбираете с помощью вызов GamePad.GetState.

playerInput = GamePad.GetState(PlayerIndex.One);  
emptyInput = new GamePadState(Vector2.Zero, Vector2.Zero, 0, 0);
if (playerInput != emptyInput){

    // yay!!!!, a button push!
    // 
    // P.S., remember to allow any PlayerIndex to take control of the the game 
    // from the main menu.  It sucks when you pick up controller2 and it doesn't work.

}
ответил Seth Battin 5 AM00000080000000231 2013, 08:32:02
1

Так как кнопки - это перечисление, вы можете использовать Enum.GetValues , например:

var buttonList = (Buttons[])Enum.GetValues(typeof(Buttons));

foreach (var button in buttonList)
{
    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
        ExitMainMenu= true;
}
ответил craftworkgames 5 AM00000090000002331 2013, 09:06:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132