"모든 버튼 누름"감지


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.