אינטראקציות מגע בפיתוח משחקים עבור Windows Phone 7 חלק 2 רב מגע

עודכן דף :
תאריך יצירת דף :

תכנות! - 2.נסה מולטי טאץ'

אודות מדגם זה

כאן, אני רוצה להסביר את התוכנית למימוש קלט רב מגע. ב- Windows Phone 7, קלט מולטי-טאץ' באמצעות לוח המגע הוא אחד הפריטים החשובים ביותר עבור קלט המשתמש. הסיבה לכך היא שבניגוד ל- Windows ו- Xbox 360, ממשק הקלט הראשי הוא "לוח המגע". אולי יש טלפונים של Windows עם מקלדות, אבל כמובן שלא תמיד יש להם אותם. לכן, על מנת שהמשחק יעבוד על כל Windows Phone, הוא צריך להיות מסוגל למגע.

אם תגביל את לוח המגע ל"מגע יחיד "בלבד, סוגי המשחקים שניתן ליצור יהיו בהכרח מוגבלים כשמדובר ביצירת משחקים. חשבו על קונסולת משחקים ידנית (אתם יכולים להשאיר אותה נייחת). רוב קונסולות המשחקים דורשות ממך להחזיק את בקר המשחק (או הקונסולה בפועל) בשתי הידיים וללחוץ על מספר לחצנים בו-זמנית.

ל-Windows Phone 7 אין לחצנים רבים כמו לבקרי משחק, והוא לא בהכרח כולל מקלדת. לכן, מקשים ולחצנים וירטואליים עשויים להיות ממוקמים על המסך, וכאשר לוחצים עליהם, זה לא נוח כי הם לא יכולים להיות לחוץ בו זמנית עם רק בנגיעה אחת.

כמובן, בנוסף לדוגמת הכפתור הווירטואלי לעיל, מולטי-טאץ' נחוץ למשחקים שבהם מספר אנשים מפעילים מסך אחד, כגון "כיווץ ומתיחה (הזזת שתי נקודות קרוב יותר או רחוק יותר זו מזו)" הנפוצה במולטי-טאץ'.

אגב, ההקדמה ארוכה, אבל במדגם זה, אני רוצה לרכוש מידע רב מגע באמצעות כיתה המוקדש לוחות מגע. זה כיף ליצור מדגם שניתן לשחק עם multi-touch פתאום, אבל קודם אני רוצה לגלות איזה סוג של מידע ניתן להשיג עם multi-touch. ישנם כמה הרגלים, אז על ידי ידיעתם הראשון, אתה יכול להפחית את הזמן בילה לחקור את הסיבה, כגון כאשר זה לא עובד טוב בתכנות מאוחר יותר.

מטרות התוכנית לדוגמה

הצג ואשר את המידע בעת ביצוע רב-מגע.

図 1 :タッチしたときにタッチ情報がテキストで表示される
איור 1: פרטי מגע מוצגים כטקסט כשנוגעים בהם

תכנית - הכרזה על שדות

השדות חייבים להיות מסומנים כמבנה TouchPanelCapabilities ומבנה TouchCollection.

/// <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) מופיעים, והוא מתואר בשיטת העדכון.

כמו כן, אין צורך לבדוק אם ניתן להשתמש בלוח המגע מכיוון שתמיד ניתן להשתמש בו ב- Windows Phone 7, אך בעת שיתוף קוד עם Windows ו- Xbox 360, חומרה זו אינה ממשקי קלט נדרשים ויש לבדוק אותה.

אם באפשרותך לאשר שלוח המגע זמין במאפיין "TouchPanelCapabilities.IsConnected", פעולת השירות "TouchPanel.GetState" מקבלת את מצב המגע הנוכחי.

במקור, עיבוד פעולה מסוים מתבצע לאחר רכישת מידע מגע, אך בדוגמה זו, המידע מוצג רק, כך שלא נעשה עיבוד נוסף בשיטה Game.Update.

תוכנית - קבל את המספר המרבי של נקודות מגע שאתה יכול לקבל

