Skip to content

Instantly share code, notes, and snippets.

@lynn
Created October 5, 2022 19:36
Show Gist options
  • Save lynn/ecc6baf5110416f719f10915616c3ead to your computer and use it in GitHub Desktop.
Save lynn/ecc6baf5110416f719f10915616c3ead to your computer and use it in GitHub Desktop.
Makes an animated GIF explaining the uxn sprite format
from PIL import Image, ImageDraw
sprite_data = bytes.fromhex('''
00 00 3c 06 1c 06 3c 00 00 7f c3 f9 e3 f9 c3 ff
00 00 68 2c 78 2c 34 00 00 fe ff ff ff ff ff ff
00 01 19 07 0f 1f 07 0f ff ff e7 fb fd fe ff ff
00 80 f0 e0 c0 f0 f8 f8 ff ff ff ff ff ff 7f 7f
0f 0e 0c 00 80 ff ff 7f ff ff ff ff 7f 00 00 00
e8 e0 e0 60 01 ff ff fe 7f ff ff ff fe 00 00 00
''')
print(sprite_data)
images = []
green = (0x00, 0x77, 0x66)
blue = (0x33, 0x00, 0xbb)
white = (0xee, 0xee, 0xee)
red = (0xdd, 0x77, 0x77)
palette = [green, blue, white, red]
black = (0,0,0)
canvas = [[0] * 16 for i in range(24)]
for i in range(96):
for b in range(8):
im = Image.new("RGB", (420, 232), black)
d = ImageDraw.Draw(im)
for j in range(96):
d.text((140 + j%16*16, 60 + j//16*20),
'%02x' % sprite_data[j], fill=white if i==j else green)
ty = i // 32
tx = i % 32 // 16
bit = i % 16 // 8
suby = i % 8
canvas[ty * 8 + suby][tx * 8 + b] |= (sprite_data[i] >> (7-b) & 1) << bit
for y in range(24):
for x in range(16):
k = 3
col = palette[canvas[y][x]]
d.rectangle((40+k*x, 70+k*y, 40+k*(x+1), 70+k*(y+1)), fill=col)
images.append(im)
images[0].save('animation.gif',
save_all=True, append_images=images[1:], optimize=False, duration=20, loop=0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment