Aracılığıyla paylaş


Uçuş çubuğu

Bu sayfada , Windows.Gaming.Input.FlightStick kullanarak Xbox One sertifikalı uçuş çubukları için programlamanın temelleri ve Evrensel Windows Platformu (UWP) için ilgili API'ler açıklanmaktadır.

Bu sayfayı okuyarak şunları öğreneceksiniz:

  • Nasıl bağlı uçuş çubuklarının ve kullanıcılarının listesi toplanır
  • Bir uçuş çubuğunun eklendiği veya kaldırıldığı nasıl algılanır?
  • bir veya daha fazla uçuş çubuğuna ait girişleri okuma
  • uçuş çubukları kullanıcı arabirimi gezinti cihazları olarak nasıl davranır?

Genel Bakış

Uçuş çubukları, bir uçağın veya uzay gemisinin kokpitinde bulunan uçuş çubuklarının hissini yeniden üretmeye değer oyun giriş cihazlarıdır. Bunlar, uçuşun hızlı ve doğru kontrolü için mükemmel bir giriş cihazıdır. Uçuş çubukları, Windows.Gaming.Input ad alanı aracılığıyla Windows 10 veya Windows 11 ve Xbox One uygulamalarında desteklenir.

Xbox One sertifikalı uçuş çubukları aşağıdaki denetimlerle donatılmıştır:

  • Yuvarlama, eğim ve esneme özelliğine sahip bükülebilir analog oyun çubuğu
  • Analog gaz kolu
  • İki yangın düğmesi
  • 8 yönlü dijital şapka anahtarı
  • Görünüm ve Menü düğmeleri

Uyarı

Görünüm ve Menü düğmeleri oyun komutlarını değil kullanıcı arabirimi gezintisini desteklemek için kullanılır ve bu nedenle oyun çubuğu düğmeleri olarak kolayca erişemez.

Kullanıcı arabirimi gezintisi

Kullanıcı arabirimi gezintisi için farklı giriş cihazlarını destekleme yükünü hafifletmek ve oyunlar ile cihazlar arasında tutarlılığı teşvik etmek için çoğu fiziksel giriş cihazı aynı anda kullanıcı arabirimi gezinti denetleyicileri olarak adlandırılan ayrı mantıksal giriş cihazları olarak hareket eder. UI gezinti denetleyicisi, giriş cihazları arasında kullanıcı arabirimi gezinti komutları için ortak bir sözlük sağlar.

Kullanıcı arabirimi gezinti denetleyicisi olarak, bir uçuş çubuğu gezinti komutlarının gerekli kümesi oyun çubuğuna ve View, Menu, FirePrimaryve FireSecondary düğmelerine eşler.

Navigasyon komutu Uçuş çubuğu girişi
Yukarı Joystick'i yukarı hareket ettir
Aşağıya doğru Oyun çubuğu aşağı
Sol Oyun çubuğunu sola çevir
Doğru Oyun çubuğu sağ
Görüntüle Görünüm düğmesi
Menü Menü düğmesi
Kabul etmek FirePrimary düğmesi
İptal Ateşleme İkincil düğmesi

Uçuş çubukları, isteğe bağlı gezinti komutlarının hiçbirini eşlemez.

Uçuş çubuklarını algılama ve izleme

Uçuş çubuklarını algılama ve izleme, Gamepad sınıfı yerine FlightStick sınıfı dışında oyunpad'lerde olduğu gibi çalışır. Daha fazla bilgi için Gamepad ve titreşim bölümüne bakın.

Uçuş çubuğunu okuma

İlgilendiğiniz uçuş çubuğunu belirledikten sonra, ondan giriş toplamaya hazır olursunuz. Ancak, alışmış olabileceğiniz diğer bazı giriş türlerinden farklı olarak, uçuş çubukları durum değişikliğini olay başlatarak iletmez. Bunun yerine, onları yoklayarak geçerli durumlarını düzenli olarak kontrol edersiniz.

Uçuş çubuğunu yoklama

Sorgulama, uçuş çubuğunun bir anda anlık görüntüsünü yakalar. Bu giriş toplama yaklaşımı çoğu oyun için uygundur çünkü mantıkları genellikle olay odaklı olmak yerine belirlenimci bir döngüde çalışır. Aynı zamanda, bir kerede toplanan girişlerden oyun komutlarını yorumlamak, zaman içinde toplanan birçok tek girişten gelen komutlardan daha kolaydır.

FlightStick.GetCurrentReadingçağırarak bir uçuş çubuğunu yoklarsınız. Bu işlev, uçuş kumandasının durumunu içeren bir FlightStickReading döndürür.

Aşağıdaki örnek, geçerli durumunu sorgulamak için bir uçuş çubuğunu araştırır:

auto flightStick = myFlightSticks->GetAt(0);
FlightStickReading reading = flightStick->GetCurrentReading();

Uçuş çubuğu durumuna ek olarak, her okuma, durumun tam olarak ne zaman alındığını gösteren bir zaman damgası içerir. Zaman damgası, önceki okumaların zamanlaması veya oyun simülasyonunun zamanlaması ile ilgili olarak yararlıdır.

Oyun çubuğu ve gaz kolu girişlerini okuma

Oyun çubuğu, X, Y ve Z eksenlerinde (sırasıyla yuvarlanma, yunuslama ve sapma) -1.0 ile 1.0 arasında bir analog okuma sağlar. Rulo için -1,0 değeri en soldaki oyun çubuğu konumuna karşılık gelirken, 1,0 değeri en sağdaki konuma karşılık gelir. Pitch için -1,0 değeri en alttaki oyun çubuğu konumuna karşılık gelirken, 1,0 değeri en üstteki konuma karşılık gelir. Yaw için -1,0 değeri saat yönünün en ters, bükülmüş konumuna karşılık gelirken, 1,0 değeri saat yönünde en uygun konuma karşılık gelir.

