تعاملات لمسی در توسعه بازی برای ویندوز فون 7 قسمت 2 Multitouch

صفحه به روز شده :
تاریخ ایجاد صفحه :

برنامه نویسی! - 2.سعی کنید چند لمسی

درباره این نمونه

در اینجا می خواهم برنامه تحقق ورودی چند لمسی را توضیح دهم. در ویندوز فون ۷، ورودی چند لمسی از طریق پنل لمسی یکی از مهم ترین موارد برای ورودی کاربر است. دلیل این امر این است که برخلاف ویندوز و ایکس باک ۳۶۰، رابط ورودی اصلی «پنل لمسی» است. ممکن است گوشی های ویندوزی با صفحه کلید وجود داشته باشند اما البته همیشه آنها را ندارد. بنابراین ، به منظور بازی به کار بر روی هر ویندوز فون ، آن را نیاز به لمسی قادر است.

اگر شما محدود کردن پانل لمسی به "تک لمس" تنها، انواع بازی است که می تواند ساخته شده به ناچار محدود خواهد شد که آن را به ساخت بازی می آید. فکر می کنم از یک کنسول بازی دستی (شما می توانید آن را ثابت ترک). اکثر کنسول های بازی شما را ملزم به نگه داشتن کنترل کننده بازی (یا کنسول واقعی) با هر دو دست و فشار چند دکمه در همان زمان.

ویندوز فون ۷ به اندازه کنترل کننده های بازی دکمه ندارد و لزوماً صفحه کلید ندارد. بنابراین ممکن است کلیدها و دکمه های مجازی روی صفحه نمایش قرار گیرند و هنگام فشار دادن آن ها ناخوشایند است زیرا تنها با یک لمس نمی توان آن ها را همزمان فشار داد.

البته علاوه بر مثال دکمه مجازی بالا، مولتی تاچ برای بازی هایی که چندین نفر یک صفحه نمایش را در آن ها عمل می کنند، مانند «پینچ و کشش (حرکت دو نقطه نزدیک تر یا دورتر از هم)» که در چند لمسی رایج است، ضروری است.

به هر حال، مقدمه طولانی است، اما در این نمونه، من می خواهم برای به دست آوردن اطلاعات چند لمسی با استفاده از یک کلاس اختصاص داده شده به پانل های لمسی. این سرگرم کننده است برای ایجاد یک نمونه است که می تواند با چند لمسی به طور ناگهانی بازی, اما اول من می خواهم برای پیدا کردن چه نوع از اطلاعات را می توان با چند لمس به دست آمده. برخی از عادات وجود دارد، بنابراین با دانستن آنها در ابتدا، شما می توانید زمان صرف شده برای بررسی علت را کاهش دهد، مانند زمانی که آن را به خوبی در برنامه نویسی بعد کار نمی کند.

اهداف این برنامه نمونه

نمایش و تایید اطلاعات زمانی که چند لمسی انجام می شود.

図 1 :タッチしたときにタッチ情報がテキストで表示される
شکل 1: اطلاعات لمسی به عنوان متن در هنگام لمس نمایش داده می شود

برنامه - اعلام زمینه ها

زمینه ها باید برچسب TouchPanelCapabilities ساختار و ساختار TouchCollection.

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

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

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

"ساختار TouchPanelCapabilities" ساختاری است که می تواند توابع پنل لمسی خود را به عنوان پارامتر داشته باشد. برای بررسی اینکه آیا پنل لمسی می تواند در هنگام به روز رسانی مورد استفاده قرار گیرد یا نه، استفاده می شود.

ساختار TouchCollection شامل فهرستی از اطلاعات در مورد حالت لمس شده در حال حاضر است. اگر لمس های متعدد تشخیص داده شوند، می توان چندین «ساختار لمسی» را بازیابی کرد. بیشتر در مورد آن بعد.

برنامه - بارگذاری فونت ها

قبل از کشیدن متن روی صفحه، تعریف فونت را به پروژه محتوایی خود اضافه کنید و آن را با روش 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 یا دستگاه های واقعی غیر از ویندوز فون متصل شوند) را حذف کنند، ظاهر می شوند و در روش Update شرح داده می شود.

همچنین نیازی به بررسی این نیست که آیا می توان از پنل لمسی استفاده کرد یا نه زیرا همیشه می توان از آن در ویندوز فون ۷ استفاده کرد، اما هنگام به اشتراک گذاشتن کد با ویندوز و ایکس باک ۳۶۰، این سخت افزارها نیازی به رابط ورودی نیستند و نیاز به بررسی دارند.

