내가 쓰는 게임에 대해서도 같은 문제가있었습니다. 이 문제는 아이소 메트릭 시스템을 정확히 구현 한 방법에 따라 달라 지지만 문제를 해결하는 방법을 설명하겠습니다.
먼저 tile_to_screen 함수로 시작했습니다. (저는 타일을 처음에 올바른 위치에 배치하는 방법이라고 가정합니다.)이 함수에는 screen_x 및 screen_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)
보시다시피, 초기 방정식처럼 간단하지 않습니다. 그러나 그것은 내가 만든 게임에서 잘 작동합니다. 선형 대수에 감사합니다!
최신 정보
다양한 연산자로 간단한 Point 클래스를 작성한 후이 답변을 다음과 같이 단순화했습니다.
# 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)