המספר המרבי של נקודות מגע שניתן לאחזר הוא קבוע בערך, כך שלעתים קרובות אין צורך לאחזר אותן במהלך המשחק, אך באפשרותך לקבל את המספר המרבי של נקודות מגע שניתן לאחזר מהמאפיין TouchPanelCapabilities.MaximumTouchCount. לדוגמה, אם המאפיין MaximumTouchCount הוא "4", לא תוכל לקבל את פרטי המיקום החמישי על-ידי נגיעה בלוח המגע בחמש אצבעות.

מספר הרכישות עבור הטלפון החכם "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.MaximumTouchCount ספירת אחזור נכסים

תוכנית - קבל מידע מגע

מבנה TouchCollection שאוחזר מכיל מידע מגע מרובה. לדוגמה, אם אתה נוגע עם שתי אצבעות, הוא מכיל בדרך כלל שתי נגיעות.

ניתן לאחזר את מספר פרטי המגע במאפיין TouchCollection.Count. מידע מגע מוצג שוב ושוב במשפט for כמה פעמים שהוא מתקבל. במקור, אין בעיה לולאה עם foreach, אבל מכיוון שנשתמש באינדקס המערך (int index) בהסבר המאוחר יותר, אנחנו לולאה עם עבור.

// タッチ情報の数だけループする
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". אם הוא לולאה עם עבור, ניתן להשיג אותו עם "TouchCollection[index]". (אתה יכול גם לקבל את המבנה "TouchLocation" ישירות foreach.)

ניתן לקבל את ארבעת סוגי המידע הבאים ממבנה "TouchLocation", וכל מידע מוצג במדגם.

כאשר אתה מפעיל אותו בפועל, פרטי המגע מוצגים כמוצג להלן. מכיוון שאתה נוגע בשלוש אצבעות, אתה יכול לראות שלוש נגיעות. אגב, אם תיגע עם חמש אצבעות, תראה רק עד ארבע. (מכיוון שמספר הרכישות המרבי הוא 4)

図 4 :3 本の指でタッチしているところ
איור 4: נגיעה בשלוש אצבעות

תוכנית - דברים שיש להיזהר מהם בעת אחזור מידע מגע 1 (אינדקס ומזהה)

ציינתי לעיל כי יש דברים שיש לזכור כאשר מתמודדים עם מידע מגע, אבל הראשון הוא "אינדקס" ו "ID". אינדקס פשוט מתייחס לאינדקס מערך.

אני חושב שקל יותר להבין אם אתה מנסה את זה על מכונה בפועל מאשר להסביר את זה בכתב. לדוגמה, נניח שאתה פועל עם שתי אצבעות, "אצבע מורה" ו"אצבע אמצעית", ונוגע תחילה באצבע המורה.

図 5 :人差し指でタッチ
איור 5: מגע עם האצבע המורה

כפי שמוצג על המסך, המדד יהיה "0". לאחר מכן גע בו עם האצבע האמצעית.

図 6 :中指でタッチ
איור 6: מגע אצבע אמצעי

במצב זה, אתה נוגע בשתי אצבעות, כך שמוצגות שתי פיסות מידע. האינדקס נגע עם האצבע האמצעית הוא "1".

בואו נרים את האצבע המורה שלנו כאן. לאחר מכן מידע המגע ייראה כמו המידע הבא.

図 7 :人差し指を放す
איור 7: שחרור האצבע המורה

כפי שאולי שמתם לב עד עכשיו, האינדקס של המידע שאתם נוגעים בו עם האצבע האמצעית הוא "0". אם אתה מנהל את התו לפי אינדקס בעת הזזתו, הפעולה לעיל תוביל לפעולות הבאות.

・ הזז את התו "A" עם האצבע המורה

・ הזז את התו "B" עם האצבע האמצעית במצב זה.

・ שחרר את האצבע המורה תוך כדי הזזת התו עם האצבע האמצעית

・ הדמות הנשלטת על ידי האצבע האמצעית עוברת לפתע ל-"A"

תופעה נוספת היא שאם אתה משחרר או נוגע שוב ושוב באחת משתי האצבעות תוך כדי נגיעה בהן, טקסט הציור של מידע המגע הראשון עשוי להבהב. הסיבה לכך היא שהאצבע השנייה קוטעת את האינדקס "0" ברגע שאתה נוגע או משחרר אותו.