اگر شما می توانید تایید کنید که پانل لمسی در دسترس است "TouchPanelCapabilities.IsConnected" اموال، روش "TouchPanel.GetState" می شود حالت لمسی فعلی.

در اصل، برخی از پردازش عملیات پس از کسب اطلاعات لمسی انجام می شود، اما در این نمونه، اطلاعات تنها نمایش داده می شود، بنابراین هیچ پردازش دیگری در روش Game.Update انجام نمی شود.

برنامه -- دریافت حداکثر تعداد نقاط لمسی شما می توانید دریافت کنید

حداکثر تعداد نقاط لمسی که قابل بازیابی هستند تقریبا ثابت است، بنابراین اغلب لازم نیست که آنها را در طول بازی بازیابی کنید، اما شما می توانید حداکثر تعداد نقاط لمسی است که می تواند از TouchPanelCapabilities بازیابی.MaximumTouchCount اموال دریافت کنید. به عنوان مثال، اگر ملک MaximumTouchCount "4" باشد، نمی توانید با لمس پنل لمسی با پنج انگشت، اطلاعات موقعیت پنجم را دریافت کنید.

تعداد اکتساب ها برای گوشی هوشمند "HTC 7 Trophy" مورد استفاده در این نمونه "۴" بود. (به هر حال ، XNA بازی استودیو 4.0 تعریف شده است که همیشه بازگشت 4.) مشخصات ویندوز فون ۷ می گوید بیش از ۴ امتیاز است، بنابراین کمتر از ۴ برنگردد.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
شکل 3: TouchPanelCapabilities.MaximumTouchCount تعداد بازیابی اموال

برنامه - دریافت اطلاعات لمسی

ساختار TouchCollection بازیابی شده حاوی اطلاعات لمسی متعدد است. به عنوان مثال اگر با دو انگشت لمس کنید، معمولاً شامل دو لمس است.

تعداد اطلاعات لمسی را می توان در TouchCollection.Count property بازیابی کرد. اطلاعات لمسی بارها در بیانیه به همان اندازه که به دست می آید نمایش داده می شود. در اصل، هیچ مشکلی برای حلقه کردن با 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 :3 本の指でタッチしているところ
شکل 4: لمس با سه انگشت

برنامه -- چیزهایی که مراقب در هنگام بازیابی اطلاعات لمسی 1 (شاخص و شناسه)

در بالا اشاره کردم که در هنگام برخورد با اطلاعات لمسی چیزهایی برای در نظر داشتن وجود دارد، اما اولی «شاخص» و «شناسه» است. یک شاخص به سادگی به یک شاخص آرایه اشاره دارد.

من فکر می کنم آن را آسان تر به درک اگر شما آن را امتحان کنید بر روی یک ماشین واقعی از توضیح آن را در نوشتن. مثلاً بگوییم با دو انگشت «انگشت اشاره» و «انگشت میانی» عمل می کنید و ابتدا با انگشت اشاره تان لمس می کنید.

図 5 :人差し指でタッチ
شکل 5: لمس با انگشت اشاره

همانطور که بر روی صفحه نمایش نشان داده شده است ، شاخص خواهد شد "0". سپس آن را با انگشت میانی خود لمس کنید.

図 6 :中指でタッチ
شکل 6: لمس انگشت میانی

در این حالت شما با دو انگشت دست می زنید، بنابراین دو قطعه اطلاعات نمایش داده می شوند. اندیس لمس شده با انگشت میانی "۱" است.

بيا انگشت اشاره مون رو اينجا بلند کنيم سپس اطلاعات لمسی مانند موارد زیر به نظر می رسد.

図 7 :人差し指を放す
شکل 7 : انتشار انگشت اشاره خود را

همانطور که ممکن است تا به حال متوجه شده باشید، شاخص اطلاعاتی که با انگشت میانی خود لمس می کنید "0" است. اگر هنگام انتقال آن کاراکتر را بر اساس شاخص مدیریت کنید، عملیات بالا منجر به اعمال زیر خواهد شد.

-- حرکت شخصیت "A" با انگشت اشاره خود را

" کاراکتر "B" را با انگشت میانی در آن حالت جابجا کنید.

· آزاد کردن انگشت اشاره در حالی که حرکت شخصیت با انگشت میانی

شخصیت کنترل شده توسط انگشت میانی ناگهان به "A" تغییر می کند

پدیده دیگر این است که اگر در حین دست زدن به آن ها بارها یکی از دو انگشت را آزاد یا لمس کنید، ممکن است متن نقاشی اولین اطلاعات لمسی تلنگر بزند. این به این دلیل است که انگشت دوم لحظه ای که آن را لمس می کنید یا آزاد می کنید، شاخص «۰» را قطع می کند.

