"모든 버튼 누름"감지


10

플레이어가 기본 페이지에서 계속하기 위해 아무 버튼이나 누르도록 허용하려고합니다. 나는 버튼 목록을 만들고 이것들을 반복하고 그들 중 하나가 다운되는지 확인함으로써 이것을 할 수 있었다. 그러나이 코드가 추악하다고 생각하고 생각하지 않는 간단한 방법이 있는지 궁금합니다.

내 코드는 다음과 같습니다.

            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;
                }
            }

배열을 만들고 루프하는 것과는 반대로 개인적으로 큰 IF 루프를 수행합니다.
jgallant

@Jon 큰 IF 루프 란 무엇이며 왜 더 좋을까요?
craftworkgames

나는이 질문에 대한 모든 대답을 좋아합니다. @Katu는 "올바른"답을 얻었습니다.
Seth Battin

답변:


10

이 작업을 수행해야합니다. 모든 업데이트 루프가 끝나면 상태를 저장하십시오 previousGamePadState. 그런 다음 em을 비교할 수 있습니다. 변경 사항을 감지하는 빠른 방법입니다. 반복 할 필요가 없습니다.

GamePadState.PacketNumber :

PacketNumber를 사용하여 입력 상태가 변경되었는지 확인할 수 있습니다. PacketState의 값이 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;
}

편집 : 방법으로 변경되었습니다. 제대로 작동한다고 보장되지는 않지만 작동해야합니다. 또한 이것은 실제로 입력의 변화를 감지하기 때문에 사용자가 버튼을 놓으면 이것도 보입니다. 또한 if썸 스틱 움직임을 감지하기 위해 추가 했으므로 적어도 무시할 수 있습니다.

이것이 도움이되기를 바랍니다. 귀하의 요구에 맞지 않는 경우 알려 주시면 해결해 드리겠습니다.

방법 :이 프레임이 컨트롤러 버튼을 눌 렸는지 감지 GamePadState.PacketNumber 속성


GamePadStateand enum Buttons에 대해 이것을 쓰는 비슷한 방법이 있습니다. 이것은 OP가 사용하는 것으로 보이는 문맥에 더 가깝습니다.
Seth Battin

1
모닝 커피 전에 아무 것도 대답해서는 안됩니다 :)
Katu

1
이제는 작업을 수행하며 이보다 더 빨리 얻을 수는 없습니다.
Katu

우와, 완전히 다른 방법이고, 나는 그것이 가장 빠른 방법에 대해 옳다고 생각합니다. 좋은.
Seth Battin

버튼 누름 만 감지합니까, 아니면 버튼 해제도 감지합니까?
George Duckett

1

리플렉션 사용에 신경 쓰지 않는다면 다음과 같은 것을 사용할 수 있습니다 (아마도 정확하게).

        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;
        }

1

empty를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

영리한 아이디어이지만 GamePadState가 Equals를 재정의하지 않는 경우에만 작동합니다. 대부분 참조 평등을 사용하므로 위의 if 문은 true로 평가되지 않습니다.
craftworkgames

@craftworkgames Equals는 다릅니다. 동일한 인스턴스에 대한 두 개의 참조를 비교합니다. 그러나 GamePadState== 연산자를 오버로드하여 값을 비교하여 내 답변 ( op_Equality) 에 연결했습니다 .
Seth Battin

실제로 GamePadState가 아마도 작동 할 것임을 알지 못했습니다. 기술적으로 Equals와 ==의 동작은 종종 동일하지만 구현에 따라 다르지만 지침은이 방법을 권장합니다. 참조 평등을 원한다면 object.ReferenceEquals도 있습니다. msdn.microsoft.com/en-us/library/bsc2ak47.aspx
craftworkgames

아 맞습니다. GamePadState는 값 유형이므로 관련이 없습니다. 그럼에도 불구하고 ==가 오버로드되어 IMO를 사용할 수도 있습니다.
Seth Battin

1

Buttons는 열거 형이므로 Enum.GetValues 메서드를 다음과 같이 사용할 수 있습니다 .

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

foreach (var button in buttonList)
{
    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
        ExitMainMenu= true;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.