Files

97 lines
3.7 KiB
Python

import sys, os
from PIL import Image, ImageDraw
TILE = 32
W, H = 8, 6 # 8x6 тайлов по 32px => 256x192
def px(x, y):
return (int(x * TILE), int(y * TILE))
def solid(x, y):
"""1 = твёрдое, 0 = пустое (для карты уровня)"""
if y >= H:
return 1 # нижняя грань мира
if x < 0 or x >= W:
return 1 # границы
return 0
def ground(x, y):
"""Земля: крайние/внутренние плитки, травка сверху"""
top = (y == 4)
# Пустота выше 5-го ряда для "неба" (т.к. y=4,5 земля)
if y < 4:
return 0
if y == 4: # верхний слой земли - травка
return 2 # grass top
return 1 # dirt
def build():
img = Image.new("RGBA", (int((W-0.001)*TILE), int((H-0.001)*TILE)), (0, 0, 0, 0))
d = ImageDraw.Draw(img)
# Небо уже в фоне (прозрачный). Рисуем тайлы.
for y in range(H):
for x in range(W):
t = ground(x, y)
x1, y1 = px(x, y)
if t == 1: # dirt
d.rectangle([x1+1, y1+1, x1+TILE-2, y1+TILE-2], fill=(139, 90, 43))
# текстура - точки
d.ellipse([x1+6, y1+6, x1+10, y1+10], fill=(110, 70, 33))
d.ellipse([x1+20, y1+18, x1+24, y1+22], fill=(90, 60, 28))
d.rectangle([x1+2, y1+TILE-3, x1+TILE-3, y1+TILE-2], fill=(120, 78, 38))
elif t == 2: # grass top
d.rectangle([x1+1, y1+8, x1+TILE-2, y1+TILE-2], fill=(139, 90, 43))
# зелёная "травка" сверху
d.rectangle([x1+1, y1+1, x1+TILE-2, y1+12], fill=(60, 160, 60))
# зубчики травки
for gx in range(3):
d.polygon([(x1+4+gx*10, y1+12), (x1+9+gx*10, y1+12),
(x1+6+gx*10, y1+5)], fill=(80, 190, 80))
return img
def save(img, name):
os.makedirs("assets/tiles", exist_ok=True)
img.save("assets/tiles/%s.png" % name)
print("wrote assets/tiles/%s.png" % name)
if __name__ == "__main__":
img = build()
save(img, "grass")
# Отдельные простые тайлы для кирпичей/?/труб
brick = Image.new("RGBA", px(2, 2), (0,0,0,0))
bd = ImageDraw.Draw(brick)
bd.rectangle([1,1, 30,30], fill=(200,120,60))
bd.rectangle([1,1, 30, 8], fill=(230,150,80))
bd.rectangle([1,25,30,30], fill=(160,90,40))
bd.line([(0,16),(32,16)], fill=(120,70,30), width=2)
bd.line([(16,1),(16,16)], fill=(120,70,30), width=2)
bd.line([(8,16),(8,31)], fill=(120,70,30), width=2)
save(brick, "brick")
q = Image.new("RGBA", px(2,2), (0,0,0,0))
qd = ImageDraw.Draw(q)
qd.rectangle([1,1,30,30], fill=(230,170,40))
qd.rectangle([2,2,29,29], fill=(250,210,80))
qd.polygon([(10,8),(22,8),(16,22)], fill=(80,40,0))
qd.polygon([(22,8),(16,22),(12,14)], fill=(80,40,0))
qd.ellipse([8,6,10,8], fill=(80,40,0))
qd.ellipse([20,6,22,8], fill=(80,40,0))
save(q, "question")
pipe = Image.new("RGBA", px(2,3), (0,0,0,0))
pd = ImageDraw.Draw(pipe)
pd.rectangle([0,0, 62,8], fill=(30,150,60)) # устье трубы
pd.rectangle([8,8, 54, 87], fill=(30,150,60)) # ствол
pd.rectangle([8,8, 14, 87], fill=(60,200,90)) # блик
pd.rectangle([0,0, 62, 12], fill=(20,110,45)) # обводка устья
save(pipe, "pipe")
cloud = Image.new("RGBA", px(3,2), (0,0,0,0))
cd = ImageDraw.Draw(cloud)
for cx, cy, r in [(6,14,8),(14,10,9),(22,14,8),(14,18,8)]:
cd.ellipse([cx-r,cy-r, cx+r,cy+r], fill=(255,255,255,255))
save(cloud, "cloud")
print("DONE tileset")