همانطور که در بالا ذکر شد، شاخص و ترتیب اطلاعات لمسی زمانی که چند لمسی با ترتیب لمس آنها مطابقت نمی کند. بنابراین، اگر می خواهید هر گونه عملیات را انجام دهید، آنها را در شاخص TouchCollection مدیریت کنید.

چیزی که باید مدیریت شود این است که ساختار "TouchLocation" دارای یک ملک "Id" است و شناسه هر بار که لمس می شود با مقدار جدیدی بازنویسی می شود، اما رابطه بین نقطه لمسی و شناسه در حین لمس تضمین می شود، بنابراین ما آن را مدیریت خواهیم کرد.

البته این به این معنا نیست که شما باید آن را با ID مدیریت کنید و در برخی موارد موقعیت لمسی به تنهایی کافی است. به عنوان مثال، اگر فقط دکمه ای را روی صفحه لمس کنید، می توانید تعیین کنید که با چک کردن موقعیت لمسی بدون در نظر گرفتن شناسه، دکمه ای را فشار داده اید. با این حال ، هنگامی که از جمله پردازش کشیدن ، موقعیت همیشه تغییر می کند ، بنابراین من فکر می کنم آن را هنوز هم باید توسط ID تعیین می شود.

برنامه -- چیزهایی که به خاطر داشته باشید در هنگام به دست آوردن اطلاعات لمسی 2 (تعداد اطلاعات لمسی به دست آورد)

اگرچه در برنامه مقاله گنجانده نشده است، اما نمونه رشته "GetMaxTouchCount" را در پایین صفحه نمایش و "حداکثر تعداد اطلاعات لمسی به دست آمده در همان زمان" ترسیم می کند. این حداکثر تعداد اطلاعات لمسی به دست آمده توسط روش "TouchPanel.GetState" را در گذشته نمایش داده است، اما در این ماشین آزمون، ملک "TouchPanelCapabilities.MaximumTouchCount" ۴ است، بنابراین حداکثر مقدار نمایش داده شده در اینجا معمولاً باید ۴ باشد. اگر پنج انگشت روی آن قرار داده باشید، باز هم 4 خواهد بود.

図 8 :5 本の指を置いたときの数値
شکل ۸: شماره پنج انگشت

بيا يه آزمايش کوچيک انجام بديم سعی کنید پنل لمسی را با چند انگشت با سرعت بالا تکرار کنید. بستگی به دستگاه تست دارد، اما ممکن است عدد قبل از اینکه بدانید از 4 تجاوز کند.

図 9 :GetMaxTouchCount が 4 を超えている
شکل 9: GetMaxTouchCount بزرگتر از 4

در واقع، اطلاعات لمسی به دست آمده توسط روش "TouchPanel.GetState" اطلاعات لمسی در لحظه تماس با روش "TouchPanel.GetState" نیست، اما لحظه ای که شما آن را لمس می کنید و لحظه ای که آن را از آخرین زمان بندی به روز رسانی منتشر می کنید کش می شوند. بنابراین، حتی اگر تا چهار لمس را می توان در همان زمان تشخیص داد، لمس انگشت همان دوباره به عنوان یک لمس جداگانه درمان می شود، بنابراین اطلاعات لمسی بیشتری ممکن است نسبت به TouchPanelCapabilities.MaximumTouchCount به دست آید.

بنابراین، حتی اگر TouchPanelCapabilities.MaximumTouchCount 4 باشد، اگر تعداد عناصر آرایه ای داده های مرتبط با لمس توسط ۴ ثابت شود، ممکن است بسته به روش پردازش، خطای اضافه کاری شاخص رخ دهد.

به هر حال ، در کمک XNA بازی استودیو ، حداکثر مقدار از TouchCollection.Count اموال به عنوان "8" توصیف شده است ، بنابراین اگر شما می خواهید برای تعمیر تعداد عناصر در آرایه ، شما باید تعداد عناصر را به حداقل 8. (اگر شما در مورد ارتقاء نسخه آینده فکر می کنم، شما ممکن است بخواهید شامل یک بند گارد به طوری که شاخص بیش از نمی شود.)

خلاصه این نمونه

این بار پارامترهای مختلفی را برای اطلاعات به دست آمده از چند لمسی مورد بررسی قرار دادیم. ما همچنین تایید کرد که برخی از نقاط به خاطر داشته باشید در هنگام به دست آوردن اطلاعات پانل لمسی وجود دارد. بر اساس این دانش، می خواهم نمونه ای را توضیح دهم که در واقع از چند لمسی استفاده می کند.