2012-03-25 18 views
5

मैं अपने XNA 2 डी टाइल आधारित खेल के लिए प्रकाश व्यवस्था जोड़ रहा।2 डी टाइल प्रकाश

मैं this लेख उपयोगी पाया है, लेकिन जिस तरह से अपनी किया यह टकराव का समर्थन नहीं करता। क्या मैं चाहता हूँ निम्नलिखित

  • हमेशा बिंदु जलाया है क्या करने के लिए एक विधि है
  • टकराव (प्रकाश किरण एक ब्लॉक मारता है, तब तक जो कुछ भी अपने अंधेरे जब तक राशि छाया अनुकरण करने के लिए अगले ब्लॉक मंद)

मैं काफी कुछ समय के लिए चारों ओर खोज किया गया है, लेकिन कोई किस्मत (मैं Catalin के ट्यूटोरियल मिला, लेकिन यह थोड़ा मेरे लिए उन्नत लग रहा था, और टाइल्स के लिए अच्छी तरह से कारण के लिए पूरे खेल redrawing पर लागू नहीं होता प्रत्येक बिंदु)

उत्तर

1

मैं एक 2 डी टाइल ग्रिड से एक चिकनी प्रकाश प्रभाव को लागू करने के लिए मेरे विधि साझा करेंगे। क्लासिक थंडर का answer छाया के लिए एक अच्छा लिंक प्रदान करता है।

सबसे पहले, हम प्रत्येक टाइल जो बाद में धुंधला हो जाएगा की प्रकाश व्यवस्था मूल्यों की गणना करने की आवश्यकता होगी। मुझे कोड में आने से पहले यह बताता है कि यह कैसे काम करता है।

Lighting

मूल रूप से हम क्या ऊपर से शुरू, सभी टाइल के माध्यम से लूप है, अगर एक टाइल खाली है,, अधिकतम चमक के CurrentLight चर सेट अगर हम एक ठोस टाइल खोजने के लिए, के रूप में सेट CurrentLight परिवर्तनीय और CurrentLight से "अवशोषण" राशि घटाएं। इस तरह, हमारे अगले ठोस टाइल पर, जब हम टाइल को CurrentLight मान पर सेट करते हैं, तो यह थोड़ा कम होगा। सरणी को फिर से चालू होने तक यह प्रक्रिया दोहराई जाती है।

अब नीचे प्रकाश प्रभाव के लिए एक अच्छा शीर्ष पर होगा, लेकिन यह है कि महान नहीं है। हमें इस प्रक्रिया को 3 से अधिक बार, नीचे से ऊपर, बाएं से दाएं, और दाएं से बाएं करने के लिए दोहराना होगा। और इसे बेहतर गुणवत्ता के लिए और बार दोहराया जा सकता है।

मूल रूप से

if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light 
    CurrentLightR = tile.Light; 
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light 
    tile.Light = CurLightR; 
if (tile.Light == CurLightR) //If it is the same, subtract absorb values 
    CurrentLight -= tile.Absorb; 

पाश में हर टाइल पर इस कोड चलाने और वहाँ तुम जाओ, अच्छा टाइल प्रकाश। हालांकि यदि आप कम "पिक्सेलकृत" दिखना चाहते हैं, तो आप इसके लिए मेरे question on gamedev देख सकते हैं।

0

प्रति पिक्सेल प्रकाश के लिए, आप हो सकता है कहीं और देखने के लिए, क्योंकि मुझे इसके बारे में पता नहीं है। प्रति-टाइल प्रकाश के लिए,

SpriteBatch.draw में, कुछ अधिभारित विधियों में रंग होता है। जब आप Color.White का उपयोग करते हैं, स्प्राइटबैच ड्रॉ स्प्राइट सामान्य रंग होता है।

एक नया रंग बनाने के द्वारा

उपयोग रंग गुणा (Color.yourcolor.r * नाव, Color.yourcolor.y * नाव, Color.yourcolor.z * नाव, 255)

असल में, नाव पाने के लिए , एक सूत्र को खोजने का प्रयास करें जो पास की रोशनी (किसी सरणी या सूची में संग्रहीत) के कारण ब्लॉक की चमक की गणना करता है। चूंकि 2 डी गेम के लिए कोई मानक आवश्यक नहीं है, इसलिए यह सूत्र अपेक्षाकृत आसान होना चाहिए।

+0

-1 में 4।0 डिफ़ॉल्ट व्यवहार के तहत (रंग * फ्लोट) चमक/अंधेरा में परिवर्तन नहीं करता है, यह पारदर्शिता बदलता है। http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4-0.aspx – ClassicThunder

+0

@ क्लासिक टंडर इसके आसपास कोई रास्ता है? यह सबसे अच्छा तरीका – Neomex

4

Catalin's excellent lighting tutorial पर एक नजर डालें। मेरा मानना ​​है कि यह आपकी सभी आवश्यकताओं को पूरा करता है।

+0

"जैसा लगता है" (मुझे कैटलिन के ट्यूटोरियल मिलते थे, लेकिन यह मेरे लिए अबाउट उन्नत लग रहा था) "हम्म ... मुझे लगता है कि बीमार ने इसे देखा है – Cyral

+0

ओह्स इसके बारे में खेद है। लेकिन मुझे डर है कि प्रकाश एक सुंदर उन्नत विषय है इसलिए इसे एक ट्यूटोरियल ढूंढना मुश्किल होगा जो आपको सिखाता है कि इसे कैसे करें और इसका पालन करना आसान है। – ClassicThunder

+0

सच है, मैं ट्यूटोरियल पर काम कर रहा हूं और मुझे काम करने के लिए हल्के अंक मिल गए हैं, छाया पर काम करने के लिए मेरे ड्रॉटील्स() को कहां कॉल करना है, इस पर थोड़ा उलझन में है। मूल रूप से मुझे एक टाइल [,] सरणी मिली, लेकिन कैटलिन एक छवि के साथ कैटलिन के तरीके में घुसने लगती है – Cyral

संबंधित मुद्दे