“Herhangi Bir Düğmeye Basma” Tespiti


10

Oynatıcının ana sayfadan devam etmek için herhangi bir düğmeye basmasına izin vermeye çalışıyorum. Bunu bir Düğme Listesi yaparak ve bunlardan geçerek ve bunlardan birinin aşağı olup olmadığını kontrol ederek yapabildim; Ancak, bu kod çirkin gibi hissediyorum ve sadece düşünmüyorum bunu yapmak için basit bir yolu var mı acaba?

İşte benim kod şimdi nasıl görünüyor:

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

Şahsen ben sadece bir dizi oluşturmak ve döngü aksine, büyük bir IF döngü yapmak.
jgallant

@Jon Büyük bir IF döngüsü nedir ve neden daha iyi olur?
craftworkgames

Bu sorunun aldığı tüm cevabı seviyorum. Bence @Katu "doğru" yanıtı aldı.
Seth Battin

Yanıtlar:


10

Bu işi yapmalı. Her güncelleme döngüsünün sonunda durumunu kaydedin previousGamePadState. Sonra em karşılaştırabilirsiniz. Bu, değişiklikleri tespit etmenin hızlı bir yoludur. Döngüye gerek yok.

GamePadState.PacketNumber :

Girdi durumunun değişip değişmediğini belirlemek için PacketNumber kullanabilirsiniz. PacketNumber değeri GetState'e yapılan iki ardışık çağrı arasında aynı kalırsa, girişte herhangi bir değişiklik olmamıştır.

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: Yönteme değiştirildi. Olduğu gibi çalışacağı garanti edilmez, ancak çalışması gerekir. Ayrıca, bu gerçekten girişteki değişiklikleri tespit ettiğinden, kullanıcı düğmeyi bırakırsa, bununla da görülür. ifBaşparmak hareketini algılamak için de ekledim , böylece en azından bunları göz ardı edebilirsiniz.

Umarım bu size yardımcı olur. Bana bildirin, ihtiyaçlarınızı karşılamıyorsa, eminim bunu halledebiliriz.

Nasıl yapılır: Bu Kareye Bir Denetleyici Düğmesinin Basılmış Olup Olmadığını Algılama GamePadState.PacketNumber Özelliği


Orada bu yazmak için benzer bir yoldur GamePadStateve enum Buttonsdaha yakın OP kullandığı görünen bağlama olan.
Seth Battin

1
Sabah kahvesinden önce hiçbir şeye cevap vermemelisiniz :)
Katu

1
Şimdi işi yapıyor ve bundan daha hızlı olamaz.
Katu

Vay, tamamen farklı bir yöntem ve bence en hızlısı olma konusunda haklısın. Güzel.
Seth Battin

Bu yalnızca düğmeye basıldığını mı algılar yoksa düğme bırakmalarını da algılar mı?
George Duckett

1

Yansıtma kullanımını önemsemiyorsanız, bunun gibi bir şey kullanabilirsiniz (muhtemelen tam olarak bu):

        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

Manuel olarak boş bir yapı oluşturabilirGamePadState ve sonra arayarak getirdiğiniz geçerli gerçekle (in) eşitlik olup olmadığını kontrol edebilirsiniz .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.

}

Bunun işe yarayıp yaramadığına dair hiçbir fikrim yok; Bunu hiç denemedim. Sizin için işe yarayıp yaramadığını bana bildirin.
Seth Battin

Zekice bir fikir, ancak GamePadState, Eşit Değil'i geçersiz kılarsa işe yarayacaktır. Büyük olasılıkla, referans eşitliğini ve dolayısıyla yukarıdaki ifadenin asla doğru olarak değerlendirilmemesi durumunda yukarıdaki ifadeyi kullanacaktır.
craftworkgames

@craftworkgames Equalsfarklıdır; aynı örnek olmak için iki referansı karşılaştırır. Ama GamePadState== operatörüne cevabımda ( op_Equality) bağlandığım değerlerini karşılaştırmak aşırı yüklüyor .
Seth Battin

Aslında GamePadState'in muhtemelen işe yarayacağı bir yapı olduğunun farkında değildim. Teknik olarak, Eşittir ve == davranışı genellikle aynıdır, elbette, uygulamaya bağlıdır, ancak yönergeler bu şekilde önermektedir. Eğer gerçekten referans eşitlik istiyorsanız da object.ReferenceEquals var msdn.microsoft.com/en-us/library/bsc2ak47.aspx
craftworkgames

Ah haklısın, GamePadState bir değer türüdür, bu yüzden alakalı değildir. Ne olursa olsun, == aşırı yüklenmiş, IMO da kullanabilir.
Seth Battin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.