Αλληλεπιδράσεις αφής στην ανάπτυξη παιχνιδιών για Windows Phone 7, Μέρος 3 Λειτουργίες μεταφοράς

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Προγραμματισμός! - 3.Δοκιμάστε να μετακινήσετε την κάρτα στην αφή

Πληροφορίες για αυτό το δείγμα

Αυτή τη φορά, θα ήθελα να δημιουργήσω ένα progran που τοποθετεί τέσσερις κάρτες στην οθόνη και τοποθετεί και σύρει τις κάρτες στο σημείο όπου αγγίζονται. Αυτή είναι μια έκδοση πολλαπλής αφής του προγράμματος που έσυρε για πρώτη φορά ένα αντικείμενο με την κλάση Mouse. Μέχρι τώρα, υπήρξαν πολλές εξηγήσεις, οπότε αυτή τη φορά θα ήθελα να εξηγήσω κυρίως για το πρόγραμμα.

Στόχοι αυτού του δείγματος προγράμματος

Σύρετε πολλές κάρτες ταυτόχρονα με την επαφή με την τεχνολογία πολλαπλής αφής.

図 1 :マルチタッチによるドラッグ操作
Εικόνα 1: Λειτουργία μεταφοράς πολλαπλής αφής

Πρόγραμμα - Μαθήματα Καρτών

Όταν πρόκειται για multi-touch, είναι απαραίτητο να έχουμε πολλά αντικείμενα, οπότε εδώ θα ήθελα να δημιουργήσω μια κλάση "Card" με το αντικείμενο να μετακινείται ως "κάρτα".

/// <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; }
}

Για να μην γίνει ο κώδικας πολύ περίπλοκος, η κλάση κάρτας έχει τρεις ιδιότητες: αναγνωριστικό αφής, θέση και χρώμα. Δεν υπάρχει συγκεκριμένο στοιχείο για λεπτομέρειες, αλλά το "Touch ID" χρησιμοποιείται για να ελέγξει ποιο σημείο επαφής συνδέεται.

Πρόγραμμα - Δήλωση Πεδίων

Δεν υπάρχει τίποτα νέο σε αυτό εκτός από την ύπαρξη μιας σειράς κλάσεων καρτών για τη διατήρηση πληροφοριών κάρτας. Αυτή τη φορά, είναι σαν μια εφαρμογή των προηγούμενων δειγμάτων. Έφτιαξα τέσσερις κάρτες, η καθεμία με διαφορετικό χρώμα, ώστε να μπορείτε να δείτε τη διαφορά όταν σχεδιάζετε.

/// <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, },
};

Μέσω προγραμματισμού - Λήψη πληροφοριών αφής

Μέσα στη μέθοδο Game.Update. Αυτός ο τομέας είναι τυποποιημένος, οπότε δεν υπάρχει τίποτα ιδιαίτερα νέο.

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

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

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

Πρόγραμμα - Συνδέστε ένα αναγνωριστικό αφής σε μια κάρτα όταν αγγίζετε

Στο δείγμα προγράμματος, η σειρά αντιστρέφεται από την άποψη του κόστους επεξεργασίας, αλλά είναι ευκολότερο να το καταλάβετε αν το εξηγήσετε από εδώ, οπότε θα το εξηγήσω πρώτα.

Αρχικά, περάστε από το αποκτηθέν touchcollection foreach για να λάβετε κάθε πληροφορία.

/// タッチ情報の処理を行う
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;
  }
}

Ελέγξτε την ιδιότητα "TouchLocation.State" για να υποδείξετε ότι το "TouchLocationState.Pressed" είναι η στιγμή που το αγγίξατε.

Σε αυτό το δείγμα, εάν το αναγνωριστικό της κάρτας είναι "0", ορίζεται ως μη χρησιμοποιούμενο, επομένως "κάρτες". Όπου(c => c.Id == 0). FirstOrDefault()" για να αναζητήσετε μια κάρτα με αναγνωριστικό 0 από τη λίστα καρτών και να ανακτήσετε αυτήν την κάρτα εάν βρεθεί. Εάν δεν βρεθεί, επιστρέφεται το null. Εδώ, οι μέθοδοι επέκτασης καλούνται από την LINQ για να απλοποιήσουν τον κώδικα, αλλά αν ανησυχείτε για το κόστος επεξεργασίας, μπορείτε να τις αναζητήσετε μία προς μία με βρόχο for.

Όταν βρείτε την κάρτα, ορίστε το αναγνωριστικό αφής και τη θέση αφής στην κάρτα.

Πρόγραμμα - χειρισμός καρτών κατά την αφή και όταν απελευθερώνονται

Διατηρήστε την κάρτα σε κατάσταση μεταφοράς ανά πάσα στιγμή ενώ την αγγίζετε και όταν την αφήσετε, θα αποσυνδεθεί από το σημείο επαφής στην κάρτα.

// 各カードの情報を調べる
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;
    }
  }
}

Επαναλάβετε τη λίστα καρτών με το μπροστινό μέρος και επεξεργαστείτε κάθε κάρτα. Εάν το αναγνωριστικό είναι οτιδήποτε άλλο εκτός από 0, συνδέεται με το σημείο επαφής και η διαδικασία συνεχίζεται.

Η δομή TouchCollection παρέχει μια μέθοδο "FindById" που σας επιτρέπει να ανακτήσετε τις πληροφορίες αφής για το καθορισμένο αναγνωριστικό, εάν υπάρχει. Εάν η ιδιότητα Card.Id δεν είναι 0, μπορούμε να υποθέσουμε ότι σχετίζεται με κάποιο σημείο αφής, οπότε θα προσπαθήσουμε να λάβουμε τις πληροφορίες αφής με τη μέθοδο FindById.

Εάν η μέθοδος FindById επιστρέψει true, εξακολουθεί να βρίσκεται σε κατάσταση αφής, επομένως λάβετε τη θέση αφής από την ιδιότητα TouchLocation.Position και ορίστε την στην κλάση κάρτας. Εάν η μέθοδος FindById επιστρέψει false, το άγγιγμα απελευθερώνεται, οπότε ορίστε Card.ID σε 0 και ορίστε το όπως κανείς δεν το αγγίζει.

Πρόγραμμα - Κάρτες Σχεδίασης

Οι παράμετροι που απαιτούνται για τη σχεδίαση θα πρέπει να έχουν ήδη οριστεί στην κλάση Card, οπότε δεν υπάρχει τίποτα νέο.

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

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

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

Περίληψη του δείγματος

Αυτή τη φορά, προσπάθησα να δημιουργήσω ένα πρόγραμμα εικόνας που χρησιμοποιεί multi-touch για να μετακινήσει πραγματικά αντικείμενα στο παιχνίδι. Παρατηρήσαμε επίσης ότι όταν σέρνονταν πολλές κάρτες ταυτόχρονα χρησιμοποιώντας την ταυτότητα των πληροφοριών αφής, η κίνηση των καρτών ήταν συνεπής ακόμη και αν το άλλο δάχτυλο σηκώθηκε ή άγγιξε ξανά.

Αυτό το δείγμα είναι απλώς ένα δείγμα και πραγματοποιείται μόνο απλή επεξεργασία. Ωστόσο, το βασικό μέρος της λειτουργίας πολλαπλής αφής από την οθόνη αφής θα πρέπει να καλύπτεται από τον πραγματικό προγραμματισμό του παιχνιδιού, οπότε εφαρμόστε το στην επεξεργασία πολλαπλής αφής που ταιριάζει στο παιχνίδι σας με βάση αυτό.