Isometric प्रतिपादन और उठा?


23

मैं हीरे के आकार की दुनिया में प्लॉट (दुनिया-> स्क्रीन) और माउस पिक (वर्ल्ड-> स्क्रीन) आइसोमेट्रिक टाइल्स बनाने के फॉर्मूले की तलाश में हूं। जिन लोगों को मैंने हमेशा कोशिश की है वे ठीक-ठाक लगते हैं। ऐसा करने का सामान्य / सही तरीका क्या है?


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

1
टाइलें 2: 1 (अधिक विशेष रूप से, 64x32) हैं। संपादक के लिखने के बाद से समन्वय प्रणाली कोई मायने नहीं रखती है। (शीर्ष पर या बाईं ओर 0,0 हालांकि समझदार लगता है।)
mpnk121

सवाल के बहुत देर से और मेरे पास भी पूर्ण उत्तर नहीं है, लेकिन इस सटीक विषय पर एक बहुत अच्छा Google टेक टॉक था। उनकी स्थापना में मनमानी छवियों के गैर-पारदर्शी हिस्से (जावास्क्रिप्ट में, कम नहीं) को चुनना शामिल है। youtube.com/watch?v=_RRnyChxijA
सेठ बट्टिन

जवाबों:


21

आपकी टिप्पणी के आधार पर, यहां टाइल कोड, y मान को स्क्रीन निर्देशांक पर परिवर्तित करने के लिए उपयोग किया जा रहा कोड है। अब, यह "3 डी टाइल्स" को ध्यान में नहीं रखता है, सब कुछ एक ही विमान पर होने के रूप में माना जाता है, इसलिए यदि आप एक गेम लिख रहे हैं जहां यह मायने रखता है, तो यह कोड काम नहीं करेगा।

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

बिंदु केवल x और y ints युक्त संरचना है, TILE_WIDTH आपके मामले में 64 होगी, TILE_DEPTH बुरी तरह से नामांकित है (यह वास्तव में टाइल ग्राफिक्स की ऊंचाई है), लेकिन यह आपके मामले में 32 होगा। यदि आप चाहते हैं कि आपके टाइल का नक्शा अलग-अलग x, y स्थान पर (जैसे कि यदि आप चाहते हैं कि टाइलें टाइल के किसी अन्य सेट से ऊपर हों) तो आप चाहते हैं। आमतौर पर ऑफसेट 0,0 हो सकते हैं।

यह इस तरह से शीर्ष, मध्य पर 0,0 के साथ एक मानचित्र उत्पन्न करेगा:

        0,0
    0,1     1,0
0,2     1,1     2,1

कर्सर के टाइल x, y को खोजने के लिए:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

इस बिट कोड में, mX और mY माउस स्क्रीन निर्देशांक हैं, जिसे हम कैमरा मान के साथ जोड़ रहे हैं ताकि पता लगाया जा सके कि हम "विश्व निर्देशांक" में कहाँ हैं। बाकी सब कुछ पिछले कोड उदाहरण के समान है।

एक बार फिर, यह एक फ्लैट 2d सममितीय टाइल मानचित्र मान लेता है। यदि आप मानचित्र के अर्ध-3D दृश्य का उपयोग करना चाहते हैं, तो कुछ अतिरिक्त काम हैं, और यह सब मान लेता है कि आप वैसे भी 2d में काम कर रहे हैं।


1
धन्यवाद! - यह फ्लैट मैप्स के लिए बढ़िया काम करता है। अब, क्या आप मुझे थोड़ा और बता सकते हैं कि मैं कैसे मनमाने ढंग से आकार जोड़ सकता हूं (यानी एक Z गहराई के साथ) जो एक और परत पर हैं? (जैसे कि एक कुएं, या एक
गली की

2
जब आप ऑफसेट और ऑफ़सेट मूल्यों का उपयोग करते हैं। यदि आपकी स्ट्रीटलाइट 64x64 है, तो ऑफसेट वैल्यू के लिए नकारात्मक 32 में पास होने से इसे सही जगह पर दिखाई देना चाहिए। उम्मीद है कि आपको शुरू करने के लिए पर्याप्त है।
थेडियन

6
क्या आपके उदाहरण में "2,1" का समन्वय नहीं होना चाहिए "2,0"?
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.