Αλληλεπιδράσεις αφής στην ανάπτυξη παιχνιδιών για Windows Phone 7 Μέρος 2 Πολλαπλής αφής

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

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

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

Εδώ, θα ήθελα να εξηγήσω το πρόγραμμα για την πραγματοποίηση εισόδου πολλαπλής αφής. Στο Windows Phone 7, η είσοδος πολλαπλής αφής μέσω της οθόνης αφής είναι ένα από τα πιο σημαντικά στοιχεία για την εισαγωγή στοιχείων από το χρήστη. Αυτό συμβαίνει επειδή, σε αντίθεση με τα Windows και το Xbox 360, η κύρια διεπαφή εισόδου είναι η "οθόνη αφής". Μπορεί να υπάρχουν τηλέφωνα Windows με πληκτρολόγια, αλλά φυσικά δεν τα έχουν πάντα. Έτσι, για να λειτουργήσει το παιχνίδι σε οποιοδήποτε Windows Phone, πρέπει να έχει δυνατότητα αφής.

Εάν περιορίσετε την οθόνη αφής μόνο σε "ένα άγγιγμα", οι τύποι παιχνιδιών που μπορούν να γίνουν θα είναι αναπόφευκτα περιορισμένοι όταν πρόκειται για τη δημιουργία παιχνιδιών. Σκεφτείτε μια φορητή κονσόλα παιχνιδιών (μπορείτε να την αφήσετε ακίνητη). Οι περισσότερες κονσόλες παιχνιδιών απαιτούν να κρατάτε το χειριστήριο παιχνιδιών (ή την πραγματική κονσόλα) και με τα δύο χέρια και να πιέζετε πολλά κουμπιά ταυτόχρονα.

Το Windows Phone 7 δεν διαθέτει τόσα κουμπιά όσα τα χειριστήρια παιχνιδιών και δεν διαθέτει απαραίτητα πληκτρολόγιο. Επομένως, εικονικά πλήκτρα και κουμπιά μπορούν να τοποθετηθούν στην οθόνη και όταν τα πιέζετε, είναι ενοχλητικό επειδή δεν μπορούν να πατηθούν ταυτόχρονα με ένα μόνο άγγιγμα.

Φυσικά, εκτός από το παραπάνω παράδειγμα εικονικού κουμπιού, το multi-touch είναι απαραίτητο για παιχνίδια όπου πολλά άτομα χειρίζονται μία οθόνη, όπως "τσίμπημα και τέντωμα (μετακίνηση δύο σημείων πιο κοντά ή πιο μακριά)" που είναι συνηθισμένο στο multi-touch.

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

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

Εμφανίστε και επιβεβαιώστε τις πληροφορίες όταν εκτελείται πολλαπλή αφή.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Εικόνα 1: Οι πληροφορίες αφής εμφανίζονται ως κείμενο όταν αγγίζονται

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

Τα πεδία πρέπει να φέρουν την ετικέτα Δομή TouchPanelCapabilities και Δομή συλλογής αφής.

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

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

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

Η "δομή TouchPanelCapabilities" είναι μια δομή που μπορεί να έχει τις λειτουργίες της ίδιας της οθόνης αφής ως παραμέτρους. Χρησιμοποιείται για να ελέγξετε αν η οθόνη αφής μπορεί να χρησιμοποιηθεί κατά την ενημέρωση.

Η δομή TouchCollection περιέχει μια λίστα πληροφοριών σχετικά με την κατάσταση που αγγίζετε τη συγκεκριμένη στιγμή. Εάν εντοπιστούν πολλά αγγίγματα, μπορούν να ανακτηθούν πολλαπλές "δομές TouchLocation". Περισσότερα για αυτό αργότερα.

Πρόγραμμα - Φόρτωση γραμματοσειρών

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

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Φιγούρα 2: Πρόσθεσε το "Font.spritefont" στο έργο περιεχομένου σου

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

Πρόγραμμα - Λήψη πληροφοριών οθόνης αφής

Λάβετε τις πληροφορίες της οθόνης αφής μέσα στη μέθοδο Game.Update.

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

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

