Touchinteraktionen in der Spieleentwicklung für Windows Phone 7 Part 2 Multitouch

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Programmieren! - 2.Versuchen Sie Multi-Touch

Informationen zu diesem Beispiel

Hier möchte ich das Programm zur Realisierung von Multitouch-Eingaben erläutern. In Windows Phone 7 ist die Multitoucheingabe über das Touchpanel eines der wichtigsten Elemente für Benutzereingaben. Dies liegt daran, dass im Gegensatz zu Windows und Xbox 360 die Haupteingabeschnittstelle das "Touchpanel" ist. Es mag Windows-Telefone mit Tastaturen geben, aber natürlich haben sie sie nicht immer. Damit das Spiel auf jedem Windows Phone funktioniert, muss es Touch-fähig sein.

Wenn Sie das Touchpanel nur auf "Single Touch" beschränken, sind die Arten von Spielen, die erstellt werden können, unweigerlich begrenzt, wenn es darum geht, Spiele zu erstellen. Denken Sie an eine Handheld-Spielkonsole (Sie können sie stationär lassen). Bei den meisten Spielkonsolen müssen Sie den Gamecontroller (oder die eigentliche Konsole) mit beiden Händen halten und mehrere Tasten gleichzeitig drücken.

Windows Phone 7 hat nicht so viele Tasten wie Gamecontroller, und es hat nicht unbedingt eine Tastatur. Daher können virtuelle Tasten und Tasten auf dem Bildschirm platziert werden, und beim Drücken ist es unpraktisch, da sie nicht gleichzeitig mit nur einer einzigen Berührung gedrückt werden können.

Zusätzlich zu dem obigen Beispiel für virtuelle Tasten ist Multi-Touch natürlich für Spiele erforderlich, bei denen mehrere Personen einen Bildschirm bedienen, z. B. "Zusammendrücken und Strecken (zwei Punkte näher oder weiter auseinander bewegen)", was bei Multi-Touch üblich ist.

Übrigens ist die Einführung lang, aber in diesem Beispiel möchte ich Multi-Touch-Informationen mithilfe einer Klasse für Touchpanels erfassen. Es macht Spaß, ein Sample zu erstellen, das plötzlich mit Multi-Touch abgespielt werden kann, aber zuerst möchte ich herausfinden, welche Art von Informationen mit Multi-Touch erhalten werden können. Es gibt einige Gewohnheiten, so dass Sie, wenn Sie sie zuerst kennen, die Zeit reduzieren können, die Sie für die Untersuchung der Ursache aufwenden, z. B. wenn es später bei der Programmierung nicht gut funktioniert.

Ziele dieses Beispielprogramms

Zeigen Sie die Informationen an und bestätigen Sie sie, wenn Multi-Touch ausgeführt wird.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Abbildung 1: Fingereingabeinformationen werden bei Berührung als Text angezeigt

Programm - Deklarieren von Feldern

Die Felder müssen mit TouchPanelCapabilities-Struktur und TouchCollection-Struktur beschriftet sein.

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

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

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

Die "TouchPanelCapabilities-Struktur" ist eine Struktur, die die Funktionen des Touchpanels selbst als Parameter haben kann. Es wird verwendet, um zu überprüfen, ob das Touchpanel während der Aktualisierung verwendet werden kann.

Die TouchCollection-Struktur enthält eine Liste mit Informationen zum aktuell berührten Zustand. Werden mehrere Berührungen erkannt, können mehrere "TouchLocation-Strukturen" abgerufen werden. Dazu später mehr.

Programm - Schriften laden

Bevor Sie Text auf dem Bildschirm zeichnen, fügen Sie dem Inhaltsprojekt die Schriftartdefinition hinzu, und laden Sie sie mit der Game.LoadContent-Methode. Dies steht nicht in direktem Zusammenhang mit Touchpanels, daher werde ich auf eine detaillierte Erklärung verzichten.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Abbildung 2: Hinzufügen von "Font.spritefont" zum Inhaltsprojekt

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

Programm - Touchpanel-Informationen abrufen

Rufen Sie die Touchpanelinformationen in der Game.Update-Methode ab.

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

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

Sie können die Methode "TouchPanel.GetCapabilities" aufrufen, um die Funktionsinformationen des Touchpanels abzurufen. Es gibt zwei Arten von Informationen, die erfasst werden können: "Kann das Touchpanel verwendet werden?" und "Maximale Anzahl von Touchpoints, die vom Touchpanel erfasst werden können". Keiner von ihnen ändert sich während des Spiels, daher denke ich, dass es kein Problem gibt, wenn Sie es nach der Game.Initialize-Methode erhalten, aber in Zukunft erscheinen Geräte, die das Touchpanel entfernen können (Touchpanel, das an USB oder andere tatsächliche Geräte als Windows Phone angeschlossen werden kann), und es wird in der Update-Methode beschrieben.

Es muss auch nicht überprüft werden, ob das Touchpanel verwendet werden kann, da es immer unter Windows Phone 7 verwendet werden kann, aber beim Teilen von Code mit Windows und Xbox 360 sind diese Hardware keine erforderlichen Eingabeschnittstellen und müssen überprüft werden.

