Touchinteraktionen in der Spieleentwicklung für Windows Phone 7, Teil 3 Ziehen von Vorgängen

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Programmieren! - 3.Versuchen Sie, die Karte auf die Berührung zu bewegen

Informationen zu diesem Beispiel

Dieses Mal möchte ich ein Progran erstellen, das vier Karten auf den Bildschirm legt und die Karten an die Stelle legt und zieht, an der sie berührt werden. Dies ist eine Multi-Touch-Version des Programms, das zuerst ein Sprite mit der Mausklasse gezogen hat. Bis jetzt gab es viele Erklärungen, daher möchte ich diesmal hauptsächlich über das Programm erklären.

Ziele dieses Beispielprogramms

Ziehen Sie mehrere Karten gleichzeitig, während Sie mit Multi-Touch berühren.

図 1 :マルチタッチによるドラッグ操作
Abbildung 1: Multitouch-Ziehvorgang

Programm - Kartenklassen

Wenn es um Multi-Touch geht, wird es notwendig, mehrere Objekte zu haben, daher möchte ich hier eine "Card" -Klasse mit dem Sprite erstellen, das als "Karte" verschoben werden soll.

/// <summary>
/// ドラッグできるカード
/// </summary>
public class Card
{
  /// <summary>
  /// タッチ ID
  /// </summary>
  public int Id { get; set; }

  /// <summary>
  /// カードの位置
  /// </summary>
  public Vector2 Position { get; set; }

  /// <summary>
  /// カードの色
  /// </summary>
  public Color Color { get; set; }
}

Um den Code nicht zu kompliziert zu machen, hat die Kartenklasse drei Eigenschaften: Touch ID, Position und Farbe. Es gibt kein bestimmtes Element, um ins Detail zu gehen, aber "Touch ID" wird verwendet, um zu überprüfen, welcher Touchpoint verknüpft ist.

Programm - Deklarieren von Feldern

Es gibt nichts Neues, außer eine Reihe von Kartenklassen zu haben, um Karteninformationen zu speichern. Dieses Mal ist es wie eine Anwendung der vorherigen Beispiele. Ich habe vier Karten gemacht, jede mit einer anderen Farbe, so dass man den Unterschied beim Zeichnen sehen kann.

/// <summary>
/// テクスチャー
/// </summary>
Texture2D texture;

/// <summary>
/// カードの一覧(4 枚分)
/// </summary>
Card[] cards = new Card[]
{
  new Card { Color = Color.White, },
  new Card { Color = Color.Yellow, },
  new Card { Color = Color.Fuchsia, },
  new Card { Color = Color.Aqua, },
};

Programmgesteuert - Abrufen von Touch-Informationen

Innerhalb der Game.Update-Methode. Dieser Bereich ist formelhaft, also gibt es nichts besonders Neues.

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

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

  //   :
  // ここに処理
  //   :
}

Programm - Verknüpfen Sie eine Touch ID mit einer Karte, wenn sie berührt wird

Im Beispielprogramm ist die Reihenfolge aus Sicht der Verarbeitungskosten umgekehrt, aber es ist leichter zu verstehen, wenn Sie es von hier aus erklären, also werde ich dies zuerst erklären.

Durchlaufen Sie zunächst die erworbene TouchCollection foreach, um die einzelnen Informationen zu erhalten.

/// タッチ情報の処理を行う
foreach (TouchLocation tl in touches)
{
  // タッチ状態を調べる
  switch (tl.State)
  {
    case TouchLocationState.Pressed:
      // タッチされた瞬間は空いているカードを検索して紐づける
      Card card = cards.Where(c => c.Id == 0).FirstOrDefault();
      if (card != null)
      {
          card.Id = tl.Id;
          card.Position = tl.Position;
      }
      break;
  }
}

Überprüfen Sie die Eigenschaft "TouchLocation.State", um anzugeben, dass "TouchLocationState.Pressed" der Moment ist, in dem Sie sie berührt haben.

