तो, मैं सिर्फ मज़े के लिए एक HTML5 आरपीजी बना रहा हूं। नक्शा एक <canvas>(512px चौड़ाई, 352px ऊँचाई | 16 टाइलों के पार, 11 टाइलें ऊपर से नीचे) हैं। मैं जानना चाहता हूं कि क्या पेंट करने के लिए अधिक कुशल तरीका है <canvas>।
यहाँ है कि मैं इसे अभी कैसे है।
टाइल्स को कैसे लोड किया जाता है और नक्शे पर चित्रित किया जाता है
Image()टुकड़े का उपयोग करके नक्शे को टाइल (32x32) द्वारा चित्रित किया जा रहा है । छवि फ़ाइलों को एक साधारण forलूप के माध्यम से लोड किया जाता है tiles[]और उपयोग करने पर PAINTED नामक एक सरणी में डाल दिया जाता है drawImage()।
सबसे पहले, हम टाइल्स को लोड करते हैं ...

और यहां बताया गया है कि यह कैसे किया जा रहा है:
// SET UP THE & DRAW THE MAP TILES
tiles = [];
var loadedImagesCount = 0;
for (x = 0; x <= NUM_OF_TILES; x++) {
var imageObj = new Image(); // new instance for each image
imageObj.src = "js/tiles/t" + x + ".png";
imageObj.onload = function () {
console.log("Added tile ... " + loadedImagesCount);
loadedImagesCount++;
if (loadedImagesCount == NUM_OF_TILES) {
// Onces all tiles are loaded ...
// We paint the map
for (y = 0; y <= 15; y++) {
for (x = 0; x <= 10; x++) {
theX = x * 32;
theY = y * 32;
context.drawImage(tiles[5], theY, theX, 32, 32);
}
}
}
};
tiles.push(imageObj);
}
स्वाभाविक रूप से, जब कोई खिलाड़ी खेल शुरू करता है, तो वह उस नक्शे को लोड करता है जिसे वे आखिरी बार छोड़ते हैं। लेकिन यहाँ के लिए, यह एक अखिल घास का नक्शा है।
अभी, मानचित्र 2 डी सरणियों का उपयोग करते हैं। यहाँ एक उदाहरण का नक्शा है।
[[4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 1, 1, 1],
[1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 1],
[1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1]];
मुझे एक सरल ifसंरचना का उपयोग करके अलग-अलग नक्शे मिलते हैं । एक बार 2d सरणी ऊपर होने पर return, प्रत्येक सरणी में संबंधित संख्या Image()अंदर संग्रहीत के अनुसार चित्रित की जाएगी tile[]। तब drawImage()होते हैं और के अनुसार रंग होगा xऔर yऔर कई बार यह द्वारा 32सही पर पेंट करने के x-yसमन्वय।
एकाधिक मानचित्र स्विचिंग कैसे होती है
मेरे खेल के साथ, नक्शे पाँच बातें का ट्रैक रखने के लिए है: currentID, leftID, rightID, upID, और bottomID।
- currentID: आपके द्वारा बनाए गए नक्शे की वर्तमान आईडी।
- बायाँ भाग:
currentIDवर्तमान मानचित्र के बायीं ओर से बाहर निकलने पर आपको किस आईडी को लोड करना है। - राइटआईडी:
currentIDवर्तमान मानचित्र के दाईं ओर से बाहर निकलने पर आपको किस आईडी को लोड करना है। - डाउनआईडी:
currentIDवर्तमान मानचित्र के निचले भाग से बाहर निकलने पर आपको किस आईडी को लोड करना है। - upID:
currentIDवर्तमान मानचित्र के शीर्ष पर बाहर निकलने पर आपको किस आईडी को लोड करना है।
टिप्पणी के लिए कुछ: या तो हैं leftID, rightID, upID, या bottomID, नहीं विशिष्ट हैं अर्थ यह है कि वे एक हैं 0। इसका मतलब है कि वे नक्शे के उस तरफ नहीं छोड़ सकते। यह केवल एक अदृश्य नाकाबंदी है।
इसलिए, एक बार जब कोई व्यक्ति नक्शे के एक हिस्से से बाहर निकलता है, तो इस पर निर्भर करता है कि वे कहाँ से बाहर निकले हैं ... उदाहरण के लिए यदि वे तल पर बाहर निकलते हैं, तो लोड bottomIDकी संख्या होगी mapऔर इस प्रकार नक्शे पर चित्रित किया जाएगा।
यहाँ एक प्रतिनिधित्व योग्य है। GIF की मदद से आप बेहतर कल्पना कर सकते हैं:

जैसा कि आप देख सकते हैं, जल्दी या बाद में, कई नक्शों के साथ मैं कई आईडी से निपटूंगा। और वह संभवतः थोड़ा भ्रमित और व्यस्त हो सकता है।
स्पष्ट पक्ष यह है कि यह एक समय में 176 टाइलें लोड करता है, एक छोटे से 512x352 कैनवास को ताज़ा करता है, और समय पर एक मानचित्र को संभालता है। यह माना जाता है कि कई मानचित्रों के साथ काम करते समय MAP आईडी, कई बार भ्रमित हो सकती है।
मेरा प्रश्न
- क्या यह मानचित्रों (टाइलों के उपयोग को देखते हुए) को स्टोर करने का एक कुशल तरीका है, या नक्शे को संभालने का एक बेहतर तरीका है?
मैं एक विशाल नक्शे की तर्ज पर सोच रहा था। मानचित्र का आकार बड़ा है और यह सभी एक 2 डी सरणी है। हालाँकि, व्यूपोर्ट अभी भी 512x352 पिक्सेल का है।
यहाँ एक और है।

क्षमा करें यदि आप मेरी अंग्रेजी नहीं समझ सकते हैं। कृपया कुछ भी पूछें आपको समझने में परेशानी होगी। उम्मीद है, मैंने इसे स्पष्ट किया। धन्यवाद।