Μπορείτε να καλέσετε τη μέθοδο "TouchPanel.GetCapabilities" για να λάβετε τις πληροφορίες λειτουργίας της οθόνης αφής. Υπάρχουν δύο τύποι πληροφοριών που μπορείτε να αποκτήσετε: "Μπορεί να χρησιμοποιηθεί η οθόνη αφής;" και "Μέγιστος αριθμός σημείων επαφής που μπορούν να αποκτηθούν από την οθόνη αφής". Κανένας από αυτούς δεν αλλάζει κατά τη διάρκεια του παιχνιδιού, οπότε νομίζω ότι δεν υπάρχει πρόβλημα αν το πάρετε σύμφωνα με τη μέθοδο Game.Initialize, αλλά στο μέλλον εμφανίζονται συσκευές που μπορούν να αφαιρέσουν την οθόνη αφής (οθόνη αφής που μπορεί να συνδεθεί σε USB ή πραγματικές συσκευές εκτός από το Windows Phone) και περιγράφεται στη μέθοδο Update.

Επίσης, δεν χρειάζεται να ελέγξετε αν η οθόνη αφής μπορεί να χρησιμοποιηθεί επειδή μπορεί πάντα να χρησιμοποιηθεί στο Windows Phone 7, αλλά όταν μοιράζεστε κώδικα με τα Windows και το Xbox 360, αυτό το υλικό δεν απαιτείται διασύνδεση εισόδου και πρέπει να ελεγχθεί.

Εάν μπορείτε να επιβεβαιώσετε ότι η οθόνη αφής είναι διαθέσιμη στην ιδιότητα "TouchPanelCapabilities.IsConnected", η μέθοδος "TouchPanel.GetState" λαμβάνει την τρέχουσα κατάσταση αφής.

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

Πρόγραμμα - Αποκτήστε τον μέγιστο αριθμό σημείων επαφής που μπορείτε να πάρετε

Ο μέγιστος αριθμός σημείων επαφής που μπορούν να ανακτηθούν είναι περίπου σταθερός, επομένως δεν είναι συχνά απαραίτητο να τα ανακτήσετε κατά τη διάρκεια του παιχνιδιού, αλλά μπορείτε να λάβετε τον μέγιστο αριθμό σημείων επαφής που μπορούν να ανακτηθούν από το TouchPanelCapabilities.Ιδιότητα MaximumTouchCount. Για παράδειγμα, αν η ιδιότητα MaximumTouchCount είναι "4", δεν μπορείτε να λάβετε πληροφορίες για την πέμπτη θέση αγγίζοντας την οθόνη αφής με πέντε δάχτυλα.

Ο αριθμός των εξαγορών για το smartphone "HTC 7 Trophy" που χρησιμοποιήθηκε σε αυτό το δείγμα ήταν "4". (Παρεμπιπτόντως, το XNA Game Studio 4.0 ορίζεται να επιστρέφει πάντα 4.) Η προδιαγραφή του Windows Phone 7 λέει ότι είναι περισσότερο από 4 σημεία, επομένως δεν επιστρέφει λιγότερο από 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Εικόνα 3: TouchPanelCapabilities.ΜέγιστοΜέτρος ανάκτησης ιδιοκτησίας αφής

Πρόγραμμα - Λάβετε πληροφορίες αφής

Η ανακτημένη δομή TouchCollection περιέχει πολλές πληροφορίες αφής. Για παράδειγμα, αν αγγίξετε με δύο δάχτυλα, συνήθως περιέχει δύο πινελιές.

Ο αριθμός των πληροφοριών αφής μπορεί να ανακτηθεί στην ιδιότητα TouchCollection.Count. Οι πληροφορίες αφής εμφανίζονται επανειλημμένα στη δήλωση for όσες φορές λαμβάνονται. Αρχικά, δεν υπάρχει πρόβλημα να κάνουμε βρόχο με το foreach, αλλά δεδομένου ότι θα χρησιμοποιήσουμε τον δείκτη πίνακα (δείκτης int) στη μεταγενέστερη εξήγηση, το επαναλαμβάνουμε με το 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);
}

Τώρα, κάθε πληροφορία αφής λαμβάνεται ως δομή "TouchLocation". Εάν επαναλαμβάνεται με το for, μπορεί να ληφθεί με το "TouchCollection[index]". (Μπορείτε επίσης να αποκτήσετε τη δομή "TouchLocation" απευθείας στο προσκήνιο.)

Οι ακόλουθοι τέσσερις τύποι πληροφοριών μπορούν να ληφθούν από τη δομή "TouchLocation" και κάθε πληροφορία εμφανίζεται στο δείγμα.

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

図 4 :3 本の指でタッチしているところ
Εικόνα 4: Άγγιγμα με τρία δάχτυλα