Tüm eksenlerde, oyun çubuğu orta konumdayken değer yaklaşık 0,0'dır, ancak sonraki okumalar arasında bile kesin değerin değişmesi normaldir. Bu varyasyonu azaltma stratejileri bu bölümün ilerleyen bölümlerinde ele alınmalıdır.

Oyun çubuğunun yana yatışının değeri FlightStickReading.Roll özelliğinden, eğimin değeri FlightStickReading.Pitch özelliğinden ve yana dönüşün değeri FlightStickReading.Yaw özelliğinden okunur:

// Each variable will contain a value between -1.0 and 1.0.
float roll = reading.Roll;
float pitch = reading.Pitch;
float yaw = reading.Yaw;

Oyun çubuğu değerlerini okurken, oyun çubuğu orta konumdayken 0,0'ın nötr okumasını güvenilir bir şekilde üretmediklerini fark edeceksiniz; bunun yerine, oyun çubuğu her taşındığında ve orta konuma döndürildiğinde 0,0'a yakın farklı değerler üretirler. Bu çeşitlemeleri azaltmak için, göz ardı edilen ideal orta konuma yakın bir değer aralığı olan küçük bir ölü bölge uygulayabilirsiniz.

Ölü bölgeyi oluşturmanın bir yolu, oyun çubuğunun merkezden ne kadar uzak hareket ettiğini belirlemek ve sizin belirlediğiniz mesafeden daha yakın olan verileri yoksaymaktır. Uzaklığı kabaca hesaplayabilirsiniz—tam olarak değil çünkü joystick okumaları esasen kutupsal, düzlem değil, değerlerdir—sadece Pisagor teoremini kullanarak. Bu, radyal bir ölü bölge üretir.

Aşağıdaki örnekte Pythagorean teoremini kullanan temel radyal bir ölü bölge gösterilmektedir:

// Choose a deadzone. Readings inside this radius are ignored.
const float deadzoneRadius = 0.1f;
const float deadzoneSquared = deadzoneRadius * deadzoneRadius;

// Pythagorean theorem: For a right triangle, hypotenuse^2 = (opposite side)^2 + (adjacent side)^2
float oppositeSquared = pitch * pitch;
float adjacentSquared = roll * roll;

// Accept and process input if true; otherwise, reject and ignore it.
if ((oppositeSquared + adjacentSquared) < deadzoneSquared)
{
    // Input accepted, process it.
}

Düğmeleri ve şapka anahtarını okuma

Uçuş çubuğunun iki ateş düğmesinin her biri, basıldığını (aşağı) veya serbest bırakıldığını (yukarı) belirten dijital bir okuma sağlar. Verimlilik için, düğme okumaları tek tek boole değerleri olarak değil, hepsi FlightStickButtons numaralandırması tarafından temsil edilen tek bir bit alanına paketlenir. Ayrıca, 8 yönlü şapka anahtarı, GameControllerSwitchPosition numaralandırması tarafından temsil edilen tek bir bit alanına paketlenmiş bir yön sağlar.

Uyarı

Uçuş çubukları, Görünüm ve Menü düğmeleri gibi kullanıcı arabirimi gezintisi için kullanılan ek düğmelerle donatılmıştır. Bu düğmeler numaralandırmanın FlightStickButtons bir parçası değildir ve yalnızca kullanıcı arabirimi gezinti cihazı olarak uçuş çubuğuna erişilerek okunabilir. Daha fazla bilgi için bkz. KULLANıCı arabirimi gezinti denetleyicisi.

Düğme değerleri FlightStickReading.Buttons özelliğinden okunur. Bu özellik bit alanı olduğundan, ilgilendiğiniz düğmenin değerini yalıtmak için bit düzeyinde maskeleme kullanılır. İlgili bit ayarlandığında düğmeye (aşağı) basılır; aksi takdirde serbest bırakılır (yukarı).

Aşağıdaki örnek , FirePrimary düğmesine basılıp basılmadığını belirler:

if (FlightStickButtons::FirePrimary == (reading.Buttons & FlightStickButtons::FirePrimary))
{
    // FirePrimary is pressed.
}

Aşağıdaki örnek , FirePrimary düğmesinin serbest bırakılıp bırakılmadığını belirler:

if (FlightStickButtons::None == (reading.Buttons & FlightStickButtons::FirePrimary))
{
    // FirePrimary is released (not pressed).
}

Bazen bir düğmenin basılı durumdan serbest duruma veya serbestten basılı duruma ne zaman geçtiğini, birden fazla düğmeye basılıp basılmadığını, veya bir düğme kümesinin belirli bir şekilde düzenlenip düzenlenmediğini (bazıları basılmış, bazıları değil) belirlemek isteyebilirsiniz. Bu koşulların her birini algılama hakkında bilgi için bkz. Düğme geçişlerini algılama ve Karmaşık düğme düzenlemelerini algılama.

Şapka anahtarı değeri FlightStickReading.HatSwitch özelliğinden okunur. Bu özellik de bit alanı olduğundan, şapka anahtarının konumunu yalıtmak için yine bit düzeyinde maskeleme kullanılır.

Aşağıdaki örnek, şapka anahtarının yukarı konumda olup olmadığını belirler:

if (GameControllerSwitchPosition::Up == (reading.HatSwitch & GameControllerSwitchPosition::Up))
{
    // The hat switch is in the up position.
}

Aşağıdaki örnek, şapka anahtarının orta konumda olup olmadığını belirler:

if (GameControllerSwitchPosition::Center == (reading.HatSwitch & GameControllerSwitchPosition::Center))
{
    // The hat switch is in the center position.
}

Ayrıca bakınız