Pygame: 타일셋 그리기(1) - 코딩으로 기본 타일셋 생성
반응형
지난번 Pygame: 타일 맵 만들기에서 이어집니다.
저번에는 건설/운영 시뮬레이션 게임에서 자주 사용하는 등축 타일맵을 사용하기로 마음먹고 기본적인 배치 방법을 살펴봤습니다.
타일 셋을 그리는 좋은 그리기 도구들이 많지만 그걸 사용하는 저는 센스가 전혀 없습니다. 무료 에셋도 많고 품질도 괜찮은 게임 에셋 스토어인 itch.io를 사용하는 방법도 있지만 코딩으로 어떻게 해볼수 있는건 해보려고 합니다.
오늘은 타일셋 이미지 하나를 생성하는 프로그램을 만들고, 최종적으로 난수의 신께 도움을 받아 필요한 등축 타일셋을 생성하는 프로그램을 만들어보려고 합니다.
Pygame에서도 이미지 저장 기능을 제공하지만 순전히 제가 귀찮아서 Matplotlib을 사용했습니다. 나중에 뭔가 제대로 만들어지면 그때가서 수정할 생각입니다.
빈 이미지 생성
import numpy as np
TILE_WIDTH = 128 # 타일셋 너비
TILE_HEIGHT = 128 # 타일셋 높이
image = np.zeros((TILE_HEIGHT, TILE_WIDTH, 4), np.uint8)
투명도까지 표현하는 RGBA 이미지를 생성합니다. 초기값은 모두 0이니 그냥 투명한 128x128 이미지가 생깁니다.
색상 칠하기
import itertools
tx = width / 2
ty = np.sin(np.pi / 6) * tx
ty2 = height - ty
for x, y in itertools.product(range(width), range(height)):
if np.abs(x - tx) / tx + np.abs(y - ty) / ty <= 1:
image[y, x, :] = color_top
elif ty <= y <= height - ty and x < tx:
image[y, x, :] = color_left
elif ty <= y <= height - ty and x >= tx:
image[y, x, :] = color_right
elif np.abs(x - tx) / tx + np.abs(y - ty2) / ty <= 1 and x < tx:
image[y, x, :] = color_left
elif np.abs(x - tx) / tx + np.abs(y - ty2) / ty <= 1 and x >= tx:
image[y, x, :] = color_right
itertools
의 product
함수는 여러개의 for루프를 사용하지 않고도 모든 x, y 픽셀을 순회할 수 있도록 해줍니다.
각각의 if
문은 색을 칠해야 하는 부분은을 찾아 칠하는 역할을 합니다.
마름모 내부의 점을 판별하는 식을 사용했습니다.
이미지 저장
plt.imsave("test.png", image) # 타일셋 이미지 저장
이미지를 test.png
로 저장합니다.
전체 코드
import itertools
import matplotlib.pyplot as plt
import numpy as np
TILE_WIDTH = 128 # 타일셋 너비
TILE_HEIGHT = 128 # 타일셋 높이
# 빈 이미지 생성
image = np.zeros((TILE_HEIGHT, TILE_WIDTH, 4), np.uint8)
height, width = image.shape[:2]
color_top = [255, 0, 0, 255] # 뚜껑 색상
color_left = [0, 255, 0, 255] # 왼쪽 벽 색상
color_right = [0, 0, 255, 255] # 오른쪽 벽 색상
tx = width / 2
ty = np.sin(np.pi / 6) * tx
ty2 = height - ty
for x, y in itertools.product(range(width), range(height)):
if np.abs(x - tx) / tx + np.abs(y - ty) / ty <= 1:
image[y, x, :] = color_top
elif ty <= y <= height - ty and x < tx:
image[y, x, :] = color_left
elif ty <= y <= height - ty and x >= tx:
image[y, x, :] = color_right
elif np.abs(x - tx) / tx + np.abs(y - ty2) / ty <= 1 and x < tx:
image[y, x, :] = color_left
elif np.abs(x - tx) / tx + np.abs(y - ty2) / ty <= 1 and x >= tx:
image[y, x, :] = color_right
plt.imsave("test.png", image) # 타일셋 이미지 저장
반응형
'프로그래밍 > 파이게임' 카테고리의 다른 글
Pygame: 등축투영 타일의 좌표 (0) | 2022.01.23 |
---|---|
Pygame: 타일셋 그리기(3) - 바닥 타일셋 그리기 (0) | 2022.01.21 |
Pygame: 타일셋 그리기(2) - 지형 타일셋 제작 (0) | 2022.01.20 |
Pygame: 타일 맵 만들기 (0) | 2022.01.18 |
파이썬 게임 개발: Pygame 시작하기 (0) | 2022.01.17 |
댓글