Minimal Game Boy Hello World using GBDK-2020 and PyBoy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

72 lines
2.4 KiB

import os
def decode_gb_tile(data):
pixels = [[0]*8 for _ in range(8)]
for y in range(8):
lsb = data[y*2]
msb = data[y*2+1]
for x in range(8):
bit_lsb = (lsb >> (7 - x)) & 1
bit_msb = (msb >> (7 - x)) & 1
pixels[y][x] = (bit_msb << 1) | bit_lsb
return pixels
RatSpriteData = [
0x00, 0x00, 0x07, 0x07, 0x3F, 0x38, 0x5E, 0x71, 0x5B, 0x74, 0x3F, 0x38, 0x07, 0x07, 0x00, 0x00,
0x00, 0x00, 0xF0, 0xF0, 0xC8, 0x08, 0xD4, 0x1C, 0xD4, 0x1C, 0xC8, 0x08, 0xF0, 0xF0, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x24, 0x3C, 0x3C, 0x3C, 0x3C, 0x24, 0x6E, 0x52, 0x7E, 0x42, 0x76, 0x4A,
0x7E, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x5A, 0x5A, 0x24, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00
]
tiles = [decode_gb_tile(RatSpriteData[i*16:(i+1)*16]) for i in range(4)]
colors = {0: ' ', 1: '░░', 2: '▓▓', 3: '██'}
rgb_colors = {0: (255,255,255), 1: (170,170,170), 2: (85,85,85), 3: (0,0,0)}
def print_and_save(name, pixels_2d, width, height):
print(f"--- {name} ---")
for y in range(height):
row_str = ""
for x in range(width):
row_str += colors[pixels_2d[y][x]]
print(row_str)
scale = 20
with open(f"/tmp/{name}.ppm", "w") as f:
f.write(f"P3\n{width*scale} {height*scale}\n255\n")
for y in range(height):
for sy in range(scale):
for x in range(width):
c = pixels_2d[y][x]
rgb = rgb_colors[c]
for sx in range(scale):
f.write(f"{rgb[0]} {rgb[1]} {rgb[2]} ")
f.write("\n")
right_pixels = [[0]*16 for _ in range(8)]
for y in range(8):
for x in range(8):
right_pixels[y][x] = tiles[0][y][x]
right_pixels[y][x+8] = tiles[1][y][x]
left_pixels = [[0]*16 for _ in range(8)]
for y in range(8):
for x in range(16):
left_pixels[y][x] = right_pixels[y][15-x]
down_pixels = [[0]*8 for _ in range(16)]
for y in range(8):
for x in range(8):
down_pixels[y][x] = tiles[2][y][x]
down_pixels[y+8][x] = tiles[3][y][x]
up_pixels = [[0]*8 for _ in range(16)]
for y in range(16):
for x in range(8):
up_pixels[y][x] = down_pixels[15-y][x]
print_and_save("sprite_right", right_pixels, 16, 8)
print_and_save("sprite_left", left_pixels, 16, 8)
print_and_save("sprite_down", down_pixels, 8, 16)
print_and_save("sprite_up", up_pixels, 8, 16)