Windows Phone 7 Bölüm 2 Multitouch için oyun geliştirmede dokunma etkileşimleri

Sayfa güncel :
Sayfa oluşturma tarihi :

Programlama! - 2.Multi-touch'ı deneyin

Bu örnek hakkında

Burada, çoklu dokunmatik girişi gerçekleştirmeye yönelik programı açıklamak istiyorum. Windows Phone 7'de, dokunmatik panel üzerinden çoklu dokunmatik giriş, kullanıcı girişi için en önemli öğelerden biridir. Bunun nedeni, Windows ve Xbox 360'ın aksine, ana giriş arayüzünün "dokunmatik panel" olmasıdır. Klavyeli Windows telefonlar olabilir, ancak elbette her zaman bunlara sahip değillerdir. Bu nedenle, oyunun herhangi bir Windows Phone'da çalışması için dokunmatik özellikli olması gerekir.

Dokunmatik paneli yalnızca "tek dokunuş" ile sınırlarsanız, oyun yapma konusunda yapılabilecek oyun türleri kaçınılmaz olarak sınırlı olacaktır. El tipi bir oyun konsolu düşünün (sabit bırakabilirsiniz). Çoğu oyun konsolu, oyun kumandasını (veya gerçek konsolu) iki elinizle tutmanızı ve aynı anda birkaç düğmeye basmanızı gerektirir.

Windows Phone 7, oyun kumandaları kadar çok düğmeye sahip değildir ve mutlaka bir klavyeye sahip değildir. Bu nedenle, sanal tuşlar ve düğmeler ekrana yerleştirilebilir ve bunlara basıldığında, yalnızca tek bir dokunuşla aynı anda basılamadıkları için sakıncalıdır.

Tabii ki, yukarıdaki sanal düğme örneğine ek olarak, çoklu dokunmatikte yaygın olan "çimdikleme ve germe (iki noktayı daha yakın veya daha uzağa hareket ettirin)" gibi birden fazla kişinin bir ekranı çalıştırdığı oyunlar için çoklu dokunma gereklidir.

Bu arada, giriş uzun, ancak bu örnekte, dokunmatik panellere adanmış bir sınıf kullanarak çoklu dokunmatik bilgiler edinmek istiyorum. Aniden çoklu dokunuşla oynanabilecek bir örnek oluşturmak eğlencelidir, ancak önce çoklu dokunma ile ne tür bilgilerin elde edilebileceğini öğrenmek istiyorum. Bazı alışkanlıklar vardır, bu nedenle önce onları bilerek, daha sonra programlamada iyi çalışmadığı zamanlar gibi, nedeni araştırmak için harcanan zamanı azaltabilirsiniz.

Bu örnek programın hedefleri

Çoklu dokunma gerçekleştirildiğinde bilgileri görüntüleyin ve onaylayın.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Şekil 1: Dokunma bilgileri dokunulduğunda metin olarak görüntüleniyor

Program - Alanların Bildirilmesi

Alanlar TouchPanelCapabilities Yapısı ve TouchCollection Yapısı olarak etiketlenmelidir.

/// <summary>
///  スプライトでテキストを描画するためのフォント
/// </summary>
SpriteFont font;

/// <summary>
///  タッチパネルの機能情報
/// </summary>
TouchPanelCapabilities capabilities;

/// <summary>
///  取得したタッチ情報の一覧
/// </summary>
TouchCollection touches;

"TouchPanelCapabilities yapısı", dokunmatik panelin kendisinin fonksiyonlarını parametre olarak alabilen bir yapıdır. Güncelleme sırasında dokunmatik panelin kullanılıp kullanılamayacağını kontrol etmek için kullanılır.

TouchCollection yapısı, o anda dokunulan durumla ilgili bilgilerin bir listesini içerir. Birden fazla dokunuş algılanırsa, birden fazla "TouchLocation yapısı" alınabilir. Daha sonra bunun hakkında daha fazla bilgi.

Program - Yazı Tipleri Yükleme