Πρόγραμμα - Πράγματα που πρέπει να προσέξετε κατά την ανάκτηση πληροφοριών αφής 1 (ευρετήριο και αναγνωριστικό)

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

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

図 5 :人差し指でタッチ
Εικόνα 5: Αφή με δείκτη

Όπως φαίνεται στην οθόνη, ο δείκτης θα είναι "0". Στη συνέχεια, αγγίξτε το με το μεσαίο δάχτυλό σας.

図 6 :中指でタッチ
Εικόνα 6: Άγγιγμα μεσαίου δακτύλου

Σε αυτήν την κατάσταση, αγγίζετε με δύο δάχτυλα, έτσι εμφανίζονται δύο κομμάτια πληροφοριών. Ο δείκτης που αγγίζεται με το μεσαίο δάχτυλο είναι "1".

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

図 7 :人差し指を放す
Εικόνα 7: Αφήστε το δείκτη σας

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

・ Μετακινήστε το χαρακτήρα "A" με το δείκτη σας

・ Μετακινήστε τον χαρακτήρα "B" με το μεσαίο δάχτυλο σε αυτήν την κατάσταση.

・ Απελευθερώστε το δείκτη ενώ μετακινείτε το χαρακτήρα με το μεσαίο δάχτυλο

・ Ο χαρακτήρας που ελέγχεται από το μεσαίο δάχτυλο αλλάζει ξαφνικά σε "A"

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

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

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

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

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

Αν και δεν περιλαμβάνεται στο πρόγραμμα του άρθρου, το δείγμα σχεδιάζει τη συμβολοσειρά "GetMaxTouchCount" στο κάτω μέρος της οθόνης και "τον μέγιστο αριθμό πληροφοριών αφής που αποκτήθηκαν ταυτόχρονα". Αυτό έχει εμφανίσει τον μέγιστο αριθμό πληροφοριών αφής που αποκτήθηκαν με τη μέθοδο "TouchPanel.GetState" στο παρελθόν, αλλά σε αυτό το μηχάνημα δοκιμής, η ιδιότητα "TouchPanelCapabilities.MaximumTouchCount" είναι 4, επομένως η μέγιστη τιμή που εμφανίζεται εδώ θα πρέπει συνήθως να είναι 4. Εάν βάλετε πέντε δάχτυλα σε αυτό, θα εξακολουθεί να είναι 4.

図 8 :5 本の指を置いたときの数値
Εικόνα 8: Αριθμός πέντε δακτύλων

Ας κάνουμε ένα μικρό πείραμα. Δοκιμάστε να επαναλάβετε την οθόνη αφής με πολλά δάχτυλα σε υψηλή ταχύτητα. Εξαρτάται από το μηχάνημα δοκιμής, αλλά ο αριθμός μπορεί να υπερβαίνει το 4 πριν το καταλάβετε.

図 9 :GetMaxTouchCount が 4 を超えている
Εικόνα 9: GetMaxTouchΟ αριθμός είναι μεγαλύτερος από 4

Στην πραγματικότητα, οι πληροφορίες αφής που αποκτήθηκαν από τη μέθοδο "TouchPanel.GetState" δεν είναι οι πληροφορίες αφής τη στιγμή της κλήσης της μεθόδου "TouchPanel.GetState", αλλά η στιγμή που την αγγίζετε και η στιγμή που την απελευθερώνετε από τον τελευταίο χρονισμό ενημέρωσης αποθηκεύονται προσωρινά. Επομένως, παρόλο που μπορούν να ανιχνευθούν έως και τέσσερα αγγίγματα ταυτόχρονα, το να αγγίξετε ξανά το ίδιο δάχτυλο αντιμετωπίζεται ως ξεχωριστό άγγιγμα, επομένως μπορούν να ληφθούν περισσότερες πληροφορίες αφής από το TouchPanelCapabilities.MaximumTouchCount.

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

Παρεμπιπτόντως, με τη βοήθεια του XNA Game Studio, η μέγιστη τιμή της ιδιότητας TouchCollection.Count περιγράφεται ως "8", οπότε αν θέλετε να διορθώσετε τον αριθμό των στοιχείων στον πίνακα, θα πρέπει να ορίσετε τον αριθμό των στοιχείων σε τουλάχιστον 8. (Εάν σκέφτεστε μελλοντικές αναβαθμίσεις έκδοσης, ίσως θελήσετε να συμπεριλάβετε έναν όρο φρουράς, ώστε το ευρετήριο να μην ανατρέπεται.)

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

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