क्या मैं एक 2 डी गेम में एक टॉर्चलाइट प्रभाव (एक प्रकाश स्रोत के आसपास हल्का क्षेत्र) प्राप्त कर सकता हूं?


16

मैं खुद को एक साधारण 2 डी गेम लिखने के बारे में सोच रहा हूं। यह पहली बार में सही ग्राफिक्स या गेमप्ले के साथ नहीं चमकेगा, लेकिन मैं इसे पीसी गेम के विकास में अपना पहला कदम मानूंगा। तो, इस तरह के सरल स्प्राइट-आधारित 2 डी गेम (जैसे हीरोज IV या स्टार्टक्राफ्ट ब्रोडवेयर) की कल्पना करें।

मैं चाहता हूं कि गेमप्ले दिन / रात के हिसाब से लाइटिंग में बदलाव के साथ सपोर्ट करे और साथ ही हर लाइटिंग न्यूसेंस के लिए स्प्राइट्स बनाना पागलपन होगा। इसलिए, मैंने तय किया कि अन्य वस्तुओं के ऊपर एक अर्ध-पारदर्शी परत जोड़ना पर्याप्त होगा।

इस समाधान के साथ मुद्दा यह है कि क्या मेरे पास खेल में एक प्रकाश स्रोत वस्तु है (जैसे कि एक मशाल पहने हुए नायक, या एक जलती हुई इमारत), इसके चारों ओर एक हल्का क्षेत्र होना चाहिए, है ना? चूँकि मैं अपनी अर्ध-पारदर्शी परत को हर चीज के ऊपर रख रहा हूँ, तो आप कैसे मशाललिग दृश्य प्रभाव को प्राप्त करने का सुझाव देंगे? हो सकता है कि प्रकाश प्रभाव के आधार पर उस परत को 'अंतराल' या अलग-अलग रंग वाले क्षेत्रों में जोड़ा जाए?


2
मास्क जाने का रास्ता हो सकता है
Gustavo Maciel

5
शीर्षक में "टॉर्चलाइट" को टॉर्चलाइट नाम के खेल के कारण भ्रमित किया जा सकता है।
टेट्राद

4
@ टेट्राद तब तक ठीक होना चाहिए जब तक कि इसका कैपिटल न हो। मेरे लिए, मशाल की रोशनी आपकी टिप्पणी पढ़ने तक बिल्कुल भी समझ में नहीं आई।
प्रसिद्धगर्किन

फिर भी, मैंने शीर्षक को अधिक विशिष्ट बनाने के लिए एक संपादन का सुझाव दिया।
प्रसिद्धगर्किन

जवाबों:


12

मैं नहीं जानता कि आप क्या प्रोग्रामिंग कर रहे हैं, लेकिन यह है कि मैंने इसे XNA में कैसे संभाला:

  1. ड्रॉ कॉल पर, एक List<Light>ऑब्जेक्ट बनाया / साफ़ किया जाता है।
  2. टाइल ड्रॉ लूप के दौरान, प्रत्येक टाइल को यह देखने के लिए जांचा जाता है कि उसके साथ कोई लाइट्स जुड़ी हुई है या नहीं। यदि ऐसा होता है, तो Lightवस्तुओं को जोड़ दिया जाता है List<Light>
  3. टाइल्स अपने आप खींची जाती हैं RenderTarget2D
  4. टाइल लूप के बाद, s की सूची के Lightमाध्यम से पुनरावृत्त किया जाता है और RenderTarget2Dएक बनावट का उपयोग करके अपने आप खींचा
    प्रकाश बनावटजाता है जो मैंने इस तरह दिखता है: (नोट: मैंने यहां R, G और B मानों का उपयोग किया है लेकिन आपको शायद अपने में अल्फा चैनल का उपयोग करना चाहिए वास्तविक बनावट।)
  5. कस्टम शेडर का उपयोग करते हुए, मैं टाइल की सतह को स्क्रीन पर रेंडर करता हूं और प्रकाश सतह में एक पैरामीटर के रूप में पास करता हूं जो प्रत्येक पिक्सेल पर "अंधेरे" मूल्य के लिए नमूना होता है।


अब, ध्यान देने योग्य कुछ बातें हैं:

अंक 4 के बारे में:

