soma0sd

코딩 & 과학 & 교육

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

itertoolsproduct함수는 여러개의 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)  # 타일셋 이미지 저장
반응형
태그:

댓글

End of content

No more pages to load