-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcover.py
More file actions
130 lines (113 loc) · 5.1 KB
/
Copy pathcover.py
File metadata and controls
130 lines (113 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# STAR BREAKER itch.io kapak gorseli (630x500) — tamamen kodla cizim (PIL).
# Piksel sahne 1/4 cozunurlukte cizilir, NEAREST ile x4 buyutulur (chunky pixel),
# baslik tam cozunurlukte Consolas Bold ile ustune basilir.
import random
from PIL import Image, ImageDraw, ImageFont
random.seed(42)
W, H = 630, 500
PW, PH = W // 4, H // 4 # 157 x 125 piksel sahne
# oyunun paleti
RED = (227, 36, 43)
WHITE = (242, 242, 242)
LGRAY = (216, 216, 216)
MGRAY = (154, 154, 154)
DGRAY = (106, 106, 106)
GOLD = (245, 197, 66)
ORANGE = (255, 136, 48)
CYAN = (53, 224, 208)
PURPLE = (168, 92, 240)
img = Image.new('RGB', (PW, PH), (5, 5, 10))
d = ImageDraw.Draw(img, 'RGBA')
# --- nebula sisleri (kirmizi/mor, cok silik)
for cx, cy, r, col in [(30, 30, 34, (90, 20, 30, 40)), (120, 90, 40, (60, 15, 60, 35)),
(140, 25, 26, (90, 20, 30, 30)), (20, 95, 30, (40, 20, 70, 35))]:
d.ellipse([cx - r, cy - r, cx + r, cy + r], fill=col)
# --- yildiz tarlasi
for _ in range(110):
x, y = random.randrange(PW), random.randrange(PH)
v = random.choice([90, 120, 160, 200, 240])
d.point((x, y), fill=(v, v, v))
for _ in range(8): # parlak artilar
x, y = random.randrange(4, PW - 4), random.randrange(4, PH - 4)
d.point([(x, y), (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)], fill=WHITE)
# --- halkali gezegen (sol alt)
px, py, pr = 26, 102, 26
d.ellipse([px - pr, py - pr, px + pr, py + pr], fill=(53, 64, 79))
d.ellipse([px - pr + 4, py - pr + 4, px + 6, py + 6], fill=(70, 86, 106))
d.ellipse([px - 2, py + 2, px + pr - 2, py + pr - 2], fill=(42, 51, 64))
d.arc([px - pr - 12, py - 9, px + pr + 12, py + 9], 200, 340, fill=(138, 122, 90), width=2)
d.arc([px - pr - 12, py - 9, px + pr + 12, py + 9], 20, 160, fill=(90, 80, 60), width=2)
# --- goktaslari (gri cok kenarlilar + krater)
def asteroid(cx, cy, r):
pts = []
import math
n = 9
for i in range(n):
a = i / n * 6.28318
rr = r + ((i * 53) % max(2, r // 2)) - r // 4
pts.append((cx + math.cos(a) * rr, cy + math.sin(a) * rr))
d.polygon(pts, fill=MGRAY, outline=DGRAY)
d.ellipse([cx - r // 3 - 2, cy - 2, cx - 2, cy + r // 3], fill=(122, 122, 122))
d.ellipse([cx + 1, cy - r // 3 - 1, cx + r // 3, cy - 1], fill=(130, 130, 130))
asteroid(128, 34, 12)
asteroid(34, 40, 7)
asteroid(140, 78, 6)
# volatile goktasi (turuncu — oyundaki yeni dusman!)
import math
pts = []
for i in range(9):
a = i / 9 * 6.28318
rr = 8 + ((i * 53) % 4) - 2
pts.append((104 + math.cos(a) * rr, 96 + math.sin(a) * rr))
d.polygon(pts, fill=(200, 100, 45), outline=(140, 60, 25))
# --- ROKET (merkez, dik, burun yukari) — oyunun falcon gemisinin poster hali
rx, ry = 66, 14 # burun ucu
bw = 12 # govde yari genisligi
bt, bb = ry + 26, ry + 62 # govde ust/alt
# govde
d.rectangle([rx - bw, bt, rx + bw, bb], fill=LGRAY)
d.rectangle([rx - bw, bt, rx - bw + 4, bb], fill=(180, 180, 180)) # sol golge serit
# burun konisi
d.polygon([(rx - bw, bt), (rx + bw, bt), (rx, ry)], fill=WHITE)
d.polygon([(rx - bw, bt), (rx - bw + 5, bt), (rx, ry + 4)], fill=(200, 200, 200))
# kirmizi serit + isim bandi
d.rectangle([rx - bw, bt + 6, rx + bw, bt + 12], fill=RED)
# pencere
d.ellipse([rx - 5, bt + 17, rx + 5, bt + 27], fill=(20, 30, 40), outline=CYAN)
d.ellipse([rx - 3, bt + 19, rx + 1, bt + 23], fill=(60, 120, 140))
# kanatlar (kirmizi, keskin)
d.polygon([(rx - bw, bb - 18), (rx - bw - 10, bb + 4), (rx - bw, bb)], fill=RED)
d.polygon([(rx + bw, bb - 18), (rx + bw + 10, bb + 4), (rx + bw, bb)], fill=RED)
d.polygon([(rx - bw, bb - 16), (rx - bw - 7, bb + 2), (rx - bw, bb - 4)], fill=(180, 30, 36))
# motor nozulu
d.rectangle([rx - 7, bb, rx + 7, bb + 4], fill=(90, 90, 90))
# alev (uc katman, zigzagli)
d.polygon([(rx - 7, bb + 4), (rx + 7, bb + 4), (rx + 4, bb + 14), (rx, bb + 22), (rx - 4, bb + 14)], fill=ORANGE)
d.polygon([(rx - 4, bb + 4), (rx + 4, bb + 4), (rx + 2, bb + 11), (rx, bb + 16), (rx - 2, bb + 11)], fill=GOLD)
d.polygon([(rx - 2, bb + 4), (rx + 2, bb + 4), (rx, bb + 9)], fill=WHITE)
# egzoz parcaciklari
for i, (ox, oy) in enumerate([(-6, 24), (5, 27), (-2, 31), (7, 33), (-8, 33), (2, 37)]):
v = 200 - i * 20
d.point((rx + ox, bb + oy), fill=(v, v // 2 + 60, 40))
# --- kirmizi mermi izleri (oyundaki otomatik ates hissi)
for (x1, y1) in [(88, 52), (95, 44), (102, 60)]:
d.rectangle([x1, y1, x1 + 5, y1 + 1], fill=RED)
# x4 buyut (nearest = keskin pikseller)
img = img.resize((PW * 4, PH * 4), Image.NEAREST)
if img.size != (W, H):
img = img.crop((0, 0, W, H))
# --- baslik (tam cozunurluk, oyunun menu stiliyle)
d2 = ImageDraw.Draw(img)
f_big = ImageFont.truetype('C:/Windows/Fonts/consolab.ttf', 58)
def center_text(y, text, font, fill, outline=None):
tw = d2.textlength(text, font=font)
x = (W - tw) / 2
if outline:
for ox in (-2, 0, 2):
for oy in (-2, 0, 2):
d2.text((x + ox, y + oy), text, font=font, fill=outline)
d2.text((x, y), text, font=font, fill=fill)
center_text(400, 'STAR BREAKER', f_big, WHITE, outline=(10, 10, 14))
out = r'C:\Users\imrai\Documents\RaidenTechnology\gmtk2026\dist\cover.png'
img.save(out)
print('OK ->', out, img.size)