एचटीएमएल 5 और जावास्क्रिप्ट के पक्ष में एडोब द्वारा फ्लैश को धीरे-धीरे छोड़ दिया जा रहा है; इसका आधिकारिक अंत-जीवन वर्ष 2020 के लिए निर्धारित है। और यही वह लेख है जहां यह लेख आसान हो जाएगा।
नीचे वर्णित टिप्स एचटीएमएल 5 गेम डेवलपर्स को जावास्क्रिप्ट में बदलने के दौरान सामान्य गलतियों से बचें, साथ ही पूरी विकास प्रक्रिया को जितना संभव हो सके उतना आसानी से चलते हैं। आपको केवल जावास्क्रिप्ट, वेबजीएल और फ़ासर ढांचे का मूल ज्ञान चाहिए।
एसडब्ल्यूएफ से जावास्क्रिप्ट तक अपने गेम डिज़ाइन को बदलना बेहतर हो सकता है प्रयोगकर्ता का अनुभव , जो बदले में इसे आधुनिक रूप देता है। लेकिन इसे कैसे करें? क्या आपको इस पुरानी तकनीक से छुटकारा पाने के लिए एक समर्पित जावास्क्रिप्ट गेम कनवर्टर की आवश्यकता है? खैर, एचटीएमएल 5 रूपांतरण के लिए फ्लैश केक का एक टुकड़ा हो सकता है - यहां एक अनुभवी जावास्क्रिप्ट गेम डेवलपर को इस मामले के बारे में क्या कहना है।
अपनी डिजाइन प्रक्रिया को सरल रखना पसंद है? ए [3 9] वेबसाइट निर्माता
एक गेम को दूसरे प्लेटफ़ॉर्म में कनवर्ट करना इसे बेहतर बनाने, अपने मुद्दों को ठीक करने और दर्शकों को बढ़ाने का एक उत्कृष्ट अवसर है। नीचे कुछ चीजें हैं जिन्हें आसानी से किया जा सकता है और विचार करने के लायक हैं:
जब जावास्क्रिप्ट गेम डेवलपमेंट की बात आती है, तो यह इन-गेम बटन, विजेट और अन्य जीयूआई तत्वों के लिए एचटीएमएल और सीएसएस का लाभ उठाने के लिए मोहक हो सकती है। हमारी सलाह यहां सावधान रहना है। यह counterintuitive है, लेकिन वास्तव में leveraging डीओएम तत्व जटिल खेलों पर कम प्रदर्शनकारी है और यह मोबाइल पर अधिक महत्व प्राप्त करता है। यदि आप सभी प्लेटफार्मों पर निरंतर 60 एफपीएस प्राप्त करना चाहते हैं, तो एचटीएमएल और सीएसएस से इस्तीफा देना आवश्यक हो सकता है।
गैर-इंटरैक्टिव जीयूआई तत्व, जैसे स्वास्थ्य सलाखों, एएमएमओ बार या स्कोर काउंटर को नियमित छवियों ('फ़ेसर.मेज' वर्ग) का उपयोग करके फेसर में आसानी से कार्यान्वित किया जा सकता है, '.crop' संपत्ति को ट्रिमिंग और 'फेसर के लिए ले जाया जा सकता है। सरल पाठ लेबल के लिए पाठ 'कक्षा।
बटन और चेकबॉक्स जैसे इंटरैक्टिव तत्व अंतर्निहित 'फ़ेसर.बटन' क्लास का उपयोग करके कार्यान्वित किए जा सकते हैं। अन्य, अधिक जटिल तत्वों को विभिन्न सरल प्रकारों, जैसे समूह, छवियों, बटन और टेक्स्ट लेबल से बना दिया जा सकता है।
यदि आप एक कस्टम वेक्टर फ़ॉन्ट (जैसे टीटीएफ या ओटीएफ) के साथ पाठ प्रस्तुत करना चाहते हैं, तो आपको यह सुनिश्चित करने की ज़रूरत है कि किसी भी पाठ को प्रस्तुत करने से पहले फ़ॉन्ट को ब्राउज़र द्वारा पहले ही लोड किया जा चुका है। फेसर v2.6 इस उद्देश्य के लिए समाधान प्रदान नहीं करता है, लेकिन एक और पुस्तकालय का उपयोग किया जा सकता है - वेब फ़ॉन्ट लोडर [8 9] ।
यह मानते हुए कि आपके पास फ़ॉन्ट फ़ाइल है और आपके पृष्ठ में वेब फ़ॉन्ट लोडर शामिल करें, फिर नीचे फ़ॉन्ट लोड करने का एक सरल उदाहरण है। एक साधारण सीएसएस फ़ाइल बनाएं जो वेब फ़ॉन्ट लोडर द्वारा लोड की जाएगी (आपको इसे अपने HTML में शामिल करने की आवश्यकता नहीं है):
[9 3] @ फ़ॉन्ट-फेस { // यह नाम आप जेएस में उपयोग करेंगे फ़ॉन्ट-परिवार: 'गुनप्ले'; // फ़ॉन्ट फ़ाइल के लिए यूआरएल, सापेक्ष या पूर्ण हो सकता है एसआरसी: यूआरएल ('.. / फोंट / gunplay.ttf') प्रारूप ('Truetype'); फ़ॉन्ट-वजन: 400; } [9 4]अब WebFontConfig नामक एक वैश्विक चर को परिभाषित करें। इसके रूप में सरल कुछ आमतौर पर पर्याप्त होगा:
[9 3] var webfontconfig = { 'कक्षाएं': गलत, 'टाइमआउट': 0, 'सक्रिय': फ़ंक्शन () { // फ़ॉन्ट सफलतापूर्वक लोड हो गया है ... }, 'कस्टम': { 'परिवार': ['गनप्ले'], // पहले उल्लिखित सीएसएस के लिए यूआरएल 'URL': ['शैलियों / fonts.css'] } };अपने कोड को ऊपर दिखाए गए 'सक्रिय' कॉलबैक में रखना याद रखें। और बस!
अब हम जावास्क्रिप्ट रूपांतरण के लिए हमारे फ्लैश के मध्य बिंदु में हैं - यह शेडर्स की देखभाल करने का समय है। एक्शनस्क्रिप्ट में स्थानीय डेटा को लगातार संग्रहीत करने के लिए आप 'Sharewobject' वर्ग का उपयोग करेंगे। जावास्क्रिप्ट में, सरल प्रतिस्थापन है स्थानीय स्टोरेज एपीआई [8 9] , जो बाद में पुनर्प्राप्ति, जीवित पृष्ठ पुनः लोड के लिए तारों को संग्रहीत करने की अनुमति देता है।
डेटा बचत बहुत आसान है:
[10 9] var प्रगति = 15; localstorage.setitem ('mygame.progress', प्रगति); [9 4]ध्यान दें कि उपरोक्त उदाहरण में 'प्रगति' चर, जो एक संख्या है, को एक स्ट्रिंग में परिवर्तित कर दिया जाएगा।
लोडिंग भी सरल है, लेकिन याद रखें कि यदि वे मौजूद नहीं हैं तो पुनर्प्राप्त मूल्य तार या शून्य होंगे।
[10 9] var progress = parseint (localstorage.getitem ('mygame.progress')) || 0;यहां हम यह सुनिश्चित कर रहे हैं कि रिटर्न वैल्यू एक संख्या है। यदि यह अस्तित्व में नहीं है, तो 0 को 'प्रगति' चर को सौंपा जाएगा।
आप अधिक जटिल संरचनाओं को भी स्टोर और पुनर्प्राप्त कर सकते हैं, उदाहरण के लिए, JSON:
[10 9] var आँकड़े = {'लक्ष्यों': 13, 'जीत': 7, 'नुकसान': 3, 'ड्रा': 1 }; localstorage.setitem ('mygame.stats', json.stringify (आँकड़े)); ... var आँकड़े = json.parse (localstorage.getitem ('mygame.stats')) || {};कुछ मामले हैं जब 'लोकलस्टोरेज' ऑब्जेक्ट उपलब्ध नहीं होगा। उदाहरण के लिए, फ़ाइल का उपयोग करते समय: // प्रोटोकॉल या जब कोई पृष्ठ किसी निजी विंडो में लोड होता है। आप यह सुनिश्चित करने के लिए 'कोशिश करें और कैच' कथन का उपयोग कर सकते हैं, यह सुनिश्चित करने के लिए कि आपका कोड दोनों काम करना जारी रखेगा और डिफ़ॉल्ट मानों का उपयोग करेगा, जो नीचे दिए गए उदाहरण में दिखाया गया है:
[10 9] कोशिश करो { var progress = localstorage.getitem ('mygame.progress'); } कैच (अपवाद) { // लोकलस्टोरेज उपलब्ध नहीं है, डिफ़ॉल्ट मानों का उपयोग करें } [9 4]याद रखने की एक और बात यह है कि संग्रहीत डेटा प्रति डोमेन सहेजा गया है, प्रति यूआरएल नहीं। तो यदि कोई जोखिम है कि एक डोमेन पर कई गेम होस्ट किए जाते हैं, तो बचत करते समय उपसर्ग (नेमस्पेस) का उपयोग करना बेहतर होता है। उपरोक्त उदाहरण में, 'MyGame'। एक उपसर्ग है और आप आमतौर पर इसे खेल के नाम से बदलना चाहते हैं।
यदि आपका गेम आईफ्रेम में एम्बेडेड है, तो स्थानीय स्टोरेज आईओएस पर नहीं बनेगा। इस मामले में, आपको इसके बजाय मूल iframe में डेटा स्टोर करने की आवश्यकता होगी।
जब फेसर और पिक्सेज आपके sprites प्रस्तुत करते हैं, तो वे एक साधारण आंतरिक टुकड़ा शेडर का उपयोग करते हैं। इसमें कई विशेषताएं नहीं हैं क्योंकि यह गति के लिए तैयार है। हालांकि, आप अपने उद्देश्यों के लिए उस शेडर को प्रतिस्थापित कर सकते हैं। उदाहरण के लिए, आप प्रतिपादन के लिए अधिक सुविधाओं का निरीक्षण करने या अधिक सुविधाओं का समर्थन करने के लिए इसका लाभ उठा सकते हैं। नीचे फ़ेसर वी 2 में अपने स्वयं के डिफ़ॉल्ट खंड शेडर की आपूर्ति कैसे करें इसका एक उदाहरण है।
[10 9] फंक्शन प्रीलोड () { this.load.shader ('filename.frag', 'शेडर्स / filename.frag'); } फंक्शन बनाएं () { var renderer = this.renderer; var batch = renderer.spritebatch; batch.defaultshader = नया pixi.abstractfilter (this.cache.getshader ('filename.frag')); batch.setcontext (renderer.gl); } [9 4]फेसर और पिक्सेज में डिफ़ॉल्ट टिनटिंग विधियों को बदलने के लिए एक कस्टम डिफ़ॉल्ट शेडर का उपयोग किया जा सकता है। फेसर और पिक्सेज में टिनटिंग एक दिए गए रंग द्वारा बनावट पिक्सल को गुणा करके काम करता है। गुणा हमेशा रंगों को अंधेरा करता है, जो स्पष्ट रूप से कोई समस्या नहीं है; यह फ्लैश टिनटिंग से अलग है। हमारे खेलों में से एक के लिए हमें फ्लैश के समान टिनटिंग को लागू करने की आवश्यकता थी और निर्णय लिया कि एक कस्टम डिफ़ॉल्ट शेडर का उपयोग किया जा सकता है। नीचे इस तरह के एक टुकड़ा शेडर का एक उदाहरण है:
[10 9]// विशिष्ट टिंट संस्करण, फ्लैश टिनटिंग के समान जो जोड़ता है // रंग के लिए और गुणा नहीं करता है। एक रंग का नकारात्मक // इस शेडर के लिए ठीक से काम करने के लिए आपूर्ति की जानी चाहिए, यानी सेट // sprite.tint 0 से 0 तक स्प्राइट को सफेद करने के लिए। प्रेसिजन लोप फ्लोट; अलग-अलग vec2 vtexturecoord; अलग-अलग vec4 vcolor; वर्दी sampler2d usampler; शून्य मुख्य (शून्य) { Vec4 एफ = Texture2D (Usampler, VtextureCoord); फ्लोट ए = क्लैंप (vcolor.a, 0.00001, 1.0); gl_fragcolor.rgb = f.rgb * vcolor.a + क्लैंप (1.0 - vcolor.rgb / a, 0.0, 1.0) * vcolor.a * f.a; gl_fragcolor.a = f.a * vcolor.a; } [9 4]यह शेडर टिंट वन में बेस रंग जोड़कर पिक्सेल को लाता है। इसके लिए काम करने के लिए, आपको अपने इच्छित रंग के नकारात्मक आपूर्ति की आवश्यकता है। इसलिए, सफेद होने के लिए, आपको सेट करने की आवश्यकता है:
[10 9] sprite.tint = 0x000000; // यह स्प्राइट को सफेद रंग में रंग देता है Sprite.tint = 0x00ffff; // यह लाल देता है
डिबगिंग के साथ मदद करने के लिए एक डिफ़ॉल्ट शेडर को प्रतिस्थापित करने के लिए भी लीवरेज किया जा सकता है। नीचे हमने समझाया है कि इस तरह के एक शेडर के साथ ओवरड्रा का पता लगाया जा सकता है।
ओवरड्राडिंग तब होती है जब स्क्रीन पर कई या सभी पिक्सल कई बार प्रदान किए जाते हैं। उदाहरण के लिए, कई वस्तुएं एक ही स्थान ले रही हैं और एक दूसरे पर प्रस्तुत की जा रही हैं। प्रति सेकंड एक जीपीयू कितने पिक्सेल को भरने की दर के रूप में वर्णित कर सकते हैं। आधुनिक डेस्कटॉप जीपीयू में सामान्य 2 डी उद्देश्यों के लिए अत्यधिक भरने की दर है, लेकिन मोबाइल लोग बहुत धीमे हैं।
स्क्रीन पर प्रत्येक पिक्सेल को पिक्सेज और फ़ेसर में डिफ़ॉल्ट ग्लोबल फ्रैगमेंट शेडर को प्रतिस्थापित करके कितनी बार लिखा गया एक आसान तरीका है:
[10 9] शून्य मुख्य (शून्य) { gl_fragcolor.rgb + = 1.0 / 7.0; } [9 4]यह शेडर पिक्सेल को हल्का करता है जिन्हें संसाधित किया जा रहा है। संख्या 7.0 इंगित करता है कि पिक्सेल को सफेद करने के लिए कितने लिखने की आवश्यकता होती है; आप इस नंबर को अपनी पसंद के अनुसार ट्यून कर सकते हैं। दूसरे शब्दों में, स्क्रीन पर हल्का पिक्सल कई बार लिखे गए थे, और सफेद पिक्सेल कम से कम सात बार लिखे गए थे।
यह शेडर भी 'अदृश्य' ऑब्जेक्ट्स दोनों को खोजने में मदद करता है कि किसी कारण से अभी भी प्रस्तुत किया गया है, और स्प्राइट्स जिनके पास अत्यधिक पारदर्शी क्षेत्र हैं जिनके पास छीनने की जरूरत है (जीपीयू को अभी भी आपके बनावट में पारदर्शी पिक्सल को संसाधित करने की आवश्यकता है)।
एक भौतिकी इंजन एक मिडिलवेयर है जो भौतिकी निकायों (आमतौर पर कठोर शरीर की गतिशीलता) और उनके टकराव को अनुकरण करने के लिए ज़िम्मेदार है। भौतिकी इंजन 2 डी या 3 डी रिक्त स्थान अनुकरण करते हैं, लेकिन दोनों नहीं। एक ठेठ भौतिकी इंजन प्रदान करेगा:
एक फ़ेसर प्लगइन है जो इस उद्देश्य के लिए अच्छी तरह से काम करता है। एकता गेम इंजन और गेममेकर स्टूडियो 2 में बॉक्स 2 डी का भी उपयोग किया जाता है।
जबकि एक भौतिकी इंजन आपके विकास को तेज करेगा, वहां एक कीमत है जिसे आपको भुगतान करना होगा: कम रनटाइम प्रदर्शन। टकराव और गणना प्रतिक्रियाओं का पता लगाना एक सीपीयू-गहन कार्य है। आप मोबाइल फोन या चेहरे अपमानित प्रदर्शन के दृश्य में कई दर्जन गतिशील वस्तुओं तक सीमित हो सकते हैं, साथ ही 60 एफपीएस से नीचे गहरे फ्रेम दर भी सीमित हो सकते हैं।
यदि आपके पास एक .fla फ़ाइल के अंदर एक फ़्लैश गेम ध्वनि प्रभाव है, तो जीयूआई से उन्हें निर्यात करना संभव नहीं है (कम से कम एडोब एनिमेट सीसी 2017 में नहीं) इस उद्देश्य की सेवा करने वाले मेनू विकल्पों की कमी के कारण। लेकिन एक और समाधान है - एक समर्पित स्क्रिप्ट जो सिर्फ यही करती है:
[10 9] फ़ंक्शन NormalizeFilename (नाम) { // एक camelcase नाम को snake_case नाम में परिवर्तित करता है वापसी name.replace (/ ([a-z]) / जी, '_ $ 1')। (/ ^ _ /, '') .toLowerCase (); } फंक्शन डिस्प्लेपैथ (पथ) { // फ़ाइल पथ को अधिक पठनीय बनाता है Unescape (पथ) लौटें। प्रासल ('फ़ाइल: ///', '')। प्रासल ('|', ':'); } fl.outputpanel.clear (); अगर (fl.getdocumentdom ()। library.getselectedems ()। लंबाई & gt; 0) // केवल चयनित आइटम प्राप्त करें var पुस्तकालय = fl.getdocumentdom ()। पुस्तकालय। GetEtelectedEms (); अन्य // सभी आइटम प्राप्त करें var पुस्तकालय = fl.getdocumentdom ()। पुस्तकालय। Items; // निर्यात गंतव्य निर्देशिका के लिए उपयोगकर्ता से पूछें var root = fl.browseforfolderurl ('एक फ़ोल्डर का चयन करें'); var त्रुटियों = 0; के लिए (var i = 0; i & lt; librage.length; i ++) { var आइटम = पुस्तकालय [i]; यदि (item.itemtype! == 'ध्वनि') जारी रखें; var पथ = रूट + '/'; यदि (item.originalcompressiontype === 'रॉ') पथ + = normalizefilename (item.name.split ('।')ध्वनि फ़ाइलों को निर्यात करने के लिए स्क्रिप्ट का उपयोग कैसे करें:
हॊ गया! अब आपके पास निर्दिष्ट निर्देशिका में डब्ल्यूएवी फाइलें होनी चाहिए। क्या करना बाकी है, उदाहरण के लिए, एमपी 3, ओजीजी या एएसी। (यदि आपके पास सुरक्षित रखने के लिए गेम फाइलें हैं, तो सभ्य में अपग्रेड करें [3 9] घन संग्रहण
अच्छा पुराना एमपी 3 प्रारूप वापस आ गया है, क्योंकि कुछ पेटेंट समाप्त हो गए हैं और अब प्रत्येक ब्राउज़र एमपी 3 को डीकोड और प्ले कर सकता है। यह विकास को थोड़ा आसान बनाता है, क्योंकि अंत में दो अलग-अलग ऑडियो प्रारूप तैयार करने की कोई आवश्यकता नहीं है। पहले आपको, उदाहरण के लिए, ओजीजी और एएसी फाइलों की आवश्यकता थी, जबकि अब एमपी 3 पर्याप्त होगा।
फिर भी, एमपी 3 के बारे में याद रखने के लिए आपको दो महत्वपूर्ण चीजें हैं:
यह आलेख मूल रूप से क्रिएटिव वेब डिज़ाइन पत्रिका वेब डिज़ाइनर के अंक 277 में प्रकाशित हुआ था। यहां अंक 277 खरीदें [8 9] या वेब डिजाइनर की सदस्यता लें [8 9] ।
[3 9] संबंधित आलेख:
(छवि क्रेडिट: मार्क इवान लिम) [1 9] फ़ोटोशॉप में..
(छवि क्रेडिट: रोब लुन) [1 9] यदि आप सोच रहे हैं कि..
(छवि क्रेडिट: फिल नोलन) [1 9] रियलिटी कैप्चर अपन..
आर्किटेक्चरल विजुअलाइजेशन बनाते समय आपको बहुत स..
जब भी हम रखरखाव और स्केलेबल वेबसाइटों के निर्माण ..
एडोब आज वीडियो ट्यूटोरियल की एक नई श्रृंखला लॉन्च कर रहा है जिसे इसे अब ब�..
मैं एक दृढ़ आस्तिक हूं कि आपको पूरी तरह से आपके लि�..
मैं बैठ गया, कुछ संगीत खेला, रोशनी मंद हो गया और मे�..