Interakcje dotykowe w tworzeniu gier dla systemu Windows Phone 7, część 2 Wielodotyk
Programowanie! - 2.Spróbuj multi-touch
Informacje o tej próbce
Tutaj chciałbym wyjaśnić program do realizacji wprowadzania wielodotykowego. W systemie Windows Phone 7 wprowadzanie wielodotykowe za pomocą panelu dotykowego jest jednym z najważniejszych elementów wprowadzania danych przez użytkownika. Wynika to z faktu, że w przeciwieństwie do Windows i Xbox 360, głównym interfejsem wejściowym jest "panel dotykowy". Mogą istnieć telefony z systemem Windows z klawiaturami, ale oczywiście nie zawsze je mają. Tak więc, aby gra działała na dowolnym Windows Phone, musi obsługiwać dotyk.
Jeśli ograniczysz panel dotykowy tylko do "pojedynczego dotknięcia", rodzaje gier, które można tworzyć, będą nieuchronnie ograniczone, jeśli chodzi o tworzenie gier. Pomyśl o przenośnej konsoli do gier (możesz zostawić ją nieruchomą). Większość konsol do gier wymaga trzymania kontrolera gier (lub rzeczywistej konsoli) obiema rękami i naciskania kilku przycisków jednocześnie.
System Windows Phone 7 nie ma tylu przycisków co kontrolery gier i niekoniecznie ma klawiaturę. Dlatego wirtualne i przyciski mogą być umieszczane na ekranie, a po ich naciśnięciu jest to niewygodne, ponieważ nie można ich nacisnąć jednocześnie jednym dotknięciem.
Oczywiście, oprócz powyższego przykładu z wirtualnym przyciskiem, wielodotyk jest niezbędny w grach, w których wiele osób obsługuje jeden ekran, na przykład "szczypanie i rozciąganie (zbliżenie się o dwa punkty lub oddalenie od siebie)", co jest powszechne w multi-touch.
Nawiasem mówiąc, wprowadzenie jest długie, ale w tym przykładzie chciałbym uzyskać informacje multi-touch za pomocą klasy poświęconej panelom dotykowym. Fajnie jest stworzyć próbkę, którą można nagle odtwarzać za pomocą multi-touch, ale najpierw chciałbym dowiedzieć się, jakie informacje można uzyskać za pomocą multi-touch. Istnieją pewne nawyki, więc znając je najpierw, możesz skrócić czas spędzony na badaniu przyczyny, na przykład gdy nie działa dobrze w programowaniu później.
Cele tego przykładowego programu
Wyświetl i potwierdź informacje podczas wykonywania funkcji wielodotyku.
Rysunek 1: Informacje o dotyku są wyświetlane jako tekst po dotknięciu
Program - Deklarowanie pól
Pola muszą mieć etykiety TouchPanelCapabilities Structure i TouchCollection Structure.
<summary>
スプライトでテキストを描画するためのフォント
</summary>
SpriteFont font;
<summary>
タッチパネルの機能情報
</summary>
TouchPanelCapabilities capabilities;
<summary>
取得したタッチ情報の一覧
</summary>
TouchCollection touches;
"Struktura TouchPanelCapabilities" to struktura, która może mieć funkcje samego panelu dotykowego jako parametry. Służy do sprawdzenia, czy panel dotykowy może być używany podczas aktualizacji.
Struktura TouchCollection zawiera listę informacji o aktualnie dotkniętym stanie. W przypadku wykrycia wielu dotknięć można odzyskać wiele struktur "TouchLocation". Więcej o tym później.
Program - Ładowanie czcionek
Przed narysowaniem tekstu na ekranie dodaj definicję czcionki do projektu zawartości i załaduj ją za pomocą metody Game.LoadContent. Nie jest to bezpośrednio związane z panelami dotykowymi, więc pominę szczegółowe wyjaśnienie.
Rysunek 2: Dodaj "Font.spritefont" do projektu zawartości
// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");
Program - Uzyskaj informacje o panelu dotykowym
Uzyskaj informacje o panelu dotykowym w metodzie Game.Update.
// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();
// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
// 現在のタッチパネルの入力情報を取得
touches = TouchPanel.GetState();
}
Możesz wywołać metodę "TouchPanel.GetCapabilities", aby uzyskać informacje o funkcji panelu dotykowego. Istnieją dwa rodzaje informacji, które można uzyskać: "Czy można używać panelu dotykowego?" i "Maksymalna liczba punktów dotyku, które można uzyskać za pomocą panelu dotykowego". Żaden z nich nie zmienia się w trakcie gry, więc myślę, że nie ma problemu, jeśli dostaniesz go zgodnie z metodą Game.Initialize, ale w przyszłości pojawią się urządzenia, które mogą usunąć panel dotykowy (panel dotykowy, który można podłączyć do USB lub rzeczywistych urządzeń innych niż Windows Phone) i jest to opisane w metodzie Update.
Ponadto nie ma potrzeby sprawdzania, czy panel dotykowy może być używany, ponieważ zawsze można go używać w systemie Windows Phone 7, ale podczas udostępniania kodu systemowi Windows i Xbox 360 sprzęt ten nie jest wymagany interfejsy wejściowe i należy je sprawdzić.
Jeśli możesz potwierdzić, że panel dotykowy jest dostępny we właściwości "TouchPanelCapabilities.IsConnected", metoda "TouchPanel.GetState" pobiera bieżący stan dotyku.
Pierwotnie niektóre operacje przetwarzania są wykonywane po uzyskaniu informacji dotykowych, ale w tym przykładzie informacje są wyświetlane tylko wtedy, więc w metodzie Game.Update nie jest wykonywane żadne dalsze przetwarzanie.
Program - Uzyskaj maksymalną liczbę punktów styku, jaką możesz uzyskać
Maksymalna liczba punktów kontaktu, które można odzyskać, jest z grubsza stała, więc często nie jest konieczne ich pobieranie podczas gry, ale można uzyskać maksymalną liczbę punktów kontaktu, które można pobrać z właściwości TouchPanelCapabilities.MaximumTouchCount. Na przykład, jeśli właściwość MaximumTouchCount to "4", nie można uzyskać informacji o piątej pozycji, dotykając panelu dotykowego pięcioma palcami.
Liczba przejęć dla smartfona "HTC 7 Trophy" użytego w tej próbce wynosiła "4". (Nawiasem mówiąc, XNA Game Studio 4.0 jest zdefiniowany tak, aby zawsze zwracał 4.) Specyfikacja Windows Phone 7 mówi, że jest to więcej niż 4 punkty, więc nie zwraca mniej niż 4.)
// タッチ可能な最大数を表示
spriteBatch.DrawString(font,
"MaximumTouchCount : " +
capabilities.MaximumTouchCount,
new Vector2(20, 50),
Color.LightGreen);
Rysunek 3: Liczba pobierania właściwości TouchPanelCapabilities.MaximumTouchCount
Program - Uzyskaj informacje dotykowe
Pobrana struktura TouchCollection zawiera wiele informacji o dotyku. Na przykład, jeśli dotykasz dwoma palcami, zwykle zawiera dwa dotknięcia.
Liczbę informacji o dotyku można pobrać we właściwości TouchCollection.Count. Informacje o dotyku są wielokrotnie wyświetlane w instrukcji for tyle razy, ile zostaną uzyskane. Pierwotnie nie ma problemu z pętlą z foreach, ale ponieważ w późniejszym wyjaśnieniu użyjemy indeksu tablicy (int index), zapętlamy go z for.
// タッチ情報の数だけループする
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);
}
Teraz każda informacja o dotyku jest uzyskiwana jako struktura "TouchLocation". Jeśli jest zapętlony z for, można go uzyskać za pomocą "TouchCollection[index]". (Możesz również uzyskać strukturę "TouchLocation" bezpośrednio w foreach.)
Następujące cztery typy informacji można uzyskać ze struktury "TouchLocation", a każda informacja jest wyświetlana w próbce.
Po uruchomieniu wyświetlane są informacje o dotyku, jak pokazano poniżej. Ponieważ dotykasz trzema palcami, możesz zobaczyć trzy dotknięcia. Nawiasem mówiąc, jeśli dotkniesz pięcioma palcami, zobaczysz tylko do czterech. (Ponieważ maksymalna liczba przejęć wynosi 4)
Ryc. 4: Dotykanie trzema palcami
Program - Na co należy uważać podczas pobierania informacji o dotyku 1 (indeks i identyfikator)
Wspomniałem powyżej, że są rzeczy, o których należy pamiętać podczas pracy z informacjami dotykowymi, ale pierwszym z nich jest "indeks" i "identyfikator". Indeks odnosi się po prostu do indeksu tablicowego.
Myślę, że łatwiej jest to zrozumieć, jeśli spróbujesz tego na rzeczywistej maszynie, niż wyjaśnić to na piśmie. Załóżmy na przykład, że operujesz dwoma palcami, "palcem wskazującym" i "środkowym palcem", a najpierw dotykasz palcem wskazującym.
Ryc. 5: Dotknij palcem wskazującym
Jak pokazano na ekranie, indeks będzie miał wartość "0". Następnie dotknij go środkowym palcem.
Ryc. 6: Dotyk środkowego palca
W tym stanie dotykasz dwoma palcami, więc wyświetlane są dwie informacje. Wskaźnik dotykany środkowym palcem to "1".
Podnieśmy tutaj palec wskazujący. Następnie informacje o dotyku będą wyglądać następująco.
Ryc. 7: Zwolnij palec wskazujący
Jak być może już zauważyłeś, indeks informacji, których dotykasz środkowym palcem, to "0". Jeśli zarządzasz postacią według indeksu podczas jej przesuwania, powyższa operacja doprowadzi do następujących działań.
・ Przesuń znak "A" palcem wskazującym
↓
・ Przesuń znak "B" środkowym palcem w tym stanie.
↓
・ Zwolnij palec wskazujący, przesuwając postać środkowym palcem
↓
・ Postać kontrolowana środkowym palcem nagle przełącza się na "A"
Innym zjawiskiem jest to, że jeśli wielokrotnie zwolnisz lub dotkniesz jednego z dwóch palców podczas ich dotykania, tekst rysunku pierwszej informacji o dotyku może migotać. Dzieje się tak dlatego, że drugi palec przerywa indeks "0" w momencie dotknięcia lub zwolnienia.
Jak wspomniano powyżej, indeks i kolejność informacji dotykowych podczas wielodotyku nie są zgodne z kolejnością, w jakiej są dotykane. Dlatego jeśli chcesz wykonać jakiekolwiek operacje, nie zarządzaj nimi w indeksie TouchCollection.
To, co powinno być zarządzane, to to, że struktura "TouchLocation" ma właściwość "Id", a Id jest przepisywany z nową wartością za każdym razem, gdy jest dotykany, ale relacja między punktem kontaktu a identyfikatorem jest gwarantowana podczas dotykania, więc będziemy nim zarządzać.
Oczywiście nie oznacza to, że musisz zarządzać nim za pomocą identyfikatora, aw niektórych przypadkach wystarczy sama pozycja dotykowa. Na przykład, jeśli tylko dotkniesz przycisku na ekranie, możesz określić, że przycisk został naciśnięty, sprawdzając pozycję dotyku niezależnie od identyfikatora. Jednak przy włączaniu przetwarzania przeciągania pozycja zawsze się zmienia, więc myślę, że nadal powinna być określana przez ID.
Program - O czym należy pamiętać podczas uzyskiwania informacji o dotyku 2 (liczba uzyskanych informacji o dotyku)
Chociaż nie jest to zawarte w programie artykułu, próbka rysuje ciąg "GetMaxTouchCount" u dołu ekranu i "maksymalną liczbę informacji o dotyku uzyskanych w tym samym czasie". Wyświetlała maksymalną liczbę informacji dotykowych uzyskanych przez metodę "TouchPanel.GetState" w przeszłości, ale na tym komputerze testowym właściwość "TouchPanelCapabilities.MaximumTouchCount" wynosi 4, więc maksymalna wyświetlana tutaj wartość powinna zwykle wynosić 4. Jeśli położysz na nim pięć palców, nadal będzie to 4.
Rysunek 8: Liczba pięciu palców
Zróbmy mały eksperyment. Spróbuj powtórzyć panel dotykowy wieloma palcami z dużą szybkością. To zależy od maszyny testowej, ale liczba może przekroczyć 4, zanim się zorientujesz.
Rysunek 9: Wartość parametru GetMaxTouchCount jest większa niż 4
W rzeczywistości informacje dotykowe uzyskane przez metodę "TouchPanel.GetState" nie są informacjami dotykowymi w momencie wywołania metody "TouchPanel.GetState", ale moment, w którym go dotkniesz i w momencie zwolnienia go z ostatniego czasu aktualizacji, są buforowane. Dlatego nawet jeśli można wykryć do czterech dotknięć w tym samym czasie, ponowne dotknięcie tego samego palca jest traktowane jako oddzielny dotyk, więc można uzyskać więcej informacji o dotyku niż TouchPanelCapabilities.MaximumTouchCount.
Dlatego nawet jeśli TouchPanelCapabilities.MaximumTouchCount wynosi 4, jeśli liczba elementów tablicy danych związanych z dotykiem jest ustalona przez 4, może wystąpić błąd nadwyżki indeksu w zależności od metody przetwarzania.
Nawiasem mówiąc, w pomocy XNA Game Studio maksymalna wartość właściwości TouchCollection.Count jest opisana jako "8", więc jeśli chcesz naprawić liczbę elementów w tablicy, powinieneś ustawić liczbę elementów na co najmniej 8. (Jeśli myślisz o przyszłych aktualizacjach wersji, możesz dołączyć klauzulę ochronną, aby indeks nie został przekroczony).
Podsumowanie tej próbki
Tym razem zbadaliśmy różne parametry informacji uzyskanych z multi-touch. Potwierdziliśmy również, że istnieją pewne punkty, o których należy pamiętać przy pozyskiwaniu informacji z panelu dotykowego. Opierając się na tej wiedzy, chciałbym wyjaśnić próbkę, która faktycznie wykorzystuje multi-touch.