Wenn Sie bestätigen können, dass das Touchpanel in der Eigenschaft "TouchPanelCapabilities.IsConnected" verfügbar ist, ruft die Methode "TouchPanel.GetState" den aktuellen Fingereingabestatus ab.

Ursprünglich wird ein Teil der Vorgangsverarbeitung nach dem Abrufen von Fingereingabeinformationen ausgeführt, aber in diesem Beispiel werden Informationen nur angezeigt, sodass in der Game.Update-Methode keine weitere Verarbeitung erfolgt.

Programm - Erhalten Sie die maximale Anzahl von Touchpoints, die Sie erhalten können

Die maximale Anzahl von Touchpoints, die abgerufen werden können, ist ungefähr festgelegt, so dass es nicht oft notwendig ist, sie während des Spiels abzurufen, aber Sie können die maximale Anzahl von Touchpoints abrufen, die von der TouchPanelCapabilities.MaximumTouchCount-Eigenschaft abgerufen werden können. Wenn die MaximumTouchCount-Eigenschaft beispielsweise "4" ist, können Sie die Informationen zur fünften Position nicht abrufen, indem Sie das Touchpanel mit fünf Fingern berühren.

Die Anzahl der Akquisitionen für das Smartphone "HTC 7 Trophy", das in diesem Beispiel verwendet wurde, war "4". (XNA Game Studio 4.0 ist übrigens so definiert, dass immer 4 zurückgegeben wird.) Die Windows Phone 7-Spezifikation besagt, dass es mehr als 4 Punkte sind, also nicht weniger als 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Abbildung 3: Anzahl des Abrufs der TouchPanelCapabilities.MaximumTouchCount-Eigenschaft

Programm - Abrufen von Touch-Informationen

Die abgerufene TouchCollection-Struktur enthält mehrere Touch-Informationen. Wenn Sie beispielsweise mit zwei Fingern berühren, enthält es normalerweise zwei Berührungen.

Die Anzahl der Fingereingabeinformationen kann in der TouchCollection.Count-Eigenschaft abgerufen werden. Fingereingabeinformationen werden in der for-Anweisung wiederholt angezeigt, so oft sie abgerufen wurden. Ursprünglich gibt es kein Problem, mit Foreach zu schleifen, aber da wir den Array-Index (int-Index) in der späteren Erklärung verwenden werden, schleifen wir ihn mit 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);
}

Jetzt wird jede Touch-Information als "TouchLocation"-Struktur abgerufen. Wenn es eine Schleife mit for ist, kann es mit "TouchCollection[index]" abgerufen werden. (Sie können die "TouchLocation" -Struktur auch direkt im Forach erhalten.)

Die folgenden vier Arten von Informationen können aus der "TouchLocation"-Struktur abgerufen werden, und jede Information wird im Beispiel angezeigt.

Wenn Sie es tatsächlich ausführen, werden die Touch-Informationen wie unten gezeigt angezeigt. Da Sie sich mit drei Fingern berühren, können Sie drei Berührungen sehen. Übrigens, wenn Sie mit fünf Fingern berühren, sehen Sie nur bis zu vier. (Weil die maximale Anzahl der Akquisitionen 4 ist)

図 4 :3 本の指でタッチしているところ
Abbildung 4: Berühren mit drei Fingern

Programm - Dinge, auf die Sie beim Abrufen von Touch-Informationen achten sollten 1 (Index und ID)

Ich habe oben erwähnt, dass es Dinge zu beachten gibt, wenn man mit Touch-Informationen umgeht, aber das erste ist "Index" und "ID". Ein Index verweist einfach auf einen Arrayindex.

Ich denke, es ist einfacher zu verstehen, wenn man es an einer echten Maschine ausprobiert, als es schriftlich zu erklären. Nehmen wir zum Beispiel an, Sie arbeiten mit zwei Fingern, "Zeigefinger" und "Mittelfinger", und berühren zuerst mit Ihrem Zeigefinger.

図 5 :人差し指でタッチ
Abbildung 5: Berührung mit Zeigefinger

Wie auf dem Bildschirm angezeigt, ist der Index "0". Dann berühren Sie es mit Ihrem Mittelfinger.

図 6 :中指でタッチ
Abbildung 6: Mittelfingerberührung

In diesem Zustand berühren Sie sich mit zwei Fingern, sodass zwei Informationen angezeigt werden. Der mit dem Mittelfinger berührte Zeigefinger ist "1".

Lassen Sie uns hier unseren Zeigefinger heben. Dann sehen die Touch-Informationen wie folgt aus.

図 7 :人差し指を放す
Abbildung 7: Loslassen des Zeigefingers

Wie Sie vielleicht schon bemerkt haben, ist der Index der Informationen, die Sie mit Ihrem Mittelfinger berühren, "0". Wenn Sie das Zeichen beim Verschieben nach Index verwalten, führt der obige Vorgang zu den folgenden Aktionen.

・ Bewegen Sie das Zeichen "A" mit dem Zeigefinger