Wenn in diesem Beispiel die ID der Karte "0" lautet, wird sie als nicht verwendet definiert, also "Karten. Dabei gilt(c => c.Id == 0). FirstOrDefault()" , um nach einer Karte mit der ID 0 aus der Liste der Karten zu suchen und diese Karte abzurufen, falls sie gefunden wird. Wenn nicht gefunden, wird null zurückgegeben. Hier werden Erweiterungsmethoden von LINQ aufgerufen, um den Code zu vereinfachen, aber wenn Sie Bedenken hinsichtlich der Verarbeitungskosten haben, können Sie nacheinander mit einer for-Schleife nach ihnen suchen.

Wenn Sie die Karte gefunden haben, legen Sie die Touch-ID und die Touch-Position auf der Karte fest.

Programm - Handhabung von Karten während der Berührung und beim Loslassen

Halten Sie die Karte immer in einem Ziehzustand, während Sie sie berühren, und wenn Sie sie loslassen, wird sie vom Berührungspunkt zur Karte getrennt.

// 各カードの情報を調べる
foreach (Card card in cards)
{
  if (card.Id != 0)
  {
    // 紐づくタッチ情報がまだ存在するか ID で検索
    TouchLocation tl;
    if (touches.FindById(card.Id, out tl) == true)
    {
      // まだタッチされている場合は位置情報取得
      card.Position = tl.Position;
    }
    else
    {
      // すでにタッチ情報がなかったら紐付を外す
      card.Id = 0;
    }
  }
}

Schleifen Sie die Kartenliste mit foreach, und verarbeiten Sie jede Karte. Wenn die ID anders als 0 ist, wird sie mit dem Touchpoint verknüpft und der Prozess wird fortgesetzt.

Die TouchCollection-Struktur stellt eine "FindById"-Methode bereit, mit der Sie die Fingereingabeinformationen für die angegebene ID abrufen können, sofern eine vorhanden ist. Wenn die Card.Id Eigenschaft nicht 0 ist, können wir davon ausgehen, dass sie einem Berührungspunkt zugeordnet ist, daher versuchen wir, die Fingereingabeinformationen mit der FindById-Methode abzurufen.

Wenn die FindById-Methode true zurückgibt, befindet sie sich immer noch im Fingereingabezustand, rufen Sie also die Touchposition aus der TouchLocation.Position-Eigenschaft ab, und legen Sie sie in der Kartenklasse fest. Wenn die FindById-Methode false zurückgibt, wird die Toucheingabe freigegeben, also legen Sie Card.ID auf 0 fest, und legen Sie sie fest, da niemand sie berührt.

Programm - Zeichenkarten

Die Parameter, die zum Zeichnen benötigt werden, sollten bereits auf die Kartenklasse eingestellt sein, es gibt also nichts Neues.

// スプライトの描画準備
spriteBatch.Begin();

// 各カードを描画
foreach (Card card in cards)
{
  spriteBatch.Draw(texture, card.Position, card.Color);
}

// スプライトの一括描画
spriteBatch.End();

Zusammenfassung dieses Beispiels

Dieses Mal habe ich versucht, ein Bildprogramm zu erstellen, das Multi-Touch verwendet, um Objekte im Spiel tatsächlich zu bewegen. Wir beobachteten auch, dass, wenn mehrere Karten gleichzeitig mit der ID der Touch-Informationen gezogen wurden, die Bewegung der Karten konsistent war, auch wenn der andere Finger angehoben oder erneut berührt wurde.

Dieses Beispiel ist nur ein Beispiel und es wird nur eine einfache Verarbeitung durchgeführt. Der grundlegende Teil der Multi-Touch-Bedienung durch das Touchpanel sollte jedoch durch die eigentliche Spielprogrammierung abgedeckt werden, also wenden Sie es bitte auf die Multi-Touch-Verarbeitung an, die zu Ihrem Spiel passt.