finished converter and implemented sprite rendering

This commit is contained in:
2024-12-15 08:07:10 +01:00
parent 86c4c341b2
commit 147e8aa2dc
3 changed files with 148 additions and 29 deletions

View File

@@ -2,7 +2,28 @@ from kandinsky import *
print("Game started") print("Game started")
colors = [color(i) for i in [(26,28,44),(93,39,93),(177,62,83),(239,125,87),(255,205,117),(167,240,112),(56,183,100),(37,113,121),(41,54,111),(59,93,201),(65,166,246),(115,239,247),(244,244,244),(148,176,194),(86,108,134),(51,60,87)]] colors = [color(i) for i in [(26,28,44),(93,39,93),(177,62,83),(239,125,87),(255,205,117),(167,240,112),(56,183,100),(37,113,121),(41,54,111),(59,93,201),(65,166,246),(115,239,247),(244,244,244),(148,176,194),(86,108,134),(51,60,87)]]
sprites = {} sprites = {'assiette': (0, 2, 20, 17,
'ggggggg000000gggggggggggg00cccccc00gggggggg00cccccccccc00ggggg0cccccccccccccc0ggg0cccccddddddccccc0gg0ccccdccccccdcccc0g0ccccdccccccccdcccc00cccdccccccccccdccd00cccdcccccccccccccd00dccdcccccccccccccd00dcccdccccccccccccd0g0dcccccddcccccccd0gg0dccccccccccccccd0ggg0ddccccccccccdd0ggggg00ddccccccdd00gggggggg00dddddd00gggggggggggg000000ggggggg'),
'oignon': (3, 3, 16, 13,
'ggggggggggg00ggggggg00000g0650ggggg021122016650ggg0111c111210660g0211c111210g0500211cc11111200500211c11211110g0g012c112111110ggg012c111112120gggg01121112110gggg01221112110gggggg010122110gggggggg0g00000ggggggg'),
'oignon_coupe': (3, 5, 13, 14,
'gggggg00000ggggg000ccccc0ggg0cccc000c0gg0c00c100g0c00c0g0c1cc00c00c00g0c11cc1001cc00ccc110gg011cc1000c0ggg0011c0g0c0ggggg00c00g0c0ggggg01cc00c0gggggg011cc10ggggggg00110gggggggggg00gg'),
'planche': (0, 5, 20, 14,
'ggggg00000000000000ggggg0333333333333330g00g0333003333333330033003320c0333323330033333330cd022233330032333330ddc023333300332233330ddd033333002200333330ddd033330g00g03333330ddf03330gggg022222220fdf0220ggggg00000000ffff00gggggggggggggg00fdf0gggggggggggggggg0ff0ggggggggggggggggg00gg'),
'player_down': (3, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000000cc000gggg0ccccccccc0gggg00000000000ggggg04c848c40gggggg044444440ggggggg0000000ggggggg0cccdccc0ggggg0cccccdccc0gggg0c0cfcdc0c0gggg0c0cccdc0c0gggg000cfcdc000gggggg0cccdc0gggggggg0000000ggggggggg00g00ggggg'),
'player_left': (3, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000000cc000gggg0ccccccccc0gggg00000000000ggggg08c48c440gggggg044444440ggggggg0000000ggggggg0ccdcccc0ggggg0ccccdcccc0gggg0c0cfcd0cc0gggg0c0cccdc0c0gggg000cfcdc000gggggg0cccdc0gggggggg0000000ggggggg000gg000gggg'),
'player_right': (2, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000cc000000gggg0ccccccccc0gggg00000000000ggggg044c84c80gggggg044444440ggggggg0000000ggggggg0ccccdcc0ggggg0ccccdcccc0gggg0cc0dcfc0c0gggg0c0cdccc0c0gggg000cdcfc000gggggg0cdccc0gggggggg0000000gggggggg000gg000ggg'),
'player_up': (3, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000000cc000gggg0ccccccccc0gggg00000000000ggggg044444440gggggg044444440ggggggg0000000ggggggg0ccccccc0ggggg0ccccccccc0gggg0c0ccccc0c0gggg0c0ccccc0c0gggg000ccccc000gggggg0ccccc0gggggggg0000000ggggggggg00g00ggggg'),
'poele': (0, 0, 19, 19,
'gggggg00000000gggggggg000eeeeeeee000gggg0eeeffffffffeee0gg0eeffeeeeeeeeffee0g0efeeeeeeeeeeeefe0g0efeeeeeeeeeeeefe0g0eeeeeeeeeeeeeeee0g00eeeeeeeeeeeeee00g0b0000eeeeee0000f0g000fff000000ffff00g00fffffffffff000f0g0ff0000000000baf0g0ff0fabfffbafffba0g0f0ffbff2f3b3ffff0gg0fff0ffffffff0fff0g0fff0000000000fff0g0fff0gggggggg0fff0g0ff0gggggggggg0ff0gg00gggggggggggg00g'),
'salade': (1, 4, 18, 13,
'gggggggggggg0gggggggggg0000g0070gggggggg07777077570ggggg00755567567570ggg077567777777570gg07657765655767770g077776556556755770000076556556767070ggg075556555670g00ggg075556555670gggggg07665655670gggggggg077777770gggggggggg0000000gggggg'),
'salade_cuite': (2, 7, 15, 9,
'gggg0000000ggggg0055765567000g077755555556770g0655655555560g075566566565550g5666656655760g050705576750700g0g0g070606g0gggggggg0g0g0gggg')}
class Ingredient: class Ingredient:
def __init__(self, i_nom): def __init__(self, i_nom):
@@ -14,6 +35,20 @@ class Plat:
self.p_type = p_type self.p_type = p_type
self.p_ingredients = p_ingredients self.p_ingredients = p_ingredients
def draw_sprite(sprite_name: str, x: int, y: int, multiplier=1)->None:
if sprite_name not in sprites: raise ValueError('Sprite name not in sprites')
offx, offy, w, h, data = sprites[sprite_name]
curx, cury = x+offx, y+offy
for i in range(h):
for k in range(w):
px = int(data[w*i+k], 18)
if px != 16 and px != 17:
fill_rect(curx*multiplier,cury*multiplier,multiplier,multiplier,colors[px])
curx += 1
curx=x+offx
cury+=1
def draw_map(mapid: int): def draw_map(mapid: int):
if mapid==0: if mapid==0:
fill_rect(0,40,320,182,colors[4]) # table fill_rect(0,40,320,182,colors[4]) # table
@@ -29,3 +64,4 @@ def draw_map(mapid: int):
fill_rect(122,214,76,8,colors[15]) fill_rect(122,214,76,8,colors[15])
draw_map(0) draw_map(0)
draw_sprite("player_up", 0, 0, 2)

View File

@@ -2,12 +2,14 @@ from os import listdir
from os.path import isfile, join from os.path import isfile, join
from PIL import Image from PIL import Image
import numpy as np import numpy as np
import pprint
path = "./src/sprites/"
files_list = [f for f in listdir(path) if isfile(join(path, f))]
colors = [(26,28,44),(93,39,93),(177,62,83),(239,125,87),(255,205,117),(167,240,112),(56,183,100),(37,113,121),(41,54,111),(59,93,201),(65,166,246),(115,239,247),(244,244,244),(148,176,194),(86,108,134),(51,60,87)] colors = [(26,28,44),(93,39,93),(177,62,83),(239,125,87),(255,205,117),(167,240,112),(56,183,100),(37,113,121),(41,54,111),(59,93,201),(65,166,246),(115,239,247),(244,244,244),(148,176,194),(86,108,134),(51,60,87)]
def get_color_id(r, g, b, a)->str: def get_color_id(r: int, g: int, b: int, a: int)->str:
"""
Get the pixel color id, it is a str that goes from 0 to h
"""
if a ==0: # if transparent if a ==0: # if transparent
return "g" return "g"
try: try:
@@ -31,7 +33,10 @@ def get_color_id(r, g, b, a)->str:
case 15: case 15:
return "f" return "f"
def get_offset_x(img, w, h)->int: def get_offset_x(img: Image.Image, w: int, h: int)->int:
"""
Returns the x offset of an image
"""
offsetx = 0 offsetx = 0
for i in range(h): for i in range(h):
for i in range(w): for i in range(w):
@@ -42,7 +47,10 @@ def get_offset_x(img, w, h)->int:
offsetx+=1 offsetx+=1
return offsetx return offsetx
def get_offset_y(img, w, h)->int: def get_offset_y(img: Image.Image, w: int, h: int)->int:
"""
Returns the y offset of an image
"""
offsety = 0 offsety = 0
for i in range(w): for i in range(w):
for i in range(h): for i in range(h):
@@ -53,33 +61,85 @@ def get_offset_y(img, w, h)->int:
offsety+=1 offsety+=1
return offsety return offsety
def get_croped_image(img)-> tuple[Image.Image, int, int]: def get_croped_image(img: Image.Image)->tuple[Image.Image, int, int]:
"""
Removes the borders (transparent) from the image and return the x and y offsets to get it to the right position
"""
w, h = img.size w, h = img.size
offsetx, offsety = get_offset_x(image, w, h), get_offset_y(img, w, h) offsetx, offsety = get_offset_x(img, w, h), get_offset_y(img, w, h)
img_reversed = image.rotate(180) img_reversed = img.rotate(180)
neg_offsetx, neg_offsety = get_offset_y(img_reversed, w, h), get_offset_x(img_reversed, w, h) neg_offsetx, neg_offsety = get_offset_y(img_reversed, w, h), get_offset_x(img_reversed, w, h)
img_croped = img.crop((offsetx, offsety, h-neg_offsety, w-neg_offsetx)) img_croped = img.crop((offsetx, offsety, h-neg_offsety, w-neg_offsetx))
print("w;", w, "h",h,"x:",offsetx, "y:", offsety, "neg x:", neg_offsetx, "neg y:", neg_offsety)
print(h-offsetx-neg_offsetx, w-offsety-neg_offsety)
return (img_croped, offsetx, offsety) return (img_croped, offsetx, offsety)
image = Image.open(join(path, "salade.png")) def compress_string_image(img: str)->str:
image_croped, off_x, off_y = get_croped_image(image) pass
w, h = image_croped.size
result = ""
for v in range(h):
for k in range(w):
result += get_color_id(*image_croped.getpixel((k, v)))
print('result is,', result)
image_croped.show()
exit()
def convert_all_files(save_to_file: bool, compress_sprites: bool, path: str)->None:
files_list = [f for f in listdir(path) if isfile(join(path, f))]
result_file = None
final_result = {}
if save_to_file:
result_file = open(join(path, "sprites_converted.txt"), "w")
for file in files_list: for file in files_list:
if not file.endswith(".png"): if not file.endswith(".png"):
print("Skipping", file, ", because it's not a png image.") print("Skipping", file, ", because it's not a png image.")
break break
image = Image.open(join(path, file)) image = Image.open(join(path, file))
w, h = image.size image_croped, off_x, off_y = get_croped_image(image)
offsetx, offsety = 0,0 w, h = image_croped.size
result = ""
for v in range(h):
for k in range(w):
result += get_color_id(*image_croped.getpixel((k, v)))
print('Finished,', file, '\n', result, '\n')
final_result[file.removesuffix(".png")] = (off_x, off_y, w, h, result)
if save_to_file:
result_file.write(file + "\n" + pprint.pformat(final_result, compact=True) + '\n')
result_file.close()
def gui()->None:
print("""
___ _ _ ___ _
/ __|_ __ _ _(_) |_ ___ ___ / __|___ _ ___ _____ _ _| |_ ___ _ _
\__ \ '_ \ '_| | _/ -_|_-< | (__/ _ \ ' \ V / -_) '_| _/ -_) '_|
|___/ .__/_| |_|\__\___/__/ \___\___/_||_\_/\___|_| \__\___|_|
|_|
- An Ayabusa software
What would you like to do?
[1] Convert all sprites and print them
[2] Convert all sprites and save them to file (sprites_converted.txt)
[other] Quit/Cancel""")
save_to_file = False
compress_sprites = True
path = "./src/sprites/"
choice = input("Your choice [1]: ")
if choice == "1" or choice == "":
save_to_file = False
elif choice == "2":
save_to_file = True
else:
print("Invalid input exiting the program.")
exit()
choice = input("Where are your sprites located ? [./src/sprites/]: ")
if choice != "":
path = choice
choice = input("Would you like to compress the spites ? (Y/N) [Y]: ")
if choice == "Y" or choice == "":
compress_sprites = True
elif choice == "N":
compress_sprites = False
else:
print("Invalid input exiting the program.")
exit()
print("Convertion started ...\n")
convert_all_files(save_to_file, compress_sprites, path)
print("Convertion finished ...")
# Launch the text UI
gui()

View File

@@ -0,0 +1,23 @@
sprites_converted.txt
{'assiette': (0, 2, 20, 17,
'ggggggg000000gggggggggggg00cccccc00gggggggg00cccccccccc00ggggg0cccccccccccccc0ggg0cccccddddddccccc0gg0ccccdccccccdcccc0g0ccccdccccccccdcccc00cccdccccccccccdccd00cccdcccccccccccccd00dccdcccccccccccccd00dcccdccccccccccccd0g0dcccccddcccccccd0gg0dccccccccccccccd0ggg0ddccccccccccdd0ggggg00ddccccccdd00gggggggg00dddddd00gggggggggggg000000ggggggg'),
'oignon': (3, 3, 16, 13,
'ggggggggggg00ggggggg00000g0650ggggg021122016650ggg0111c111210660g0211c111210g0500211cc11111200500211c11211110g0g012c112111110ggg012c111112120gggg01121112110gggg01221112110gggggg010122110gggggggg0g00000ggggggg'),
'oignon_coupe': (3, 5, 13, 14,
'gggggg00000ggggg000ccccc0ggg0cccc000c0gg0c00c100g0c00c0g0c1cc00c00c00g0c11cc1001cc00ccc110gg011cc1000c0ggg0011c0g0c0ggggg00c00g0c0ggggg01cc00c0gggggg011cc10ggggggg00110gggggggggg00gg'),
'planche': (0, 5, 20, 14,
'ggggg00000000000000ggggg0333333333333330g00g0333003333333330033003320c0333323330033333330cd022233330032333330ddc023333300332233330ddd033333002200333330ddd033330g00g03333330ddf03330gggg022222220fdf0220ggggg00000000ffff00gggggggggggggg00fdf0gggggggggggggggg0ff0ggggggggggggggggg00gg'),
'player_down': (3, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000000cc000gggg0ccccccccc0gggg00000000000ggggg04c848c40gggggg044444440ggggggg0000000ggggggg0cccdccc0ggggg0cccccdccc0gggg0c0cfcdc0c0gggg0c0cccdc0c0gggg000cfcdc000gggggg0cccdc0gggggggg0000000ggggggggg00g00ggggg'),
'player_left': (3, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000000cc000gggg0ccccccccc0gggg00000000000ggggg08c48c440gggggg044444440ggggggg0000000ggggggg0ccdcccc0ggggg0ccccdcccc0gggg0c0cfcd0cc0gggg0c0cccdc0c0gggg000cfcdc000gggggg0cccdc0gggggggg0000000ggggggg000gg000gggg'),
'player_right': (2, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000cc000000gggg0ccccccccc0gggg00000000000ggggg044c84c80gggggg044444440ggggggg0000000ggggggg0ccccdcc0ggggg0ccccdcccc0gggg0cc0dcfc0c0gggg0c0cdccc0c0gggg000cdcfc000gggggg0cdccc0gggggggg0000000gggggggg000gg000ggg'),
'player_up': (3, 0, 15, 20,
'gg00000000000ggg0ccc0ccc0ccc0g0ccc0ccccc0ccc00ccc0ccccc0ccc00ccc0ccccc0ccc0g0ccc0ccc0ccc0ggg000000cc000gggg0ccccccccc0gggg00000000000ggggg044444440gggggg044444440ggggggg0000000ggggggg0ccccccc0ggggg0ccccccccc0gggg0c0ccccc0c0gggg0c0ccccc0c0gggg000ccccc000gggggg0ccccc0gggggggg0000000ggggggggg00g00ggggg'),
'poele': (0, 0, 19, 19,
'gggggg00000000gggggggg000eeeeeeee000gggg0eeeffffffffeee0gg0eeffeeeeeeeeffee0g0efeeeeeeeeeeeefe0g0efeeeeeeeeeeeefe0g0eeeeeeeeeeeeeeee0g00eeeeeeeeeeeeee00g0b0000eeeeee0000f0g000fff000000ffff00g00fffffffffff000f0g0ff0000000000baf0g0ff0fabfffbafffba0g0f0ffbff2f3b3ffff0gg0fff0ffffffff0fff0g0fff0000000000fff0g0fff0gggggggg0fff0g0ff0gggggggggg0ff0gg00gggggggggggg00g'),
'salade': (1, 4, 18, 13,
'gggggggggggg0gggggggggg0000g0070gggggggg07777077570ggggg00755567567570ggg077567777777570gg07657765655767770g077776556556755770000076556556767070ggg075556555670g00ggg075556555670gggggg07665655670gggggggg077777770gggggggggg0000000gggggg'),
'salade_cuite': (2, 7, 15, 9,
'gggg0000000ggggg0055765567000g077755555556770g0655655555560g075566566565550g5666656655760g050705576750700g0g0g070606g0gggggggg0g0g0gggg')}