soma0sd

코딩 & 과학 & 교육

Pygame: 타일 맵 만들기

반응형

제가 만들 게임은 타일 맵을 사용할 계획입니다. 타일 맵은 주로 유저가 위에서 아래로 세계를 보는 형태의 하향식(Top-Down) 게임이나 플랫폼 게임 등에서 지형을 표현할 때 사용하는 방법입니다. 이 방법은 반복해서 나타나는 적은 리소스와 규칙으로 손쉽게 관리할 수 있게 해줍니다.

타일 맵의 종류

타일 맵은 형태나 분류에 따라 다양한 분류기준이 있습니다. 여기서는 하향식 게임에 사용하는 타일맵을 투영 방식에 따라 분류합니다.

직교좌표계를 사용하는 포켓몬스터 골드

우선 가장 단순한 직교좌표계를 사용하는 방식인 Orthogonal Map이 있습니다. RPG등에서 자주 활용하고, 타일을 배치할 격자를 만들기 쉬워서 많이 사용합니다.

등축 투영법을 사용하는 테마병원

다음은 등축 투영법을 사용하는 Isometric Map입니다. 타일 격자의 형태가 마름모꼴입니다. 여러 높이를 표현할 수 있다는 장점이 있어 공간이 주인공인 건설/운영 시뮬레이션 등에서 자주 사용합니다.

육각 타일을 사용하는 문명 5

문명 시리즈로 유명한 육각타일입니다.타일로 드나드는 방향이 4개인 사각 타일과 다르게 6개의 경계를 가지고 있습니다. 대전략이 주요한 전략시뮬레이션의 경우 이런 타일을 많이 사용합니다.

등축 투영 타일맵 제작

타일을 어떻게 만들지 감을 잡기 위해 단순한 예제를 작성했습니다.

Isometric_Map.zip
10.2 kB

압축을 해제하면 두개의 타일이미지인 grass.png, wall.png이 있고, python 스크립트인 Isometric_Map.py이 있습니다. 실행하면 아래와 같은 결과를 출력합니다.

Isometric_Map.py 실행결과

소스코드 Isometric_Map.py:

"""Pygame 등축투영 타일 맵

Copyright 2022 soma0sd <https://soma0sd.tistory.com/163>
"""

import pygame
from pygame.locals import DOUBLEBUF, QUIT, KEYUP, K_ESCAPE
import sys

pygame.init()

# 디스플레이 초기화
DISPLAYSURF = pygame.display.set_mode((640, 480), DOUBLEBUF)
pygame.display.set_caption("등축 투영")


# 맵 데이터: (1) 벽, (0) 바닥
map_data = [
    [1, 1, 1, 1, 1],
    [1, 0, 0, 0, 1],
    [1, 0, 0, 0, 1],
    [1, 0, 0, 0, 1],
    [1, 0, 0, 0, 1],
    [1, 1, 0, 0, 1],
    [1, 1, 0, 0, 1],
    [1, 1, 1, 1, 1],
]

# 타일 이미지 로드
wall = pygame.image.load("wall.png").convert_alpha()
grass = pygame.image.load("grass.png").convert_alpha()
TILEWIDTH = 64  # 타일 너비
TILEHEIGHT = 64  # 타일 높이
TILEHEIGHT_HALF = TILEHEIGHT / 2
TILEWIDTH_HALF = TILEWIDTH / 2

# 타일 배치
for row_nb, row in enumerate(map_data):
    for col_nb, tile in enumerate(row):
        if tile == 1:
            tileImage = wall
        else:
            tileImage = grass
        cart_x = row_nb * TILEWIDTH_HALF
        cart_y = col_nb * TILEHEIGHT_HALF
        iso_x = cart_x - cart_y
        iso_y = (cart_x + cart_y) / 2
        centered_x = DISPLAYSURF.get_rect().centerx + iso_x
        centered_y = DISPLAYSURF.get_rect().centery / 2 + iso_y
        DISPLAYSURF.blit(tileImage, (centered_x, centered_y))

# 게임 실행
FPSCLOCK = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()

    pygame.display.flip()
    FPSCLOCK.tick(30)
반응형
태그:

댓글

End of content

No more pages to load