تفاعلات اللمس في تطوير الألعاب ل Windows Phone 7 الجزء 2 اللمس المتعدد

تحديث الصفحة :
تاريخ إنشاء الصفحة :

برمجة! - 2.جرب اللمس المتعدد

حول هذا النموذج

هنا ، أود أن أشرح البرنامج لتحقيق مدخلات اللمس المتعدد. في Windows Phone 7 ، يعد الإدخال باللمس المتعدد عبر لوحة اللمس أحد أهم العناصر لإدخال المستخدم. هذا لأنه ، على عكس Windows و Xbox 360 ، فإن واجهة الإدخال الرئيسية هي "لوحة اللمس". قد تكون هناك هواتف Windows مزودة بلوحات مفاتيح ، ولكن بالطبع لا تحتوي عليها دائما. لذلك ، لكي تعمل اللعبة على أي هاتف Windows Phone ، يجب أن تكون قادرة على اللمس.

إذا قصرت لوحة اللمس على "لمسة واحدة" فقط ، فإن أنواع الألعاب التي يمكن إجراؤها ستكون محدودة حتما عندما يتعلق الأمر بصنع الألعاب. فكر في وحدة تحكم ألعاب محمولة باليد (يمكنك تركها ثابتة). تتطلب منك معظم وحدات التحكم في الألعاب الضغط على وحدة التحكم في اللعبة (أو وحدة التحكم الفعلية) بكلتا يديك والضغط على عدة أزرار في نفس الوقت.

لا يحتوي Windows Phone 7 على العديد من الأزرار مثل وحدات التحكم في الألعاب ، ولا يحتوي بالضرورة على لوحة مفاتيح. لذلك ، قد يتم وضع المفاتيح والأزرار الافتراضية على الشاشة ، وعند الضغط عليها ، يكون ذلك غير مريح لأنه لا يمكن الضغط عليها في وقت واحد بلمسة واحدة فقط.

بالطبع ، بالإضافة إلى مثال الزر الافتراضي أعلاه ، يعد اللمس المتعدد ضروريا للألعاب التي يقوم فيها عدة أشخاص بتشغيل شاشة واحدة ، مثل "قرصة وتمديد (تحريك نقطتين أقرب أو أبعد بعيدا)" وهو أمر شائع في اللمس المتعدد.

بالمناسبة ، المقدمة طويلة ، ولكن في هذه العينة ، أود الحصول على معلومات اللمس المتعدد باستخدام فئة مخصصة للوحات اللمس. من الممتع إنشاء عينة يمكن تشغيلها باستخدام اللمس المتعدد فجأة ، ولكن أولا أود معرفة نوع المعلومات التي يمكن الحصول عليها باستخدام اللمس المتعدد. هناك بعض العادات ، لذلك من خلال معرفتها أولا ، يمكنك تقليل الوقت الذي تقضيه في التحقيق في السبب ، مثل عندما لا يعمل بشكل جيد في البرمجة لاحقا.

أهداف هذا البرنامج النموذجي

عرض المعلومات وتأكيدها عند إجراء اللمس المتعدد.

図 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) في الشرح اللاحق ، فإننا نقوم بتكراره من أجل.

// タッチ情報の数だけループする
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 (الفهرس والمعرف)

ذكرت أعلاه أن هناك أشياء يجب وضعها في الاعتبار عند التعامل مع معلومات اللمس ، ولكن الأول هو "الفهرس" و "المعرف". يشير الفهرس ببساطة إلى فهرس صفيف.

أعتقد أنه من الأسهل فهمه إذا جربته على جهاز فعلي بدلا من شرحه كتابيا. على سبيل المثال، لنفترض أنك تعمل بإصبعين، "السبابة" و"الإصبع الأوسط"، وتلمس السبابة أولا.

図 5 :人差し指でタッチ
الشكل 5: المس السبابة

كما هو موضح على الشاشة ، سيكون الفهرس "0". ثم المسه بإصبعك الأوسط.

図 6 :中指でタッチ
الشكل 6: لمس الإصبع الأوسط

في هذه الحالة، أنت تلمس بإصبعين، لذلك يتم عرض معلومتين. السبابة التي تم لمسها بالإصبع الأوسط هي "1".

دعونا نرفع السبابة هنا. ثم ستبدو معلومات اللمس كما يلي.

図 7 :人差し指を放す
الشكل 7: حرر السبابة

كما لاحظت الآن ، فإن فهرس المعلومات التي تلمسها بإصبعك الأوسط هو "0". إذا قمت بإدارة الحرف حسب الفهرس عند نقله، فستؤدي العملية أعلاه إلى الإجراءات التالية.

・ حرك الحرف "A" بإصبعك السبابة

・ حرك الحرف "B" بالإصبع الأوسط في تلك الحالة.

・ حرر السبابة أثناء تحريك الحرف بالإصبع الأوسط

・ تتحول الشخصية التي يتحكم فيها الإصبع الأوسط فجأة إلى "A"

ظاهرة أخرى هي أنه إذا قمت بتحرير أو لمس أحد الإصبعين بشكل متكرر أثناء لمسهما ، فقد يومض نص الرسم لمعلومات اللمسة الأولى. وذلك لأن الإصبع الثاني يقاطع السبابة "0" في اللحظة التي تلمسها أو تحررها.

كما ذكر أعلاه ، فإن الفهرس وترتيب معلومات اللمس عند اللمس المتعدد لا يطابقان الترتيب الذي يتم لمسهما به. لذلك، إذا كنت ترغب في تنفيذ أية عمليات، فلا تقم بإدارتها في فهرس TouchCollection.

ما يجب إدارته هو أن بنية "TouchLocation" تحتوي على خاصية "Id" ، ويتم إعادة كتابة المعرف بقيمة جديدة في كل مرة يتم لمسها ، ولكن العلاقة بين نقطة الاتصال والمعرف مضمونة أثناء اللمس ، لذلك سنقوم بإدارتها.

بالطبع ، هذا لا يعني أنه يجب عليك إدارته بواسطة ID ، وفي بعض الحالات ، يكون موضع اللمس وحده كافيا. على سبيل المثال، إذا قمت فقط بلمس زر على الشاشة، يمكنك تحديد أنك ضغطت على زر عن طريق التحقق من موضع اللمس بغض النظر عن الهوية. ومع ذلك ، عند تضمين معالجة السحب ، يتغير الموضع دائما ، لذلك أعتقد أنه لا يزال يتعين تحديده بواسطة ID.

البرنامج - أشياء يجب وضعها في الاعتبار عند الحصول على معلومات اللمس 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 على الأقل. (إذا كنت تفكر في ترقيات الإصدار المستقبلي ، فقد ترغب في تضمين بند حراسة حتى لا يتجاوز الفهرس.)

ملخص هذه العينة

هذه المرة ، فحصنا معلمات مختلفة للمعلومات التي تم الحصول عليها من اللمس المتعدد. أكدنا أيضا أن هناك بعض النقاط التي يجب وضعها في الاعتبار عند الحصول على معلومات لوحة اللمس. بناء على هذه المعرفة ، أود أن أشرح عينة تستخدم بالفعل اللمس المتعدد.