From Test-Scratch-Wiki
रेकास्टर एक प्रोजेक्ट है जो एक है जो एक दो आयामी मानचित्र पर आधारित एक त्रि-आयामी दुनिया प्रस्तुत करता है। यह एक कार्यशील उदाहरण है। स्क्रैच में एक रेकास्टर आमतौर पर सिंगल फ्रेम और कम रिज़ॉल्यूशन वाला होता है, ताकि लैग को रोका जा सके।
रेकास्टिंग को रेट्रेसिंग के साथ गलत नहीं समझा जाना चाहिए, जो किरणों को अधिक भौतिक सटीकता के साथ प्रस्तुत करता है, प्रकाश के परावर्तन और अपवर्तन को पूरा करता है किरणें, और रेकास्टर की तरह किरणों को एक आयाम के बजाय दो आयामों में ट्रेस करती हैं।
अवधारणा
रेकास्टिंग निकटतम दीवार की दूरी मापने के लिए "किरणें" डालकर काम करती है, इसलिए इसे "रेकास्टर" शब्द कहा जाता है। प्रोग्राम प्लेयर से शुरू होकर किरणें भेजता है, आगे बढ़ता है जब तक कि वह एक दीवार से नहीं टकराता, जिस बिंदु पर वह तय की गई दूरी लेता है और दूरी के आधार पर एक कॉलम बनाता है। दीवार जितनी करीब होगी, स्तंभ उतना ही बड़ा होगा। किरणों को अलग-अलग दिशाओं में भेजा जाता है, भेजे गए कोण से यह निर्धारित होता है कि स्तंभ कहाँ खींचा जाएगा। खिलाड़ी के दृष्टिकोण के दाईं ओर भेजी गई किरण स्क्रीन के दाईं ओर एक स्तंभ बनाएगी और बाईं ओर भेजी गई किरण बाईं ओर एक स्तंभ बनाएगी। सभी किरणें भेजे जाने के बाद पूरी तस्वीर दिखेगी।
स्प्राइट आधारित बनाम सूची आधारित
दो प्रकार के रेकास्टर हैं जिन्हें प्रोग्राम किया जा सकता है: स्प्राइट-आधारित विधि, और सूची-आधारित विधि। प्रत्येक के अपने फायदे और नुकसान हैं:
| स्प्राइट आधारित | सूची आधारित | |
|---|---|---|
| कठिनाई की डिग्री | आसान | मुश्किल |
| फ्रेम रेट | निम्न | उच्च |
| ज्ञान आवश्यक | बेसिक स्क्रैच प्रोग्रामिंग | स्क्रैच प्रोग्रामिंग; त्रिकोणमिति; सरणी |
| मानचित्र कैसे संग्रहित किया जाता है | स्प्राइट के रूप में; प्रत्येक मानचित्र/दुनिया एक पोशाक | है एक सारणी (संख्याओं की ग्रिड) के रूप में; प्रत्येक मानचित्र एक अलग सारणी है |
| ! अन्य लाभ | घुमावदार दीवारों के साथ दुनिया बनाने के लिए इस्तेमाल किया जा सकता है | आसानी से यादृच्छिक दुनिया उत्पन्न कर सकते हैं |
>
when I receive [sense v] //पहले से प्रसारण set [drawing v] to [1] delete (all v) of [distances v] set [distance v] to [0] set [angle offset v] to [48] repeat (96) set [distance v] to [60] go to [movement v] point in direction <<[direction v] of [movement v]> + (angle offset)> repeat until <<touching [walls v]?> or <(distance) = [0]>> move (1) steps change [distance v] by (-1) end add (distance) to [distances v] change [angle offset v] by (-1) end wait until <(length of all lists) = [96]> //यदि आपके पास अन्य सेंसर हैं broadcast [draw v]
चित्रकला
आपके पास मौजूद सभी चित्रकला स्प्राइट्स के बीच सभी सूचियों को विभाजित करें। यदि आपके पास केवल एक दराज और एक दूरी सेंसर है तो यहां एक स्क्रिप्ट है
when I receive [draw v] go to x: (-237.5) y: (180) set pen size to (5) //क्योंकि ९६*५=४८० जो कि स्क्रीन की चौड़ाई है set pen color to (Color you want) //वह रंग चुनें जो आप चाहते हैं clear pen up set [help counting v] to (length of [distances v]) repeat (length of [distances v]) set pen shade to ((item (help counting) of [distances v]) * ((1) + ((2) / (3)))) set y to ((item (help counting) of [distances v]) * (4)) pen down set y to (((item (help counting) of [distances v]) * (4)) * (-1)) pen up change [help counting v] by (-1) set pen shade to (0) change x by (5) end set [drawing v] to [0]
जब आप इसे स्क्रैच में चलाएंगे तो यह प्रोजेक्ट धीमा हो जाएगा, यहां तक कि टर्बो स्पीड में भी। उचित गति से चलाने के लिए, फ़्लैश प्लेयर में टर्बो मोड में अपलोड करें और चलाएं। हालाँकि, आप अधिक ब्लॉकों का उपयोग करके इस प्रोजेक्ट को स्क्रीन रिफ्रेश के बिना चलाकर टर्बो मोड के बिना अच्छी गति से चला सकते हैं। यहां एक उदाहरण है।
सूची-आधारित रेकास्टर
एक सूची-आधारित रेकास्टर एक सूची के रूप में संग्रहीत मानचित्र पर निर्भर करता है और चर के रूप में संग्रहीत खिलाड़ी और किरण जैसे निर्देशांक पर निर्भर करता है। रेकास्टिंग की यह विधि बहुत आभासी है, सभी डेटा को संख्याओं के रूप में संग्रहीत किया जाता है और इसमें कोई वास्तविक स्प्राइट पोशाक का उपयोग नहीं किया जाता है। दीवारों को चित्रित करने के लिए एकमात्र स्प्राइट की आवश्यकता एक चलती हुई कलम है। यहां एक उदाहरण है। यदि आप एक उदाहरण मानचित्र चाहते हैं, तो एक डाउनलोड करने योग्य है यहां।
यह ट्यूटोरियल आपको एक सरल सूची-आधारित रेकास्टर बनाना सिखाएगा। संपादन को आसान बनाने के लिए यह कस्टम ब्लॉक का उपयोग करता है। "स्क्रीन रिफ्रेश के बिना चलाएं" बॉक्स को चेक करना सुनिश्चित करें।
| इस विधि को तभी आज़माएँ जब आप स्प्राइट-आधारित रेकास्टर को पूरी तरह से समझ लें या पहले से ही ऐरे और रेकास्टिंग से परिचित हों। |
वेरिएबल सेट करना
वेरिएबल्स को सेटअप करने के लिए उपयोग किया जाने वाला कोड यहां दिया गया है:
define Set up Variables set [X Position v] to [11] set [Y Position v] to [7] set [Direction X v] to [-1] set [Direction Y v] to [0] set [Plane X v] to [0] set [Plane Y v] to [0.66] set [Actual Resolution v] to [1] // यदि आप रिज़ॉल्यूशन का उपयोग नहीं कर रहे हैं, तो आपको इस वेरिएबल की आवश्यकता नहीं है। set [Height v] to [300] set [Resolution v] to [12] // समाधान की आवश्यकता नहीं है, लेकिन इसकी अनुशंसा की जाती है.
मुख्य लूप
यह हरी झंडी वाली स्क्रिप्ट है जो अन्य सभी स्क्रिप्ट को शुरू करती है।
when green flag clicked Set Up Variables // यह खण्ड तो आपने पहले ही बना लिया है! forever pen up // DadOfMrLog ने कुछ परीक्षण किए और पाया कि पेन का आकार 1 पर सेट करने और पेन अप ब्लॉक का उपयोग करने से अंतराल कम हो जाता है! set pen size to (1) hide set [Actual Resolution v] to (((Resolution) - (16)) * (-1)) //यदि आप समाधान चाहते हैं, तो आपको इस स्क्रिप्ट की आवश्यकता है। Raycast // यह ट्यूटोरियल में अगली स्क्रिप्ट है। end
रेकास्टिंग स्क्रिप्ट
अगली मुख्य रेकास्टिंग स्क्रिप्ट है। यह ब्लॉक अधिकांश कस्टम ब्लॉक को नियंत्रित करता है। इसे स्क्रीन रिफ्रेश ब्लॉक के बिना चलाना सुनिश्चित करें।
define Raycast
clear
set [x v] to [-240] // "x" is the increment variable here.
Read Keys // This is the next script in the tutorial.
repeat until <(x) > [280]>
pen up
set pen size to (1)
set pen shade to (0)
set [Camera X v] to ((2) * ((x) / ((Actual Resolution) - (1)))
set [Ray X Position v] to (X Position)
set [Ray Y Position v] to (Y Position)
set [Ray X Direction v] to ((X Direction) + ((Plane X) * (Camera X)))
set [Ray Y Direction v] to ((Direction Y) + ((Plane Y) * (Camera X)))
set [Map X v] to ([floor v] of (Ray X Position))
set [Map Y v] to ([floor v] of (Ray Y Position))
Calculate Walls :: custom // बाद में समझाया गया।
Draw Walls :: custom // बाद में समझाया गया।
change [x v] by (Actual Resolution)
end
नियंत्रण
"रेकास्ट" स्क्रिप्ट में कस्टम ब्लॉक में से एक नियंत्रण ब्लॉक था, "रीड कीज़।" यहां, हम उस स्क्रिप्ट पर ध्यान केंद्रित करेंगे।
define Read Keys
if <not <(Touching Wall) = [1]>> then
if <key [up arrow v] pressed?> then
change [X Position v] by ((X Direction) * (Move Speed))
change [Y Position v] by ((Y Direction) * (Move Speed))
end
end
if <not <(Touching Wall) = [-1]>> then
if <key [down arrow v] pressed?> then
change [X Position v] by ((X Direction) * (Move Speed))
change [Y Position v] by ((Y Direction) * (Move Speed))
end
end
if <key [right arrow v] pressed?> then
set [Direction X Old v] to (Direction X)
set [Direction X v] to (((Direction X) * ([cos v] of ((Rotation Speed) * (-1)))) - ((Direction Y) * ([sin v] of ((Rotation Speed) * (-1)))))
set [Direction Y v] to (((Direction X Old) * ([sin v] of ((Rotation Speed) * (-1)))) + ((Direction Y) * ([cos v] of ((Rotation Speed) * (-1)))))
set [Plane X Old v] to (Plane X)
set [Plane X v] to (((Plane X) * ([cos v] of ((Rotation Speed) * (-1)))) - ((Plane Y) * ([sin v] of ((Rotation Speed) * (-1)))))
set [Plane Y v] to (((Plane X Old) * ([sin v] of ((Rotation Speed) * (-1)))) + ((Plane Y) * ([cos v] of ((Rotation Speed) * (-1)))))
end
if <key [left arrow v] pressed?> then
set [Direction X Old v] to (Direction X)
set [Direction X v] to (((Direction X Old) * ([cos v] of ((Rotation Speed) * (1)))) - ((Direction Y) * ([sin v] of ((Rotation Speed) * (1)))))
set [Direction Y v] to (((Direction X Old) * ([sin v] of ((Rotation Speed) * (1)))) + ((Direction Y) * ([cos v] of ((Rotation Speed) * (1)))))
set [Plane X Old v] to (Plane X)
set [Plane X v] to (((Plane X) * ([cos v] of ((Rotation Speed) * (1)))) - ((Plane Y) * ([sin v] of ((Rotation Speed) * (1)))))
set [Plane Y v] to (((Plane X Old) * ([sin v] of ((Rotation Speed) * (1)))) + ((Plane Y) * ([cos v] of ((Rotation Speed) * (1)))))
end
दीवारों की गणना
यह खंड उस ब्लॉक की व्याख्या करता है जो दीवारों की गणना करता है। दुर्भाग्य से, वॉल टच डिटेक्शन शामिल नहीं है। यदि आप जानते हैं कि यह कैसे करना है, तो कृपया फ्यूरियस- से संपर्क करें।
define Calculate Walls
set [Touching Wall v] to [0]
set [Distance X Delta v] to ([sqrt v] of ((1) + (((Ray Y Direction) * (Ray Y Direction)) / ((Ray X Direction) * (Ray X Direction)))))
set [Distance Y Delta v] to ([sqrt v] of ((1) + (((Ray X Direction) * (Ray X Direction)) / ((Ray Y Direction) * (Ray Y Direction)))))
set [Wall Found v] to [0] // एक बार जब किरण दीवार से टकराती है, तो यह चर एक पर सेट हो जाता है, जो इस मामले में बूलियन मान "सही" के समान है।
if <(Ray X Direction) < [0]> then
set [Step X v] to [-1]
set [Side X Distance v] to (((Ray X Position) - (Map X)) * (Distance X Delta))
else
set [Step X v] to [1]
set [Side X Distance v] to ((((Map X) + (1)) - (Ray X Position)) * (Distance X Delta))
end
if <(Ray X Direction) < [0]> then
set [Step Y v] to [-1]
set [Side Y Distance v] to (((Ray Y Position) - (Map Y)) * (Distance Y Delta))
else
set [Step Y v] to [1]
set [Side Y Distance v] to ((((Map Y) + (1)) - (Ray Y Position)) * (Distance Y Delta))
end
repeat until <(Wall Found) = [1]>
if <(Side X Distance) < (Side Y Distance)> then
change [Side X Distance v] by (Distance X Delta)
change [Map X v] by (Step X)
set [side v] to [0] // परिवर्तनीय "पक्ष" का तात्पर्य यह है कि किस दीवार का सामना किया जा रहा है, व्हाई दीवार या एक्स दीवार। इस मामले में, यह एक एक्स दीवार है।
else
change [Side Y Distance v] by (Distance Y Delta)
change [Map Y v] by (Step Y)
set [side v] to [1] //इस स्थिति में, किरण व्हाई दीवार से टकराई है।
end
set [Map XY v] to (letter (Map Y) of (item (Map X) of [World Map v])) //मानचित्र एक्सव्हाई उस ग्रिड का आइटम है जिसमें किरण है। उदाहरण: यदि एक्स ग्यारह है और Y सात है, तो मानचित्र एक्सव्हाई (विश्व मानचित्र के आइटम ११ का अक्षर ७ ) होगा।
if <(Map XY) > [0]> then // यदि मानचित्र एक्सव्हाई शून्य से अधिक है, तो यह दीवार से टकरा गया है।
set [Wall Found v] to [1]
end
end
if <(side) = [0]> then
set [Perpendicular Wall Distance v] to ([abs v] of ((((Map X) - (Ray X Position)) + (((1) - (Step X)) / (2))) / (Ray X Direction)))
else
set [Perpendicular Wall Distance v] to ([abs v] of ((((Map Y) - (Ray Y Position)) + (((1) - (Step Y)) / (2))) / (Ray Y Direction)))
end
set [Line Height v] to ([abs v] of ((h) / (Perpendicular Wall Distance)))
set [Draw Start v] to (((0) - (Line Height)) / (2))
set [Draw End v] to ((Line Height) / (2))
दीवारें खींचना
इस ट्यूटोरियल में अंतिम भाग पेन स्क्रिप्ट है जो दीवारों को चित्रित करती है। यह एक बहुत ही सरल स्क्रिप्ट है।
define Draw Walls
set pen color to [#179fd7]
if <(side) = [1]> then
set [Brightness v] to (115) // यह स्क्रिप्ट अच्छे प्रभाव के लिए व्हाई दीवारों को एक्स दीवारों की तुलना में अधिक गहरा बनाती है।
else
set [Brightness v] to (150)
end
go to x: (x) y: (Draw Start)
set pen shade to ((Brightness) * (-0.2))
set pen size to (Actual Resolution)
pen down
go to x: (x) y: ((2) * (Draw End))
pen up
set pen size to (1)
set pen shade to (0)
और इसके साथ ही सूची-आधारित रेकास्टिंग ट्यूटोरियल समाप्त हो जाता है! आनंद लेना!
