2010-09-13 11 views
5

मैं यह पता लगाने की कोशिश कर रहा हूं कि जब मैं "रैंप" और +1 ऊंचाई टाइल्स (नीचे चित्र देखें) तो माउस के नीचे सही "सक्रिय" टाइल कैसे प्राप्त कर सकता हूं।मानचित्र के लिए आइसोमेट्रिक स्क्रीन


Example Isometric Image

जब मेरी दुनिया फ्लैट है, सब कुछ कोई समस्या नहीं काम करता है। एक बार जब मैं +1 कहने की ऊंचाई के साथ टाइल जोड़ता हूं, तो रैंप के साथ +0 पर वापस जाकर, मेरी स्क्रीन -> मैप रूटीन अभी भी दिख रही है जैसे सबकुछ "फ्लैट" है।

उपरोक्त तस्वीर में, हरा "रैंप" असली टाइल है जिसे मैं प्रस्तुत करना चाहता हूं और माउस -> मानचित्र की गणना करना चाहता हूं, हालांकि नीले टाइल को आप नीचे "नीचे" देखते हैं, यह वह क्षेत्र है जो गणना की जाती है। तो यदि आप अपने माउस को किसी भी गहरे हरे रंग के क्षेत्रों में ले जाते हैं, तो ऐसा लगता है कि आप एक और टाइल पर हैं।

यहाँ मेरी नक्शा प्रस्तुत करना है (बहुत सरल)

canvas.width = canvas.width; // cheap clear in firefox 3.6, does not work in other browsers 
for(i=0;i<map_y;i++){ 
    for(j=0;j<map_x;j++){ 
     var xpos = (i-j)*tile_h + current_x; 
     var ypos = (i+j)*tile_h/2+ current_y; 

     context.beginPath(); 
     context.moveTo(xpos, ypos+(tile_h/2)); 
     context.lineTo(xpos+(tile_w/2), ypos); 
     context.lineTo(xpos+(tile_w), ypos+(tile_h/2)); 
     context.lineTo(xpos+(tile_w/2), ypos+(tile_h)); 
     context.fill(); 

    } 
}  

और यहाँ मेरी माउस है -> नक्शा दिनचर्या:

ymouse=((2*(ev.pageY-canvas.offsetTop-current_y)-ev.pageX+canvas.offsetLeft+current_x)/2); 
xmouse=(ev.pageX+ymouse-current_x-(tile_w/2)-canvas.offsetLeft); 
ymouse=Math.round(ymouse/tile_h); 
xmouse=Math.round(xmouse/(tile_w/2)); 

current_tile=[xmouse,ymouse]; 

मुझे लगता है मैं फिर से आरंभ करके लागू करने के लिए होगा एक साधारण स्क्रीन की बजाय एक विश्व आधारित मानचित्र प्रणाली -> मानचित्र दिनचर्या।

धन्यवाद।

उत्तर

2

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

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

2

चित्र की तरह, अपने दृश्य कोण हमेशा 45 डिग्री और हमेशा होता है एक ही दिशा से, हैं, तो अपने माउस -> नक्शा दिनचर्या की तरह एक एल्गोरिथ्म कुछ इस्तेमाल कर सकते हैं:

  1. calculate मैं, के रूप में टाइल के j आप वर्तमान में कर रहे हैं (xmouse, ymouse का आपका अंतिम मान)
  2. i, j
  3. ऊंचाई और कोण को देखते हुए टाइल की ऊंचाई और कोण देखें, क्या यह टाइल पिकिंग किरण को छेड़छाड़ करता है? यदि हां, तो आखिरी सेट करें, lastj = i, j
  4. वृद्धि/कमी i, जे दर्शक के प्रति तिरछे एक कदम
  5. क्या हम मानचित्र के किनारे से गिर गए हैं? यदि हां, तो आखिरी बार, आखिरी बार लौटें। अन्यथा 2.

टाइल की अधिकतम ऊंचाई के आधार पर, आपको मानचित्र के किनारे जाने के बजाय, केवल 2 टाइल्स की जांच करनी पड़ सकती है।

3 मुश्किल हिस्सा है, और आपकी विश्व ज्यामिति पर निर्भर करता है। कुछ त्रिकोण बनाएं और आपको इसे समझने में सक्षम होना चाहिए। या आप intersect_quadrilateral_ray() here फ़ंक्शन को देखने का प्रयास कर सकते हैं।

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