・ Bewegen Sie das Zeichen "B" mit dem Mittelfinger in diesem Zustand.

・ Lassen Sie den Zeigefinger los, während Sie den Charakter mit dem Mittelfinger bewegen

・ Das Zeichen, das mit dem Mittelfinger gesteuert wird, wechselt plötzlich zu "A"

Ein weiteres Phänomen ist, dass, wenn Sie einen der beiden Finger wiederholt loslassen oder berühren, während Sie sie berühren, der Zeichentext der ersten Berührungsinformation flackern kann. Dies liegt daran, dass der zweite Finger den Index "0" in dem Moment unterbricht, in dem Sie ihn berühren oder loslassen.

Wie oben erwähnt, stimmen der Index und die Reihenfolge der Touch-Informationen bei Multi-Touch nicht mit der Reihenfolge überein, in der sie berührt werden. Wenn Sie daher Vorgänge ausführen möchten, verwalten Sie diese nicht im TouchCollection-Index.

Was verwaltet werden sollte, ist, dass die "TouchLocation" -Struktur eine "Id" -Eigenschaft hat, und die ID wird jedes Mal mit einem neuen Wert neu geschrieben, wenn sie berührt wird, aber die Beziehung zwischen dem Touchpoint und der ID ist beim Berühren garantiert, also werden wir es verwalten.

Dies bedeutet natürlich nicht, dass Sie es per ID verwalten müssen, und in einigen Fällen reicht die Touch-Position allein aus. Wenn Sie beispielsweise nur eine Taste auf dem Bildschirm berühren, können Sie feststellen, dass Sie eine Taste gedrückt haben, indem Sie die Touch-Position unabhängig von der ID überprüfen. Bei der Einbeziehung der Drag-Verarbeitung ändert sich die Position jedoch immer, daher denke ich, dass sie immer noch durch die ID bestimmt werden sollte.

Programm - Dinge, die beim Erfassen von Touch-Informationen zu beachten sind 2 (Anzahl der erfassten Touch-Informationen)

Obwohl es nicht im Programm des Artikels enthalten ist, zeichnet das Beispiel die Zeichenfolge "GetMaxTouchCount" am unteren Bildschirmrand und "die maximale Anzahl der gleichzeitig erfassten Touchinformationen". Dadurch wurde in der Vergangenheit die maximale Anzahl von Fingereingabeinformationen angezeigt, die von der Methode "TouchPanel.GetState" erfasst wurden, aber in diesem Testcomputer ist die Eigenschaft "TouchPanelCapabilities.MaximumTouchCount" 4, sodass der hier angezeigte Höchstwert normalerweise 4 betragen sollte. Wenn Sie fünf Finger darauf legen, sind es immer noch 4.

図 8 :5 本の指を置いたときの数値
Abbildung 8: Fünf-Finger-Zahl

Lassen Sie uns ein kleines Experiment machen. Versuchen Sie, das Touchpanel mit mehreren Fingern mit hoher Geschwindigkeit zu wiederholen. Es hängt von der Testmaschine ab, aber die Anzahl kann 4 überschreiten, bevor Sie es wissen.

図 9 :GetMaxTouchCount が 4 を超えている
Abbildung 9: GetMaxTouchCount ist größer als 4

Tatsächlich sind die von der "TouchPanel.GetState"-Methode abgerufenen Fingereingabeinformationen nicht die Fingereingabeinformationen zum Zeitpunkt des Aufrufs der "TouchPanel.GetState"-Methode, sondern der Moment, in dem Sie sie berühren, und der Moment, in dem Sie sie vom letzten Aktualisierungszeitpunkt freigeben, werden zwischengespeichert. Obwohl bis zu vier Berührungen gleichzeitig erkannt werden können, wird das erneute Berühren desselben Fingers als separate Berührung behandelt, sodass mehr Fingereingabeinformationen abgerufen werden können als TouchPanelCapabilities.MaximumTouchCount.

Selbst wenn TouchPanelCapabilities.MaximumTouchCount auf 4 festgelegt ist, kann daher je nach Verarbeitungsmethode ein Indexüberschreitungsfehler auftreten, wenn die Anzahl der Arrayelemente von Touchdaten durch 4 festgelegt ist.

Übrigens wird in Hilfe von XNA Game Studio der maximale Wert der TouchCollection.Count-Eigenschaft als "8" beschrieben, wenn Sie also die Anzahl der Elemente im Array festlegen möchten, sollten Sie die Anzahl der Elemente auf mindestens 8 festlegen. (Wenn Sie über zukünftige Versionsupgrades nachdenken, sollten Sie eine Schutzklausel einfügen, damit der Index nicht überschritten wird.)

Zusammenfassung dieses Beispiels

Dieses Mal haben wir verschiedene Parameter auf die Informationen aus Multi-Touch untersucht. Wir haben auch bestätigt, dass es einige Punkte gibt, die bei der Erfassung von Touchpanel-Informationen zu beachten sind. Basierend auf diesem Wissen möchte ich ein Beispiel erklären, das tatsächlich Multi-Touch verwendet.