আমি যে গেমটি লিখছিলাম তার জন্য আমার একই সমস্যা ছিল। আমি ধারণা করি যে আপনি ঠিক কীভাবে আইসোমেট্রিক সিস্টেম প্রয়োগ করেছেন তার উপর ভিত্তি করে এই সমস্যাটি আলাদা হবে, তবে আমি কীভাবে সমস্যার সমাধান করেছি তা ব্যাখ্যা করব।
আমি প্রথম আমার টাইল_ টু_স্ক্রিন ফাংশন দিয়ে শুরু করেছি। (আমি ধরে নিলাম যে আপনি প্রথম স্থানে টাইলসটি ঠিক জায়গায় রাখছেন)) এই ফাংশনে স্ক্রিন_এক্স এবং স্ক্রিন_ই গণনা করার একটি সমীকরণ রয়েছে। আমার দেখতে দেখতে (অজগর):
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)