गोलकीपर गेम्स: Keeper असली रिएक्शन वाला दबाव कैसे बनाता है
मैं एक ऐसा फ़ुटबॉल गेम बनाना चाहता था जो गोल बचाने के सबसे मुश्किल हिस्से पर टिका हो: शॉट पढ़ने और शरीर का कोई हिस्सा उसके रास्ते में पहुँचाने के बीच का छोटा-सा वक़्त।
इसलिए बटन तो लगभग शुरू में ही बाहर हो गए। बाएँ-दाएँ क्लिक करने से नतीजा तो मिल जाता, पर रिएक्शन देने का एहसास नहीं मिलता। मैं चाहता था कि खिलाड़ी दौड़कर आते शूटर को देखे, गेंद की उड़ान पढ़े, हाथ बढ़ाए, झुके और दाँव लगाए। वेबकैम को कंट्रोलर बनना था और उसके सामने खड़े इंसान को गोलकीपर।
इसी से बना Keeper। बाहर से यह उन गोलकीपर गेम्स जैसा सीधा-सादा दिखता है: छह में से चार शॉट रोको और लेवल पार। पर अंदर हर लेवल रिएक्शन की समस्या बदल देता है। शॉट तेज़ होता है, गेंद ज़्यादा घूमती है, गोल चौड़ा होता है, कोनों में शॉट ज़्यादा आते हैं और स्क्रीन पर आपके गोलकीपर की पहुँच थोड़ी घट जाती है।
मेरा दावा यह नहीं कि ब्राउज़र गेम किसी पेशेवर मैच जैसा है या गोलकीपिंग कोचिंग की जगह ले लेगा। ऐसा नहीं है। मक़सद यह है कि असली शॉट रोकने की अहम शर्तें उधार लेकर उन्हें ऐसे सुरक्षित और साफ़ गेम में उतारूँ जिसे आप वेबकैम के सामने खेल सकें।
असली गोलकीपर पर रिएक्शन का दबाव कैसा होता है
पेनल्टी इसलिए मुश्किल नहीं कि गोलकीपर ने गेंद को हिलते पहले कभी देखा नहीं होता। मुश्किल इसलिए है कि जानकारी और हरकत का वक़्त लगभग एक साथ आते हैं।
88 पेनल्टी किक के एक पीयर-रिव्यू वाले विश्लेषण में गेंद की उड़ान का औसत समय 525 मिलीसेकंड निकला। शोधकर्ताओं ने यह भी पाया कि ऊँचे और नीचे शॉट के लिए गोलकीपरों के हाथ गेंद से टकराने के क़रीब 245 मिलीसेकंड बाद अलग होने लगते थे, जबकि बाएँ-दाएँ की हरकत उन संकेतों से शुरू हो सकती थी जो टक्कर से पहले ही मिल जाते हैं। गोलकीपर पेनल्टी की दिशा और ऊँचाई कैसे पकड़ते हैं, इस पर स्टडी पढ़ें।
इसी फ़र्क़ ने Keeper का ढाँचा तय किया। असली गोलकीपर गेंद हिलने के बाद ही नहीं सोचता। वह शूटर का दौड़कर आना, शरीर की बनावट और किक देखकर अंदाज़ा लगाता है, फिर उड़ान के शुरुआती हिस्से से उसे सुधारता है। इसीलिए गेम में आप शूटर को दौड़कर आते और टक्कर से पहले पैर पीछे खींचते देखते हैं। गेंद छूटने के बाद रफ़्तार, घुमाव और निशाना तय करते हैं कि सुधार के लिए कितना वक़्त बचा।
Keeper कोई जाँचा-परखा रिएक्शन-टाइम टेस्ट नहीं है। कैमरे की देरी, स्क्रीन का आकार, कमरे की जगह और बढ़ाया हुआ मूवमेंट मॉडल, ये सब इसे असली मैदान से अलग करते हैं। फिर भी ऊँचे लेवल जानबूझकर प्रो-जैसे दबाव की ओर बढ़ते हैं। लेवल 9 में गेंद की उड़ान 520 मिलीसेकंड की है, उस स्टडी के 525 मिलीसेकंड औसत के लगभग बराबर। लेवल 10 और उसके आगे गेम की 500 मिलीसेकंड की निचली सीमा तक पहुँच जाते हैं।
पहली मुश्किल: कैमरे को आईने जैसा महसूस कराना
Keeper सबसे पहले ब्राउज़र से सामने वाले कैमरे की वीडियो स्ट्रीम माँगता है। अनुमति वाला पॉपअप ब्राउज़र ख़ुद संभालता है, MediaDevices.getUserMedia() के ज़रिए। इस API को सुरक्षित संदर्भ और आपकी साफ़ अनुमति चाहिए, इसलिए कैमरा चुपचाप पीछे खुल ही नहीं सकता।
मैं वीडियो 1280 बाई 720 के आदर्श रेज़ोल्यूशन पर माँगता हूँ, ऑडियो बंद रखता हूँ और सामने वाले कैमरे को तरजीह देता हूँ। फिर पोज़ मॉडल वीडियो फ़्रेम ब्राउज़र के अंदर ही प्रोसेस करता है। Keeper वीडियो मोड में MediaPipe Pose Landmarker इस्तेमाल करता है, एक पोज़ के साथ, हल्का मॉडल लेकर, और GPU उपलब्ध हो तो उसी पर। Google की वेब के लिए Pose Landmarker गाइड में भी यही वीडियो-फ़्रेम वाला तरीक़ा समझाया गया है।
लैंडमार्क कैमरे के निर्देशांकों में आते हैं। इस्तेमाल से पहले मैं हर x निर्देशांक को पलट देता हूँ। खिलाड़ी अपने दाएँ जाए तो उसके नज़रिए से गोलकीपर भी स्क्रीन के दाएँ हिस्से में जाना चाहिए। यह पलटाव न हो तो पहला शॉट आने से पहले ही वेबकैम गेम अटपटा लगने लगता है।
पोज़ अपने आप गोलकीपर नहीं बन जाता
पोज़ मॉडल मुझे बताता है कि कैमरे के फ़्रेम में खिलाड़ी का सिर, कंधे, कोहनियाँ, कलाइयाँ, कूल्हे, घुटने और टखने कहाँ दिख रहे हैं। यह नहीं बताता कि ये बिंदु गोल के अंदर कहाँ पड़ते हैं।
इसे मैंने यूँ सुलझाया कि गोल को अपना अलग निर्देशांक तंत्र मान लिया। खिलाड़ी के कूल्हों का बीच वाला बिंदु गोलकीपर का चलता-फिरता केंद्र बन जाता है। बाक़ी हर लैंडमार्क इन्हीं कूल्हों के हिसाब से नापा जाता है, गोल की चौड़ाई-ऊँचाई के हिसाब से पैमाने पर बैठाया जाता है और फिर गोल के मुहाने में रखा जाता है।
इस तरह अलग-अलग क़द-काठी वाले सब खिलाड़ियों को खेलने की एक साझा जगह मिल जाती है। खिलाड़ी लंबा हो या छोटा, कैमरे के पास हो या दूर खड़ा हो, उसकी कलाई ऊपरी कोने की तरफ़ पहुँच सकती है। गेम कैमरे के कच्चे पिक्सल स्क्रीन पर नहीं उतारता। वह पोज़ की आकृति को गोल की आकृति में ढालता है।
झुकाव को कैमरे पर दिखने से ज़्यादा क्यों चलना पड़ता है
लिविंग रूम फ़ुटबॉल का मैदान नहीं है। ज़्यादातर लोग पूरा गोता लगाने की कोशिश सुरक्षित तरीक़े से कर ही नहीं सकते, और मैं नहीं चाहता था कि गेम इसके लिए उकसाए।
इसलिए Keeper आपके खड़े होने की जाँची हुई जगह से कूल्हों की आड़ी हरकत नापता है और उसे पूरे गोल पर बढ़ा देता है। सोचकर लिया गया एक झुकाव गोता बन जाता है। बाँहों और पैरों की जगह तब भी मायने रखती है, पर बढ़ाए हुए कूल्हों के खिसकाव से पूरा गोलकीपर कोने की तरफ़ चला जाता है, और आपको ज़मीन पर गिरना नहीं पड़ता।
हर शॉट के बीच खड़े होने की बुनियादी जगह धीरे-धीरे बीच में लौटती रहती है। यह इसलिए ज़रूरी है कि कई सेव के बाद लोग अपने आप थोड़ा खिसक जाते हैं। कैलिब्रेशन का बिंदु हमेशा एक ही रहता तो सीधा खड़ा होना भी आख़िर में स्थायी झुकाव जैसा दिखने लगता।
पहली उलटी गिनती से पहले गेम जाँचता है कि सिर, कंधे और दोनों बाँहें दिख रही हैं और ठीक-ठाक टिकी हैं। वह इस तैयार हालत को थोड़ी देर थामे रखता है, किसी एक संयोग वाले फ़्रेम पर भरोसा नहीं कर लेता। कैलिब्रेशन स्क्रीन गेम के डिज़ाइन से अलग नहीं है। वह तय करती है कि कैमरे को क्या दिखना चाहिए और आपको हिलने के लिए जगह देती है।
पूरा शरीर सेव का दायरा कैसे बनता है
सबसे अहम तकनीकी फ़ैसला यह था कि सेव सिर्फ़ कलाई पर न टिके। असली गोलकीपर हाथों, बाँहों, पैरों, धड़ और कभी-कभी सिर से भी शॉट रोकते हैं। टक्कर वाले सिस्टम को पूरी आकृति पहचाननी थी।
मैं गोलकीपर को कुछ सीधी-सादी आकृतियों से बनाता हूँ:
- धड़ एक भरा हुआ बहुभुज है, जो दोनों कंधों और दोनों कूल्हों से बनता है।
- बाँहें और पैर मोटे रेखा-खंड हैं, जिन्हें एक पिक्सल की हड्डी की जगह कैप्सूल की तरह लिया जाता है।
- कलाइयों के पास थोड़े बड़े गोल दस्ताने वाले ज़ोन हैं।
- सिर का अपना गोल सेव ज़ोन है।
गेंद गोल लाइन तक पहुँचती है तो इंजन एक ही सवाल पूछता है: क्या गेंद इनमें से किसी भी आकृति से टकराई? किसी अंग के लिए मैं रेखा-खंड पर सबसे पास का बिंदु निकालकर देखता हूँ कि उसकी दूरी अंग की मोटाई और गेंद की त्रिज्या के जोड़ से कम है या नहीं। धड़ के लिए जाँचता हूँ कि गेंद का केंद्र बहुभुज के अंदर पड़ता है या नहीं।
जिन लैंडमार्क की दृश्यता तय सीमा से कम है, वे सेव में गिने ही नहीं जाते। इससे अंदाज़े से बनी कोई कलाई या छिपा हुआ टखना अदृश्य दीवार नहीं बना पाता। नतीजा इतना उदार है कि सेव सचमुच शारीरिक लगे, और इतना सटीक कि शॉट की तरफ़ बढ़ना फिर भी आपको ही पड़े।
रिएक्शन से पहले के संकेत गढ़ना
एक ईमानदार फ़ुटबॉल गोलकीपर गेम में शॉट पढ़ने लायक़ होना चाहिए। गेंद बिना किसी इशारे के पूरी रफ़्तार से अचानक आ जाए, तो खिलाड़ी रिएक्शन नहीं दे रहा, अंदाज़ा लगा रहा है।
हर शॉट एक छोटी तैयारी से शुरू होता है। शूटर गेंद की तरफ़ बढ़ता है, किक वाला पैर पीछे खिंचता है और सिकुड़ती हुई रिंग किक का पल पढ़ने लायक़ बना देती है। गेंद बूट से छूटते ही गोल की तरफ़ तेज़ी से बढ़ती है। साथ ही वह दूर के आकार से पास के आकार तक बड़ी होती जाती है, जो गहराई का एक और संकेत है।
घुमाव में साइन वक्र की तरह झुकाव आता है। पैर से छूटते वक़्त घुमाव शून्य होता है, उड़ान के बीच में बढ़ता है और चुने गए निशाने पर पहुँचकर फिर शून्य हो जाता है। इससे गेंद मुड़ती भी है और शूटर के चुने निशाने से चूकती भी नहीं।
सेव होने पर गेंद ग़ायब नहीं हो जाती। वह टक्कर के बिंदु से एक पल के लिए छिटककर दूर जाती है और जिस अंग से सेव हुआ वह चमक उठता है। इस ज़रा-से ठहराव से टक्कर समझना बहुत आसान हो गया। खिलाड़ी देख पाते हैं कि शॉट रुका क्यों।
ऊँचे लेवल ज़्यादा पेशेवर रिएक्शन की समस्या बनाते हैं
सॉकर गोलकीपर गेम को मुश्किल बनाने का सबसे सीधा तरीक़ा गेंद की रफ़्तार बढ़ाना है। मैंने सिर्फ़ उसी पर टिकने से बचने की कोशिश की, क्योंकि रफ़्तार की एक हद होती है। उसके आगे वह बस रिएक्शन का मौक़ा छीन लेती है।
लेवल बढ़ने के साथ Keeper आपस में जुड़ी पाँच चीज़ें बदलता है:
- उड़ान का समय घटता है, इसलिए फ़ैसला करने के लिए कम वक़्त मिलता है।
- आड़ा घुमाव बढ़ता है, इसलिए शुरुआती रास्ता कम सीधा होता है।
- गोल चौड़ा होता जाता है, बचाने के लिए जगह बढ़ जाती है।
- स्क्रीन पर गोलकीपर का दायरा थोड़ा घटता है, इसलिए एक जगह खड़े रहने से गोल कम ढकता है।
- शूटर कोनों का निशाना ज़्यादा बार लगाता है।
पहले लेवल में गेंद क़रीब एक सेकंड हवा में रहती है। हर लेवल पर यह 0.06 सेकंड घटती है, जब तक आधे सेकंड की निचली सीमा न आ जाए। साथ ही घुमाव और कोनों की संभावना तय ऊपरी सीमा की तरफ़ चढ़ती है। गोल भी धीरे-धीरे चौड़ा होता है, मनमाने कठिनाई मोड के बीच कूदता नहीं।
ज़रूरी बात कोई एक नंबर नहीं, ये सब मिलकर कैसे काम करते हैं यह है। शुरुआती लेवल मैपिंग सिखाते हैं। बाद के लेवल आपसे कहते हैं कि तैयारी से जानकारी निकालिए, घुमाव को फ़ॉलो कीजिए, पहले फ़ैसला कीजिए और फिर भी पोज़ की पूरी पहुँच इस्तेमाल कीजिए। एक अनुभवी गोलकीपर पर जो फ़ैसले का दबाव होता है, यह मेल उसके कहीं क़रीब है, उस एक ही सीधे शॉट को बस तेज़ कर देने से कहीं ज़्यादा।
लेवल के आँकड़े पूरा सफ़र दिखाते हैं
मैंने मौजूदा प्रोडक्शन ट्यूनिंग सीधे गेम की कॉन्फ़िगरेशन से जाँची है। Keeper जो नंबर सच में इस्तेमाल करता है, वे ये हैं:
- लेवल 1: 1.00 सेकंड की उड़ान, 5 प्रतिशत घुमाव, 42 प्रतिशत गोल की चौड़ाई, 25 प्रतिशत कोने की संभावना और 102 प्रतिशत बुनियादी पहुँच।
- लेवल 4: 0.82 सेकंड की उड़ान, 20 प्रतिशत घुमाव, 54 प्रतिशत गोल की चौड़ाई, 43 प्रतिशत कोने की संभावना और 96 प्रतिशत बुनियादी पहुँच।
- लेवल 7: 0.64 सेकंड की उड़ान, 35 प्रतिशत घुमाव, 66 प्रतिशत गोल की चौड़ाई, 61 प्रतिशत कोने की संभावना और 90 प्रतिशत बुनियादी पहुँच।
- लेवल 9: 0.52 सेकंड की उड़ान, अधिकतम 45 प्रतिशत घुमाव, 74 प्रतिशत गोल की चौड़ाई, 73 प्रतिशत कोने की संभावना और न्यूनतम 88 प्रतिशत बुनियादी पहुँच।
- लेवल 12: 0.50 सेकंड की उड़ान, 45 प्रतिशत घुमाव, 86 प्रतिशत गोल की चौड़ाई, 90 प्रतिशत कोने की संभावना और 88 प्रतिशत बुनियादी पहुँच।
घुमाव वाला आँकड़ा गेम के अपने पैमाने की वैल्यू है। इसका मतलब असली गेंद का कुछ मीटर मुड़ना नहीं है। गोल की चौड़ाई और पहुँच भी स्क्रीन वाले गोल का अनुपात हैं। काम की तुलना सफ़र की है: लेवल 1 से 12 तक उड़ान का समय आधा हो जाता है, गोल दोगुने से भी ज़्यादा चौड़ा हो जाता है, कोनों की संभावना चार में से एक शॉट से बढ़कर दस में से नौ हो जाती है, और खड़े-खड़े ढकने वाला दायरा घट जाता है।
इसीलिए बाद के राउंड पहले लेवल के रंग बदले हुए रूप नहीं लगते, बिल्कुल अलग पैमाने के लगते हैं। लेवल 9 तक रिएक्शन विंडो उसी आधे सेकंड के दायरे में आ जाती है जो पेशेवर पेनल्टी फ़ुटेज में नापा गया था, और शॉट के मुड़ने और कोने के पास ख़त्म होने की संभावना भी ज़्यादा होती है।
सेव का लक्ष्य गेम का नियम है, पेशेवर पैमाना नहीं
हर लेवल में छह शॉट होते हैं। कम से कम 60 प्रतिशत यानी छह में से चार सेव कर लिए तो अगला लेवल शुरू हो जाता है। स्कोर वही है कि आपने कितने लेवल पूरे पार किए।
मैंने यह तय ब्लॉक इसलिए चुना कि इससे हर लेवल की अपनी एक छोटी कहानी बन जाती है। खिलाड़ी को हमेशा पता होता है कि लक्ष्य क्या है, अभी कौन-सा शॉट है और ग़लती की कितनी गुंजाइश बची है। चार सेव गणित से असंभव हो जाएँ तो रन तुरंत ख़त्म हो जाता है, बेमतलब शॉट खेलने नहीं पड़ते।
छह में से चार सेव का मतलब 66.7 प्रतिशत लेवल पार करने की दर है। इसकी तुलना असली पेनल्टी रोकने के प्रतिशत से नहीं होनी चाहिए। Keeper के शॉट, शरीर का पैमाना और निशानों का बँटवारा बार-बार खेले जाने वाले ब्राउज़र गेम के लिए बने हैं, पेशेवर मुक़ाबलों से आँकड़ों में बराबरी के लिए नहीं। असली दुनिया वाला संदर्भ रिएक्शन विंडो और नज़र से फ़ैसले के दबाव में है, स्कोरलाइन में नहीं।
इस ढाँचे से लगातार अच्छा खेलना और एक संयोग वाला सेव भी अलग दिखते हैं। एक शानदार सेव अच्छा लगता है, पर लेवल पार करने के लिए बार-बार फ़ैसले और हरकतें चाहिए। छोटे ऑनलाइन गोलकीपर गेम के लिए यह बिना किसी चेकपॉइंट वाली अंतहीन धारा से कहीं बेहतर बैठता है।
इंजन को कैमरे से अलग रखना
गेम का मुख्य इंजन React, वेबकैम या पोज़ लैंडमार्क के बारे में कुछ नहीं जानता। शूटर, तैयारी, गेंद की उड़ान, घुमाव, शॉट के नतीजे, लेवल के नियम और स्कोर, सब उसके पास हैं। पेज उसे स्टेज का आकार और एक सेव-जाँच फ़ंक्शन दे देता है।
इस सीमा से ज़रूरी नियम कैमरा चालू किए बिना परखे जा सकते हैं। मैं इंजन को एक तय किस्म का रैंडम स्रोत दे सकता हूँ, समय आगे बढ़ा सकता हूँ, गेंद का रास्ता देख सकता हूँ और जाँच सकता हूँ कि लेवल कब पार होना चाहिए या ख़त्म। पोज़ की ज्यामिति एक अलग मॉड्यूल में रहती है, जहाँ उसे ज्यामिति की तरह ही परखा जा सकता है।
ब्राउज़र का लूप requestAnimationFrame() पर चलता है। मैं फ़्रेमों के बीच बीता समय नापकर इंजन को देता हूँ, ताकि ज़्यादा रिफ़्रेश रेट वाली स्क्रीन पर गेंद सिर्फ़ इसी वजह से तेज़ न चलने लगे।
Keeper बनाकर मैंने क्या सीखा
मुश्किल इंसान को पहचानना नहीं था। मुश्किल यह तय करना था कि वह इंसान डिजिटल गोल में कैसे खड़ा हो, जबकि शॉट असली रिएक्शन के दबाव जैसा लगने लगे।
गेम तब चलने लगा जब मैंने पोज़ लैंडमार्क को तैयार कंट्रोलर मानना छोड़ दिया। वे कच्चा माल हैं। कंट्रोलर कैलिब्रेशन, पलटाव, सापेक्ष निर्देशांक, बढ़ाए हुए झुकाव, दृश्यता की जाँच और टक्कर वाली आकृतियों से बनता है। एहसास पढ़ने लायक़ तैयारी, दिखती टक्कर और ऐसे कठिनाई वक्र से आता है जो नियम बदले बिना समस्या बदल देता है।
वेबकैम गेम्स की यही बात मुझे अच्छी लगती है। पीछे का तकनीकी सिस्टम पेचीदा है, पर खिलाड़ी के लिए निर्देश सीधा रह सकता है: शूटर को आते देखिए, शॉट पर नज़र रखिए, गेंद की तरफ़ हाथ बढ़ाइए और सेव कीजिए। शुरुआती लेवल यह क्रम सीखने का समय देते हैं। ऊँचे लेवल इसे आधे सेकंड के अंदर करने को कहते हैं।
आप अपने ब्राउज़र में Keeper मुफ़्त खेल सकते हैं। अनुभव का छोटा परिचय चाहिए तो मेरी साथी गाइड AR फ़ुटबॉल गेम पढ़िए। और यह देखना हो कि इसी पोज़ पाइपलाइन को मैंने गोलकीपिंग की जगह दौड़ने के लिए कैसे इस्तेमाल किया, तो मैंने Dino Survival कैसे बनाया पढ़िए।