विंडोज फोन 7 भाग 2 मल्टीटच के लिए गेम डेवलपमेंट में टच इंटरैक्शन
प्रोग्रामिंग! - 2. बहु स्पर्श की कोशिश करो
इस नमूने के बारे में
यहां, मैं मल्टी-टच इनपुट को साकार करने के लिए कार्यक्रम की व्याख्या करना चाहता हूं। विंडोज फोन 7 में, टच पैनल के माध्यम से मल्टी-टच इनपुट उपयोगकर्ता इनपुट के लिए सबसे महत्वपूर्ण वस्तुओं में से एक है। ऐसा इसलिए है क्योंकि, विंडोज और एक्सबॉक्स 360 के विपरीत, मुख्य इनपुट इंटरफ़ेस "टच पैनल" है। कीबोर्ड के साथ विंडोज फोन हो सकते हैं, लेकिन निश्चित रूप से उनके पास हमेशा नहीं होते हैं। इसलिए, गेम को किसी भी विंडोज फोन पर काम करने के लिए, इसे स्पर्श-सक्षम होना चाहिए।
यदि आप टच पैनल को केवल "सिंगल टच" तक सीमित करते हैं, तो गेम बनाने की बात आने पर गेम के प्रकार अनिवार्य रूप से सीमित होंगे। एक हैंडहेल्ड गेम कंसोल के बारे में सोचें (आप इसे स्थिर छोड़ सकते हैं)। अधिकांश गेम कंसोल के लिए आपको गेम कंट्रोलर (या वास्तविक कंसोल) को दोनों हाथों से पकड़ने और एक ही समय में कई बटन दबाने की आवश्यकता होती है।
विंडोज फोन 7 में गेम कंट्रोलर के रूप में कई बटन नहीं हैं, और इसमें कीबोर्ड जरूरी नहीं है। इसलिए, वर्चुअल कुंजी और बटन स्क्रीन पर रखे जा सकते हैं, और उन्हें दबाते समय, यह असुविधाजनक है क्योंकि उन्हें केवल एक स्पर्श के साथ एक साथ दबाया नहीं जा सकता है।
बेशक, उपरोक्त वर्चुअल बटन उदाहरण के अलावा, मल्टी-टच उन खेलों के लिए आवश्यक है जहां कई लोग एक स्क्रीन संचालित करते हैं, जैसे कि "चुटकी और खिंचाव (दो बिंदुओं को करीब या दूर ले जाएं)" जो मल्टी-टच में आम है।
वैसे, परिचय लंबा है, लेकिन इस नमूने में, मैं टच पैनलों के लिए समर्पित कक्षा का उपयोग करके बहु-स्पर्श जानकारी प्राप्त करना चाहता हूं। एक नमूना बनाना मजेदार है जिसे अचानक मल्टी-टच के साथ खेला जा सकता है, लेकिन पहले मैं यह जानना चाहता हूं कि मल्टी-टच के साथ किस तरह की जानकारी प्राप्त की जा सकती है। कुछ आदतें हैं, इसलिए उन्हें पहले जानकर, आप कारण की जांच में बिताए गए समय को कम कर सकते हैं, जैसे कि जब यह बाद में प्रोग्रामिंग में अच्छी तरह से काम नहीं करता है।
इस नमूना कार्यक्रम के लक्ष्य
बहु-स्पर्श किए जाने पर जानकारी प्रदर्शित करें और पुष्टि करें।
चित्र 1: स्पर्श जानकारी स्पर्श करने पर पाठ के रूप में प्रदर्शित होती है
कार्यक्रम - फ़ील्ड घोषित करना
फ़ील्ड को टचपैनलकैपेबिलिटीज़ स्ट्रक्चर और टचकलेक्शन स्ट्रक्चर लेबल किया जाना चाहिए।
<summary>
スプライトでテキストを描画するためのフォント
</summary>
SpriteFont font;
<summary>
タッチパネルの機能情報
</summary>
TouchPanelCapabilities capabilities;
<summary>
取得したタッチ情報の一覧
</summary>
TouchCollection touches;
"टचपैनलकैपेबिलिटीस्ट्रक्चर" एक ऐसी संरचना है जिसमें टच पैनल के कार्य पैरामीटर के रूप में हो सकते हैं। इसका उपयोग यह जांचने के लिए किया जाता है कि अपडेट करने के दौरान टच पैनल का उपयोग किया जा सकता है या नहीं।
टचकलेक्शन संरचना में वर्तमान में स्पर्श की गई स्थिति के बारे में जानकारी की एक सूची होती है। यदि एकाधिक स्पर्श का पता लगाया जाता है, तो एकाधिक "टचलोकेशन संरचनाएं" पुनर्प्राप्त की जा सकती हैं। बाद में उस पर अधिक।
प्रोग्राम - फ़ॉन्ट लोड हो रहा है
स्क्रीन पर पाठ आरेखित करने से पहले, अपनी सामग्री प्रोजेक्ट में फ़ॉन्ट परिभाषा जोड़ें और इसे Game.LoadContent विधि के साथ लोड करें। यह सीधे स्पर्श पैनलों से संबंधित नहीं है, इसलिए मैं एक विस्तृत स्पष्टीकरण छोड़ दूंगा।
चित्रा 2: अपनी सामग्री परियोजना में "फ़ॉन्ट.स्प्राइटफ़ॉन्ट" जोड़ें
// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");
कार्यक्रम - स्पर्श पैनल जानकारी प्राप्त करें
Game.अद्यतन विधि के अंदर स्पर्श पैनल जानकारी प्राप्त करें।
// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();
// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
// 現在のタッチパネルの入力情報を取得
touches = TouchPanel.GetState();
}
टच पैनल की फ़ंक्शन जानकारी प्राप्त करने के लिए आप "टचपैनल.गेटकैपेबिलिटीज़" विधि को कॉल कर सकते हैं। दो प्रकार की जानकारी प्राप्त की जा सकती है: "क्या टच पैनल का उपयोग किया जा सकता है?" और "टच पैनल द्वारा अधिग्रहित किए जा सकने वाले टचपॉइंट्स की अधिकतम संख्या। गेम के दौरान उनमें से कोई भी नहीं बदलता है, इसलिए मुझे लगता है कि यदि आप इसे गेम.इनिशियलाइज़ विधि के अनुसार प्राप्त करते हैं, तो कोई समस्या नहीं है, लेकिन भविष्य में, ऐसे डिवाइस जो टच पैनल (टच पैनल जो यूएसबी या विंडोज फोन के अलावा अन्य वास्तविक उपकरणों से कनेक्ट हो सकते हैं) को हटा सकते हैं, दिखाई देते हैं, और इसे अपडेट विधि में वर्णित किया गया है।
इसके अलावा, यह जांचने की कोई आवश्यकता नहीं है कि टच पैनल का उपयोग किया जा सकता है क्योंकि इसका उपयोग हमेशा विंडोज फोन 7 पर किया जा सकता है, लेकिन विंडोज और एक्सबॉक्स 360 के साथ कोड साझा करते समय, इन हार्डवेयर को इनपुट इंटरफेस की आवश्यकता नहीं होती है और इसे चेक करने की आवश्यकता होती है।
यदि आप पुष्टि कर सकते हैं कि टच पैनल "टचपैनलकैपेबिलिटीज़.आईएसकनेक्टेड" गुण में उपलब्ध है, तो "टचपैनल.गेटस्टेट" विधि को वर्तमान स्पर्श स्थिति मिलती है।
मूल रूप से, स्पर्श जानकारी प्राप्त करने के बाद कुछ ऑपरेशन प्रोसेसिंग की जाती है, लेकिन इस नमूने में, जानकारी केवल प्रदर्शित की जाती है, इसलिए Game.अपडेट विधि में कोई और प्रसंस्करण नहीं किया जाता है।
कार्यक्रम - टचपॉइंट्स की अधिकतम संख्या प्राप्त करें जिन्हें आप प्राप्त कर सकते हैं
पुनर्प्राप्त किए जा सकने वाले टचपॉइंट्स की अधिकतम संख्या लगभग तय की गई है, इसलिए गेम के दौरान उन्हें पुनः प्राप्त करना अक्सर आवश्यक नहीं होता है, लेकिन आप टचपैनलकैपेबिलिटीज.मैक्सिममटचकाउंट प्रॉपर्टी से पुनर्प्राप्त किए जा सकने वाले टचपॉइंट्स की अधिकतम संख्या प्राप्त कर सकते हैं। उदाहरण के लिए, यदि अधिकतमटचकाउंट गुण "4" है, तो आप स्पर्श पैनल को पाँच उंगलियों से स्पर्श करके पाँचवें स्थान की जानकारी प्राप्त नहीं कर सकते हैं।
इस नमूने में उपयोग किए गए स्मार्टफोन "एचटीसी 7 ट्रॉफी" के लिए अधिग्रहण की संख्या "4" थी। (वैसे, एक्सएनए गेम स्टूडियो 4.0 को हमेशा 4 वापस करने के लिए परिभाषित किया गया है। विंडोज फोन 7 विनिर्देश कहता है कि यह 4 अंक से अधिक है, इसलिए यह 4 से कम नहीं लौटाता है।
// タッチ可能な最大数を表示
spriteBatch.DrawString(font,
"MaximumTouchCount : " +
capabilities.MaximumTouchCount,
new Vector2(20, 50),
Color.LightGreen);
चित्र 3: टचपैनलकैपेबिलिटीज.मैक्सिममटचकाउंट प्रॉपर्टी रिट्रीवल काउंट
कार्यक्रम - स्पर्श जानकारी प्राप्त करें
पुनर्प्राप्त टचकलेक्शन संरचना में एकाधिक स्पर्श जानकारी होती है। उदाहरण के लिए, यदि आप दो उंगलियों से स्पर्श करते हैं, तो इसमें आमतौर पर दो स्पर्श होते हैं।
स्पर्श जानकारी की संख्या टचकलेक्शन.काउंट गुण में पुनर्प्राप्त की जा सकती है। स्पर्श जानकारी बार-बार कथन में जितनी बार प्राप्त की जाती है उतनी बार प्रदर्शित की जाती है। मूल रूप से, फोरच के साथ लूप करने में कोई समस्या नहीं है, लेकिन चूंकि हम बाद के स्पष्टीकरण में सरणी सूचकांक (इंट इंडेक्स) का उपयोग करेंगे, इसलिए हम इसके साथ लूप करते हैं।
// タッチ情報の数だけループする
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);
}
अब, प्रत्येक स्पर्श जानकारी "टचलोकेशन" संरचना के रूप में प्राप्त की जाती है। यदि यह लूपिंग के साथ है, तो इसे "टचकलेक्शन [इंडेक्स]" के साथ प्राप्त किया जा सकता है। (आप सीधे फोरच में "टचलोकेशन" संरचना भी प्राप्त कर सकते हैं।
निम्नलिखित चार प्रकार की जानकारी "टचलोकेशन" संरचना से प्राप्त की जा सकती है, और प्रत्येक जानकारी नमूने में प्रदर्शित होती है।
जब आप वास्तव में इसे चलाते हैं, तो स्पर्श जानकारी नीचे दिखाए गए अनुसार प्रदर्शित होती है। चूंकि आप तीन उंगलियों से छू रहे हैं, इसलिए आप तीन स्पर्श देख सकते हैं। वैसे, यदि आप पांच उंगलियों से स्पर्श करते हैं, तो आप केवल चार तक देखेंगे। (क्योंकि अधिग्रहण की अधिकतम संख्या 4 है)
चित्र 4: तीन उंगलियों से छूना
कार्यक्रम - स्पर्श जानकारी 1 (सूचकांक और आईडी) को पुनः प्राप्त करते समय देखने के लिए चीजें
मैंने ऊपर उल्लेख किया है कि स्पर्श जानकारी से निपटने के दौरान ध्यान में रखने वाली चीजें हैं, लेकिन पहला "इंडेक्स" और "आईडी" है। एक सूचकांक केवल एक सरणी सूचकांक को संदर्भित करता है।
मुझे लगता है कि यह समझना आसान है कि क्या आप इसे लिखित रूप में समझाने की तुलना में वास्तविक मशीन पर आज़माते हैं। उदाहरण के लिए, मान लें कि आप दो उंगलियों, "तर्जनी" और "मध्यमा उंगली" के साथ काम करते हैं, और पहले अपनी तर्जनी उंगली से स्पर्श करते हैं।
चित्र 5: तर्जनी उंगली के साथ स्पर्श करें
जैसा कि स्क्रीन पर दिखाया गया है, सूचकांक "0" होगा। फिर इसे अपनी मध्यमा उंगली से स्पर्श करें।
चित्र 6: मध्य उंगली स्पर्श
इस अवस्था में, आप दो उंगलियों से छू रहे हैं, इसलिए जानकारी के दो टुकड़े प्रदर्शित होते हैं। मध्यउंगली से छुआ गया सूचकांक "1" है।
चलो अपनी तर्जनी उंगली को यहाँ उठाते हैं। फिर स्पर्श जानकारी निम्नलिखित की तरह दिखाई देगी।
चित्र 7: अपनी तर्जनी उंगली छोड़ें
जैसा कि आपने अब तक देखा होगा, आप जिस जानकारी को अपनी मध्य उंगली से छू रहे हैं, उसका सूचकांक "0" है। यदि आप इसे ले जाते समय अनुक्रमणिका द्वारा वर्ण प्रबंधित करते हैं, तो उपरोक्त कार्रवाई निम्न क्रियाओं को जन्म देगी।
अपनी तर्जनी उंगली के साथ चरित्र "ए" ले जाएँ
↓
उस अवस्था में मध्य उंगली के साथ चरित्र "बी" को स्थानांतरित करें।
↓
मध्यमा उंगली के साथ चरित्र को स्थानांतरित करते समय तर्जनी को छोड़ दें
↓
मध्य उंगली द्वारा नियंत्रित चरित्र अचानक "ए" पर स्विच करता है
एक और घटना यह है कि यदि आप बार-बार उन्हें छूते समय दो उंगलियों में से एक को छोड़ते हैं या स्पर्श करते हैं, तो पहले स्पर्श की जानकारी का ड्राइंग टेक्स्ट झिलमिलाहट कर सकता है। ऐसा इसलिए है क्योंकि दूसरी उंगली इंडेक्स "0" को उस क्षण बाधित करती है जब आप इसे छूते हैं या जारी करते हैं।
जैसा कि ऊपर उल्लेख किया गया है, इंडेक्स और स्पर्श जानकारी का क्रम जब मल्टी-टच उस क्रम से मेल नहीं खाता है जिसमें उन्हें छुआ जाता है। इसलिए, यदि आप कोई कार्रवाई करना चाहते हैं, तो उन्हें टचकलेक्शन इंडेक्स में प्रबंधित न करें।
क्या प्रबंधित किया जाना चाहिए कि "टचलोकेशन" संरचना में "आईडी" संपत्ति है, और हर बार जब इसे छुआ जाता है तो आईडी को एक नए मूल्य के साथ फिर से लिखा जाता है, लेकिन टचपॉइंट और आईडी के बीच संबंध को छूते समय गारंटी दी जाती है, इसलिए हम इसे प्रबंधित करेंगे।
बेशक, इसका मतलब यह नहीं है कि आपको इसे आईडी द्वारा प्रबंधित करना होगा, और कुछ मामलों में, अकेले स्पर्श की स्थिति पर्याप्त है। उदाहरण के लिए, यदि आप स्क्रीन पर एक बटन को छूते हैं, तो आप यह निर्धारित कर सकते हैं कि आपने आईडी की परवाह किए बिना स्पर्श स्थिति की जांच करके एक बटन दबाया है। हालांकि, ड्रैग प्रोसेसिंग सहित, स्थिति हमेशा बदलती है, इसलिए मुझे लगता है कि इसे अभी भी आईडी द्वारा निर्धारित किया जाना चाहिए।
कार्यक्रम - स्पर्श जानकारी प्राप्त करते समय ध्यान में रखने योग्य बातें 2 (प्राप्त स्पर्श जानकारी की संख्या)
यद्यपि यह लेख के कार्यक्रम में शामिल नहीं है, नमूना स्क्रीन के निचले भाग में स्ट्रिंग "गेटमैक्सटचकाउंट" और "एक ही समय में प्राप्त स्पर्श जानकारी की अधिकतम संख्या" खींचता है। इसने अतीत में "टचपैनल.गेटस्टेट" विधि द्वारा प्राप्त स्पर्श जानकारी की अधिकतम संख्या प्रदर्शित की है, लेकिन इस परीक्षण मशीन में, "टचपैनलकैपेबिलिटीज़.मैक्सिममटटाउचकाउंट" संपत्ति 4 है, इसलिए यहां प्रदर्शित अधिकतम मूल्य आमतौर पर 4 होना चाहिए। यदि आप उस पर पांच उंगलियां डालते हैं, तो यह अभी भी 4 होगा।
चित्र 8: पांच उंगली संख्या
चलो थोड़ा प्रयोग करते हैं। उच्च गति पर कई उंगलियों के साथ स्पर्श पैनल को दोहराने का प्रयास करें। यह परीक्षण मशीन पर निर्भर करता है, लेकिन इससे पहले कि आप इसे जानते हों, संख्या 4 से अधिक हो सकती है।
चित्र 9: गेटमैक्सटचकाउंट 4 से अधिक है
वास्तव में, "टचपैनल.गेटस्टेट" विधि द्वारा प्राप्त स्पर्श जानकारी "टचपैनल.गेटस्टेट" विधि को कॉल करने के समय स्पर्श जानकारी नहीं है, लेकिन जिस क्षण आप इसे स्पर्श करते हैं और जिस क्षण आप इसे अंतिम अपडेट टाइमिंग से जारी करते हैं, कैश किया जाता है। इसलिए, भले ही एक ही समय में चार स्पर्शों का पता लगाया जा सकता है, फिर से एक ही उंगली को छूने को एक अलग स्पर्श के रूप में माना जाता है, इसलिए टचपैनलकैपेबिलिटीज की तुलना में अधिक स्पर्श जानकारी प्राप्त की जा सकती है।
इसलिए, भले ही टचपैनलकैपेबिलिटीज़.मैक्सिममटचकाउंट 4 है, यदि स्पर्श से संबंधित डेटा के सरणी तत्वों की संख्या 4 द्वारा तय की गई है, तो प्रोसेसिंग विधि के आधार पर इंडेक्स ओवरएज त्रुटि हो सकती है।
वैसे, एक्सएनए गेम स्टूडियो की मदद से, टचकलेक्शन.काउंट प्रॉपर्टी का अधिकतम मूल्य "8" के रूप में वर्णित है, इसलिए यदि आप सरणी में तत्वों की संख्या को ठीक करना चाहते हैं, तो आपको तत्वों की संख्या कम से कम 8 पर सेट करनी चाहिए। (यदि आप भविष्य के संस्करण नवीनीकरण के बारे में सोचते हैं, तो आप एक गार्ड क्लॉज शामिल करना चाह सकते हैं ताकि अनुक्रमणिका खत्म न हो।
इस नमूने का सारांश
इस बार, हमने मल्टी-टच से प्राप्त जानकारी के लिए विभिन्न मापदंडों की जांच की। हमने यह भी पुष्टि की कि टच पैनल की जानकारी प्राप्त करते समय ध्यान में रखने के लिए कुछ बिंदु हैं। इस ज्ञान के आधार पर, मैं एक नमूना समझाना चाहता हूं जो वास्तव में बहु-स्पर्श का उपयोग करता है।