मुझे एक खेल के लिए यही समस्या थी जो मैं लिख रहा था। मैं कल्पना करता हूं कि यह समस्या अलग-अलग होगी कि आपने आइसोमेट्रिक सिस्टम को कैसे लागू किया, लेकिन मैं बताऊंगा कि मैंने समस्या को कैसे हल किया।
मैंने पहली बार अपने टाइल_ऑटो_स्क्रीन फंक्शन के साथ शुरुआत की। (मुझे लगता है कि आप पहली जगह में टाइल को सही स्थान पर कैसे रख रहे हैं।) इस फ़ंक्शन में स्क्रीन_x और स्क्रीन_y की गणना करने के लिए एक समीकरण है। मेरा ऐसा दिख रहा था (अजगर):
def map_to_screen(self, point):
x = (SCREEN_WIDTH + (point.y - point.x) * TILE_WIDTH) / 2
y = (SCREEN_HEIGHT + (point.y + point.x) * TILE_HEIGHT) / 2
return (x, y)
मैंने उन दो समीकरणों को लिया और उन्हें रैखिक समीकरणों की प्रणाली में शामिल किया। आपके द्वारा चुने गए किसी भी तरीके में समीकरणों की इस प्रणाली को हल करें। (मैंने एक rref पद्धति का उपयोग किया। इसके अलावा, कुछ रेखांकन कैलकुलेटर इस समस्या को हल कर सकते हैं।)
अंतिम समीकरण इस तरह दिखे:
# constants for quick calculating (only process once)
DOUBLED_TILE_AREA = 2 * TILE_HEIGHT * TILE_WIDTH
S2M_CONST_X = -SCREEN_HEIGHT * TILE_WIDTH + SCREEN_WIDTH * TILE_HEIGHT
S2M_CONST_Y = -SCREEN_HEIGHT * TILE_WIDTH - SCREEN_WIDTH * TILE_HEIGHT
def screen_to_map(self, point):
# the "+ TILE_HEIGHT/2" adjusts for the render offset since I
# anchor my sprites from the center of the tile
point = (point.x * TILE_HEIGHT, (point.y + TILE_HEIGHT/2) * TILE_WIDTH)
x = (2 * (point.y - point.x) + self.S2M_CONST_X) / self.DOUBLED_TILE_AREA
y = (2 * (point.x + point.y) + self.S2M_CONST_Y) / self.DOUBLED_TILE_AREA
return (x, y)
जैसा कि आप देख सकते हैं, यह शुरुआती समीकरण की तरह सरल नहीं है। लेकिन यह मेरे द्वारा बनाए गए खेल के लिए अच्छी तरह से काम करता है। रैखिक बीजगणित के लिए अच्छाई का धन्यवाद!
अपडेट करें
विभिन्न ऑपरेटरों के साथ एक साधारण बिंदु वर्ग लिखने के बाद, मैंने इस उत्तर को सरल बनाया:
# constants for quickly calculating screen_to_iso
TILE_AREA = TILE_HEIGHT * TILE_WIDTH
S2I_CONST_X = -SCREEN_CENTER.y * TILE_WIDTH + SCREEN_CENTER.x * TILE_HEIGHT
S2I_CONST_Y = -SCREEN_CENTER.y * TILE_WIDTH - SCREEN_CENTER.x * TILE_HEIGHT
def screen_to_iso(p):
''' Converts a screen point (px) into a level point (tile) '''
# the "y + TILE_HEIGHT/2" is because we anchor tiles by center, not bottom
p = Point(p.x * TILE_HEIGHT, (p.y + TILE_HEIGHT/2) * TILE_WIDTH)
return Point(int((p.y - p.x + S2I_CONST_X) / TILE_AREA),
int((p.y + p.x + S2I_CONST_Y) / TILE_AREA))
def iso_to_screen(p):
''' Converts a level point (tile) into a screen point (px) '''
return SCREEN_CENTER + Point((p.y - p.x) * TILE_WIDTH / 2,
(p.y + p.x) * TILE_HEIGHT / 2)