मेरे पास वास्तव में दो कस्टम शेड्स हैं, एक तो लाइट्स को लाइटिंग रेंडर टारगेट (स्टेप 4) पर और दूसरा लाइट को रेंडर टारगेट (स्टेप 5) का उपयोग करके स्क्रीन पर टाइल रेंडर टारगेट खींचने के लिए।
बिंदु 4 पर इस्तेमाल किया जाने वाला शेडर मुझे एक "चमकदारता" मूल्य जोड़ने के लिए अनुमति देता है (जिसे मैं कॉल करता हूं)। यह मान एक है floatजो बनावट में प्रत्येक पिक्सेल के मुकाबले गुणा हो जाता है इससे पहले कि यह रेंडर टारगेट में जोड़ा जाता है ताकि मैं अनिवार्य रूप से रोशनी को तेज या गहरा कर सकूं।
इस बिंदु पर, मैं प्रकाश के "स्केल" मान को भी ध्यान में रखता हूं जिसका मतलब है कि मेरे पास केवल एक बनावट का उपयोग करके बड़ी या छोटी रोशनी हो सकती है।

अंक 5 के बारे में:

लाइटिंग रेंडर टारगेट के बारे में सोचें, जैसा कि 0 (ब्लैक) से लेकर 1 (व्हाइट) तक प्रत्येक पिक्सल के लिए अनिवार्य रूप से वैल्यू है। शेडर अनिवार्य रूप से गुणा करता है जो टाइल में पिक्सेल के लिए RGB मानों के विरुद्ध मूल्य को अंतिम आहरित छवि बनाने के लिए लक्ष्य प्रदान करता है।

मेरे पास यहां कुछ और कोड भी हैं जहां मैं (shader में) पास करता हूं, दिन / रात उपरिशायी रंग के रूप में उपयोग किए जाने वाला मान। यह आरजीबी मूल्यों में भी गुणा किया गया है और प्रकाश रेंडर में लक्ष्य गणना शामिल है।


अब, यह आपको ऑब्जेक्ट्स के चारों ओर जाने से ब्लॉक लाइट जैसी चीजों को करने की अनुमति नहीं देगा और कम से कम लेकिन, मेरे उद्देश्यों के लिए, यह सरल है और अच्छी तरह से काम करता है।

मैंने यहाँ और अधिक विस्तृत ब्लॉग पोस्ट लिखे हैं जो यहाँ आपकी मदद कर सकते हैं। मेरे पास अभी समय नहीं है, लेकिन यदि आप चाहते हैं कि मैं यहां gamedev पर अधिक विस्तार में जा सकता हूं।

ओह, और यहाँ यह मेरे नक्शे संपादक में एक नज़र है:यहाँ छवि विवरण दर्ज करें


एक सूची बनाएं और साफ़ करें हर फ्रेम बहुत महंगा नहीं हो सकता है?
गुस्तावो मैकिएल

@Gtoknu मेरे खेल में कोई ध्यान देने योग्य अंतर नहीं करता है। सूची सिर्फ उन वस्तुओं के संदर्भ में है जो पहले से ही स्मृति में मौजूद हैं इसलिए ऐसा नहीं है कि हर प्रकाश को फिर से बनाया जा रहा है या कुछ भी, बस एक सूची।
रिचर्ड मार्स्केल - Drackir

आप सही हो सकते हैं, पूरी तरह से नहीं, लेकिन आप। बेशक, आप पूर्ण ऑब्जेक्ट नहीं बना रहे हैं, लेकिन आप संदर्भों को जोड़ रहे हैं, फिर भी कम उपयोग, लेकिन अभी भी उपभोग कर रहे हैं। आप एक अच्छे तरीके से कर रहे हैं, लेकिन मुझे लगता है कि यह बेहतर हो सकता है अगर आप सूची को ड्रा विधि से बाहर रखते हैं, क्योंकि अपडेट में तर्क करना ड्रॉ की तुलना में बहुत तेज़ है
गुस्तावो मैकिएल