Ekranda metin çizmeden önce, yazı tipi tanımını içerik projenize ekleyin ve Game.LoadContent yöntemiyle yükleyin. Bu doğrudan dokunmatik panellerle ilgili değildir, bu yüzden ayrıntılı bir açıklamayı atlayacağım.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Şekil 2: İçerik projenize "Font.spritefont" ekleyin

// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");

Program - Dokunmatik panel bilgilerini alma

Dokunmatik panel bilgilerini Game.Update yönteminin içinden alın.

// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();

// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
  // 現在のタッチパネルの入力情報を取得
  touches = TouchPanel.GetState();
}

Dokunmatik panelin işlev bilgilerini almak için "TouchPanel.GetCapabilities" yöntemini çağırabilirsiniz. Elde edilebilecek iki tür bilgi vardır: "Dokunmatik panel kullanılabilir mi?" ve "Dokunmatik panel tarafından elde edilebilecek maksimum temas noktası sayısı." İkisi de oyun sırasında değişmiyor, bu yüzden Game.Initialize yöntemine göre alırsanız sorun olmadığını düşünüyorum, ancak gelecekte, dokunmatik paneli kaldırabilen cihazlar (USB'ye bağlanabilen dokunmatik panel veya Windows Phone dışındaki gerçek cihazlar) ortaya çıkıyor ve Güncelleme yönteminde açıklanmaktadır.

Ayrıca, dokunmatik panelin kullanılıp kullanılamayacağını kontrol etmeye gerek yoktur, çünkü Windows Phone 7'de her zaman kullanılabilir, ancak Windows ve Xbox 360 ile kod paylaşırken, bu donanımlar giriş arayüzleri gerektirmez ve kontrol edilmesi gerekir.

Dokunmatik panelin "TouchPanelCapabilities.IsConnected" özelliğinde kullanılabilir olduğunu doğrulayabilirseniz, "TouchPanel.GetState" yöntemi geçerli dokunma durumunu alır.

Başlangıçta, bazı işlem işlemleri dokunma bilgileri alındıktan sonra gerçekleştirilir, ancak bu örnekte bilgiler yalnızca görüntülenir, bu nedenle Game.Update yönteminde başka bir işlem yapılmaz.

Program - Alabileceğiniz maksimum temas noktası sayısını alın

Alınabilecek maksimum temas noktası sayısı kabaca sabittir, bu nedenle oyun sırasında bunları almak genellikle gerekli değildir, ancak TouchPanelCapabilities.MaximumTouchCount özelliğinden alınabilecek maksimum temas noktası sayısını alabilirsiniz. Örneğin, MaximumTouchCount özelliği "4" ise, dokunmatik panele beş parmağınızla dokunarak beşinci konum bilgilerini alamazsınız.

Bu örnekte kullanılan akıllı telefon "HTC 7 Trophy" için satın alma sayısı "4" idi. (Bu arada, XNA Game Studio 4.0 her zaman 4 döndürecek şekilde tanımlanmıştır.) Windows Phone 7 spesifikasyonu 4 puandan fazla olduğunu söylüyor, bu yüzden 4'ten az geri dönmüyor.)

// タッチ可能な最大数を表示
spriteBatch.DrawString(font,  
                       "MaximumTouchCount : " +
                         capabilities.MaximumTouchCount,
                       new Vector2(20, 50),
                       Color.LightGreen);

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Şekil 3: TouchPanelCapabilities.MaximumTouchCount Özellik Alma Sayısı

Program - Dokunma bilgilerini alın

Alınan TouchCollection yapısı birden fazla dokunma bilgisi içerir. Örneğin, iki parmağınızla dokunursanız, genellikle iki dokunuş içerir.

Dokunma bilgilerinin sayısı TouchCollection.Count özelliğinden alınabilir. Dokunma bilgileri, for deyiminde elde edildiği kadar tekrar tekrar görüntülenir. Başlangıçta, foreach ile döngü yapmak için bir sorun yoktur, ancak daha sonraki açıklamada dizi dizinini (int index) kullanacağımız için, for ile döngülüyoruz.

// タッチ情報の数だけループする
for (int index = 0; index < touches.Count; index++)
{
  // 指定したインデックスのタッチ情報取得
  TouchLocation tl = touches[index];

  // タッチ情報を可視化
  string mes = "Index : " + index + Environment.NewLine +
               "Id : " + tl.Id + Environment.NewLine +
               "Position : " + tl.Position + Environment.NewLine +
               "State : " + tl.State;

  // 文字の描画
  spriteBatch.DrawString(font,
                         mes,
                         new Vector2(30 + (index % 4) * 10,
                                     80 + index * 140),
                         Color.White);
}

Artık her dokunma bilgisi "TouchLocation" yapısı olarak elde ediliyor. for ile döngü yapıyorsa, "TouchCollection [index]" ile elde edilebilir. ("TouchLocation" yapısını doğrudan foreach'de de alabilirsiniz.)

Aşağıdaki dört bilgi türü "TouchLocation" yapısından elde edilebilir ve her bilgi örnekte görüntülenir.

Gerçekten çalıştırdığınızda, dokunma bilgileri aşağıda gösterildiği gibi görüntülenir. Üç parmağınızla dokunduğunuzdan, üç dokunuş görebilirsiniz. Bu arada, beş parmağınızla dokunursanız, yalnızca dörde kadar görürsünüz. (Çünkü maksimum satın alma sayısı 4'tür)

図 4 :3 本の指でタッチしているところ
Resim 4: Üç parmağınızla dokunma

Program - Dokunmatik bilgileri alırken dikkat edilmesi gerekenler 1 (dizin ve kimlik)

Yukarıda dokunma bilgileriyle uğraşırken akılda tutulması gereken şeyler olduğunu belirttim, ancak ilki "index" ve "ID" dir. Bir dizin basitçe bir dizi dizinini ifade eder.

Bence gerçek bir makinede denerseniz anlamak, yazılı olarak açıklamaktan daha kolaydır. Örneğin, "işaret parmağı" ve "orta parmak" olmak üzere iki parmağınızla çalıştığınızı ve önce işaret parmağınızla dokunduğunuzu varsayalım.

図 5 :人差し指でタッチ
Şekil 5: İşaret parmağıyla dokunma

Ekranda gösterildiği gibi, dizin "0" olacaktır. Ardından orta parmağınızla dokunun.

図 6 :中指でタッチ
Şekil 6: Orta parmak dokunuşu

Bu durumda, iki parmağınızla dokunuyorsunuz, böylece iki bilgi parçası görüntüleniyor. Orta parmakla dokunulan işaret "1" dir.

İşaret parmağımızı buradan kaldıralım. Ardından dokunma bilgileri aşağıdaki gibi görünecektir.

図 7 :人差し指を放す
Şekil 7: İşaret parmağınızı serbest bırakın

Şimdiye kadar fark etmiş olabileceğiniz gibi, orta parmağınızla dokunduğunuz bilgilerin indeksi "0" dır. Taşıdığınızda karakteri dizine göre yönetirseniz, yukarıdaki işlem aşağıdaki eylemlere yol açacaktır.

・ "A" karakterini işaret parmağınla hareket ettir

・ "B" karakterini orta parmağınızla bu durumda hareket ettirin.

・ Karakteri orta parmağınızla hareket ettirirken işaret parmağını serbest bırakın

・ Orta parmak tarafından kontrol edilen karakter aniden "A"ya geçer

Başka bir fenomen, iki parmağınızdan birine dokunurken tekrar tekrar serbest bırakırsanız veya dokunursanız, ilk dokunma bilgisinin çizim metninin titreşebileceğidir. Bunun nedeni, ikinci parmağın dokunduğunuz veya serbest bıraktığınız anda "0" işaretini kesmesidir.

Yukarıda belirtildiği gibi, çoklu dokunma sırasında dokunma bilgilerinin dizini ve sırası, dokunuldukları sırayla eşleşmiyor. Bu nedenle, herhangi bir işlem gerçekleştirmek istiyorsanız, bunları TouchCollection dizininde yönetmeyin.

Yönetilmesi gereken, "TouchLocation" yapısının bir "Id" özelliğine sahip olması ve Id'nin her dokunulduğunda yeni bir değerle yeniden yazılmasıdır, ancak dokunma noktası ile ID arasındaki ilişki dokunulduğunda garanti edilir, bu yüzden onu yöneteceğiz.

Tabii ki, bu onu kimlikle yönetmeniz gerektiği anlamına gelmez ve bazı durumlarda dokunma konumu tek başına yeterlidir. Örneğin, ekrandaki bir düğmeye yalnızca dokunursanız, kimliğe bakılmaksızın dokunma konumunu kontrol ederek bir düğmeye bastığınızı belirleyebilirsiniz. Ancak, sürükleme işlemeyi dahil ederken, konum her zaman değişir, bu yüzden yine de ID tarafından belirlenmesi gerektiğini düşünüyorum.

Program - Dokunma bilgilerini alırken akılda tutulması gerekenler 2 (alınan dokunma bilgilerinin sayısı)

Makalenin programına dahil edilmemesine rağmen, örnek ekranın altındaki "GetMaxTouchCount" dizesini ve "aynı anda elde edilen maksimum dokunma bilgisi sayısını" çizer. Bu, geçmişte "TouchPanel.GetState" yöntemi tarafından elde edilen maksimum dokunma bilgisi sayısını görüntüledi, ancak bu test makinesinde "TouchPanelCapabilities.MaximumTouchCount" özelliği 4'tür, bu nedenle burada görüntülenen maksimum değer genellikle 4 olmalıdır. Üzerine beş parmağınızı koyarsanız, yine de 4 olacaktır.

図 8 :5 本の指を置いたときの数値
Şekil 8: Beş parmak sayısı

Küçük bir deney yapalım. Dokunmatik paneli yüksek hızda birden fazla parmağınızla tekrarlamayı deneyin. Test makinesine bağlıdır, ancak siz bilmeden önce sayı 4'ü aşabilir.

図 9 :GetMaxTouchCount が 4 を超えている
Şekil 9: GetMaxTouchCount 4'ten büyük

Aslında, "TouchPanel.GetState" yöntemiyle elde edilen dokunma bilgileri, "TouchPanel.GetState" yönteminin çağrıldığı andaki dokunma bilgileri değil, dokunduğunuz an ve son güncelleme zamanlamasından serbest bıraktığınız an önbelleğe alınır. Bu nedenle, aynı anda dört dokunuşa kadar algılanabilse de, aynı parmağa tekrar dokunmak ayrı bir dokunuş olarak kabul edilir, bu nedenle TouchPanelCapabilities.MaximumTouchCount'tan daha fazla dokunma bilgisi elde edilebilir.

Bu nedenle, TouchPanelCapabilities.MaximumTouchCount 4 olsa bile, dokunmayla ilgili verilerin dizi öğelerinin sayısı 4 ile sabitlenirse, işleme yöntemine bağlı olarak bir dizin aşımı hatası oluşabilir.

Bu arada, XNA Game Studio'nun yardımıyla, TouchCollection.Count özelliğinin maksimum değeri "8" olarak tanımlanır, bu nedenle dizideki öğe sayısını düzeltmek istiyorsanız, öğe sayısını en az 8 olarak ayarlamalısınız. (Gelecekteki sürüm yükseltmelerini düşünüyorsanız, dizinin üzerinden geçmemesi için bir koruma yan tümcesi eklemek isteyebilirsiniz.)

Bu örneğin özeti

Bu sefer multi-touch'tan elde edilen bilgiler için çeşitli parametreleri inceledik. Ayrıca, dokunmatik panel bilgilerini alırken akılda tutulması gereken bazı noktalar olduğunu da doğruladık. Bu bilgiye dayanarak, aslında çoklu dokunma kullanan bir örneği açıklamak istiyorum.