Pygame: 타일 맵 만들기
제가 만들 게임은 타일 맵을 사용할 계획입니다. 타일 맵은 주로 유저가 위에서 아래로 세계를 보는 형태의 하향식(Top-Down) 게임이나 플랫폼 게임 등에서 지형을 표현할 때 사용하는 방법입니다. 이 방법은 반복해서 나타나는 적은 리소스와 규칙으로 손쉽게 관리할 수 있게 해줍니다.
타일 맵의 종류
타일 맵은 형태나 분류에 따라 다양한 분류기준이 있습니다. 여기서는 하향식 게임에 사용하는 타일맵을 투영 방식에 따라 분류합니다.
우선 가장 단순한 직교좌표계를 사용하는 방식인 Orthogonal Map이 있습니다. RPG등에서 자주 활용하고, 타일을 배치할 격자를 만들기 쉬워서 많이 사용합니다.
다음은 등축 투영법을 사용하는 Isometric Map입니다. 타일 격자의 형태가 마름모꼴입니다. 여러 높이를 표현할 수 있다는 장점이 있어 공간이 주인공인 건설/운영 시뮬레이션 등에서 자주 사용합니다.
문명 시리즈로 유명한 육각타일입니다.타일로 드나드는 방향이 4개인 사각 타일과 다르게 6개의 경계를 가지고 있습니다. 대전략이 주요한 전략시뮬레이션의 경우 이런 타일을 많이 사용합니다.
등축 투영 타일맵 제작
타일을 어떻게 만들지 감을 잡기 위해 단순한 예제를 작성했습니다.
압축을 해제하면 두개의 타일이미지인 grass.png
, wall.png
이 있고, python 스크립트인 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)
'프로그래밍 > 파이게임' 카테고리의 다른 글
Pygame: 등축투영 타일의 좌표 (0) | 2022.01.23 |
---|---|
Pygame: 타일셋 그리기(3) - 바닥 타일셋 그리기 (0) | 2022.01.21 |
Pygame: 타일셋 그리기(2) - 지형 타일셋 제작 (0) | 2022.01.20 |
Pygame: 타일셋 그리기(1) - 코딩으로 기본 타일셋 생성 (0) | 2022.01.19 |
파이썬 게임 개발: Pygame 시작하기 (0) | 2022.01.17 |
댓글