@Gtoknu ज़रूर, आप जहाँ चाहें सूची की घोषणा कर सकते हैं लेकिन मुद्दा यह है कि रोशनी टाइलों के साथ जुड़ी हुई है। टाइल Drawविधि वह जगह है जहां आपको पता चलता है कि टाइल में रोशनी है या नहीं। मैं Updateविधि में सभी खींची गई टाइलों के माध्यम से लूप नहीं करता हूं, इसलिए मैं इसके लिए अतिरिक्त ओवरहेड जोड़ूंगा। इसके अलावा, XNA यह गारंटी देने की कोशिश करता है कि Updateउसे 60 बार प्रति सेकंड कहा जाएगा, इसलिए वह इसके Drawलिए कॉल का त्याग कर सकता है , जिसका अर्थ है कि इस कोड को वास्तव में कम बार बुलाया जाएगा।
रिचर्ड मार्स्केल - Drackir

उस सब ने कहा, यह एक मूक बिंदु है क्योंकि मैंने अंततः स्थानिक विभाजन के आधार पर रोशनी को अपनी सूची में स्थानांतरित कर दिया और स्क्रीन को अवरुद्ध करने वाले खंडों में सभी रोशनी को आकर्षित किया। मैंने समय की कमी के लिए अपनी पोस्ट में इस बारे में बात नहीं की, लेकिन यह मेरे द्वारा जुड़े दूसरे ब्लॉग पोस्ट में उल्लिखित है।
रिचर्ड मार्स्केल - Drackir

9

आम तौर पर, 2D गेम में लाइटिंग आपके सभी स्प्राइट्स के लिए नॉर्मल मैप होने से होती है , फिर अपने 2D स्प्राइट्स पर 3D लाइटिंग इफेक्ट्स की गणना करें। इसे शिथिल "2.5D" के रूप में जाना जाता है। मैं हालांकि आपके पहले गेम में ऐसा करने की सिफारिश नहीं करूंगा क्योंकि यह जटिल है।

यहाँ XNA में ऐसा करने वाले किसी व्यक्ति का एक भयानक वीडियो है: http://www.youtube.com/watch?v=-Q6ISVaM5Ww

उस ने कहा, संभवतः छद्म-प्रकाश व्यवस्था को धोखा देने और प्राप्त करने के तरीके हैं जो विभिन्न मान्यताओं के साथ काम कर सकते हैं।


ऐसी अविश्वसनीय तकनीक का उल्लेख करने के लिए +1 से पहले ही इस वीडियो को देखा।
गुस्तावो मैकिएल

सलाह और वीडियो लिंक के लिए धन्यवाद। वास्तव में एक नक्शा एक समाधान प्रतीत होता है। मैं स्वयं 'अंतर' बनाने के लिए, या अंतर्निहित वस्तुओं पर इसके प्रभाव को बदलने के लिए अपने शीर्ष स्तर पर मानचित्र का उपयोग करने का प्रयास करूंगा।
Ivaylo Slavov

5

यदि आप जिस प्रभाव को प्राप्त करने की कोशिश कर रहे हैं, उसके बारे में पूरी तरह से विशिष्ट नहीं होने पर एक दृष्टिकोण सुझाना कठिन है। विवरण जैसे कि रोशनी को पर्यावरण द्वारा बाधित किया जाना चाहिए या नहीं, आपके खेल का दृष्टिकोण क्या है, प्रकाश को किस हद तक पर्यावरण के साथ बातचीत करनी चाहिए, आदि।

मैं अपने दो सेंट छोड़ दूँगा। देखें कि कैटलिन ज़िमा द्वारा डायनामिक 2 डी शैडो के इस ट्यूटोरियल को आपके बिल में फिट किया गया है या नहीं। जैसा कि आप देख सकते हैं, प्रकाश की त्रिज्या है और बाधाओं से नहीं गुजरती है। आप त्रिज्या और रंग को चेतन कर सकते हैं ताकि यह वास्तविक मशाल प्रकाश के करीब दिख सके।

यहाँ छवि विवरण दर्ज करें

इस मामले में, प्रकाश आपके दृश्य के ऊपर ओवरले की तरह काम करता है, लेकिन जॉन के उदाहरण में इसके साथ उसी तरह से बातचीत नहीं करता है, हालांकि यह बाधाओं को ध्यान में रखता है।

संपादित करें

कैटालिन ने एक अन्य लेख के लिंक को संदर्भ के रूप में इस्तेमाल किया, लेकिन लिंक टूट गया है। यहाँ एक अद्यतन लिंक है


धन्यवाद, मुझे लगता है कि यह वह प्रभाव नहीं है जो मैं बाद में हूं, लेकिन फिर भी साझा करने के लिए धन्यवाद :)
Ivaylo Slavov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.