כפי שצוין לעיל, האינדקס וסדר המידע במגע בעת מולטי-טאץ' אינם תואמים את הסדר שבו נוגעים בהם. לכן, אם ברצונך לבצע פעולות כלשהן, אל תנהל אותן באינדקס TouchCollection.

מה שצריך לנהל הוא שלמבנה "TouchLocation" יש מאפיין "מזהה", והמזהה נכתב מחדש עם ערך חדש בכל פעם שנוגעים בו, אך הקשר בין נקודת המגע למזהה מובטח תוך כדי נגיעה, כך שננהל אותו.

כמובן, זה לא אומר שאתה צריך לנהל את זה על ידי תעודת זהות, ובמקרים מסוימים, את המיקום מגע לבד מספיק. לדוגמה, אם רק תיגע בלחצן על המסך, תוכל לקבוע שלחצת על לחצן על-ידי בדיקת מיקום המגע ללא קשר למזהה. עם זאת, כאשר כוללים עיבוד גרר, המיקום תמיד משתנה, ולכן אני חושב שזה עדיין צריך להיקבע על ידי תעודת זהות.

תוכנית - דברים שיש לזכור בעת רכישת פרטי מגע 2 (מספר פרטי המגע שנרכשו)

למרות שזה לא נכלל בתוכנית של המאמר, המדגם מצייר את המחרוזת "GetMaxTouchCount" בתחתית המסך ואת "המספר המרבי של מידע מגע שנרכש בו זמנית". פעולה זו הציגה את המספר המרבי של מידע מגע שנרכש על-ידי השיטה "TouchPanel.GetState" בעבר, אך במכונת בדיקה זו, המאפיין "TouchPanelCapabilities.MaximumTouchCount" הוא 4, כך שהערך המרבי המוצג כאן צריך להיות בדרך כלל 4. אם אתה שם חמש אצבעות על זה, זה עדיין יהיה 4.

図 8 :5 本の指を置いたときの数値
איור 8: מספר בחמש אצבעות

בואו נעשה ניסוי קטן. נסה לחזור על לוח המגע באצבעות מרובות במהירות גבוהה. זה תלוי במכונת הבדיקה, אבל המספר עשוי לעלות על 4 לפני שאתה יודע את זה.

図 9 :GetMaxTouchCount が 4 を超えている
איור 9: ספירת GetMaxTouchCount גדולה מ-4

למעשה, מידע המגע שנרכש על ידי השיטה "TouchPanel.GetState" אינו מידע המגע ברגע הקריאה לשיטה "TouchPanel.GetState", אלא ברגע שאתה נוגע בו וברגע שאתה משחרר אותו מתזמון העדכון האחרון מאוחסנים במטמון. לכן, למרות שניתן לזהות עד ארבע נגיעות בו-זמנית, נגיעה חוזרת באותה אצבע מטופלת כמגע נפרד, כך שניתן לקבל יותר מידע מגע מאשר TouchPanelCapabilities.MaximumTouchCount.

לכן, גם אם TouchPanelCapabilities.MaximumTouchCount הוא 4, אם מספר רכיבי המערך של נתונים הקשורים למגע קבוע ב- 4, עלולה להתרחש שגיאת עודף אינדקס בהתאם לשיטת העיבוד.

אגב, בעזרת XNA Game Studio, הערך המרבי של המאפיין TouchCollection.Count מתואר כ- "8", כך שאם ברצונך לתקן את מספר האלמנטים במערך, עליך להגדיר את מספר האלמנטים ל -8 לפחות. (אם אתה חושב על שדרוגי גירסאות עתידיים, ייתכן שתרצה לכלול סעיף שמירה כדי שהאינדקס לא יעבור.)

סיכום מדגם זה

הפעם, בחנו פרמטרים שונים למידע המתקבל ממולטי טאץ'. אישרנו גם שיש כמה נקודות שיש לזכור בעת רכישת מידע על לוח המגע. בהתבסס על הידע הזה, אני רוצה להסביר מדגם שלמעשה משתמש במולטי-טאץ'.