From 9598fe7d355680889eedb93d5c48d7cee5ae5616 Mon Sep 17 00:00:00 2001 From: En Yi Date: Tue, 21 Jan 2025 21:31:03 +0800 Subject: [PATCH] Fix preview render size & add to level select --- res/level_render.py | 22 ++++++++++++++++------ scenes/level_select_scene.c | 6 ++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/res/level_render.py b/res/level_render.py index b206cc4..c3d6632 100644 --- a/res/level_render.py +++ b/res/level_render.py @@ -151,10 +151,12 @@ converted_filename = '.'.join(fileparts) # Get the tile size that fit within the dimensions # Error out if tile size is zero # Figure out the offset to center the render -TILE_SIZE = 8 + +IMG_WIDTH = 400 +IMG_HEIGHT = 400 # Each level should be packed as: [width, 2 bytes][height, 2 bytes][tile_type,entity,water,padding 1,1,1,1 bytes][tile_type,entity,water,padding 1,1,1,1 bytes]... # Then loop the levels. Read the layerIndstances -for level in all_levels[13:15]: +for level in all_levels[18:21]: n_chests : int = 0 # Search for __identifier for the level layout level_name = "" @@ -184,16 +186,22 @@ for level in all_levels[13:15]: width = level_layout["__cWid"] height = level_layout["__cHei"] print(f"Dim.: {width}x{height}. N Tiles: {width * height}") - IMG_WIDTH = width * TILE_SIZE - IMG_HEIGHT = height * TILE_SIZE + + TILE_SIZE = 400 // max(width, height) + TILE_SIZE = max(min(TILE_SIZE, 10),1) + # Create a W x H array of tile information n_tiles = width * height lvl_render = Image.new("RGBA", (IMG_WIDTH, IMG_HEIGHT), (255,255,255,0)) render_ctx = ImageDraw.Draw(lvl_render) + LVL_SIZE = (width*TILE_SIZE-1, height*TILE_SIZE-1) + OFFSET = ((IMG_WIDTH - LVL_SIZE[0]) // 2, (IMG_HEIGHT - LVL_SIZE[1])//2) + + render_ctx.rectangle((OFFSET, (OFFSET[0]+width*TILE_SIZE-1, OFFSET[1] + height*TILE_SIZE-1)), (64,64,64,255)) # Loop through gridTiles, get "d" as the index to fill the info for i, tile in enumerate(level_layout["gridTiles"]): - x, y= (tile["d"][0] % width * TILE_SIZE, tile["d"][0] // width * TILE_SIZE) + x, y= (tile["d"][0] % width * TILE_SIZE + OFFSET[0], tile["d"][0] // width * TILE_SIZE + OFFSET[1]) try: if ids_tiletype_map[tile["t"]] in TILETYPE_SHAPE_MAP: draw_func, colour = TILETYPE_SHAPE_MAP[ids_tiletype_map[tile["t"]]] @@ -209,7 +217,9 @@ for level in all_levels[13:15]: for ent in entity_layout["entityInstances"]: x,y = ent["__grid"] x *= TILE_SIZE + x += OFFSET[0] y *= TILE_SIZE + y += OFFSET[1] ent = ent["__identifier"] try: if ent in TILETYPE_SHAPE_MAP: @@ -225,7 +235,7 @@ for level in all_levels[13:15]: for i, water_level in enumerate(water_layout["intGridCsv"]): if water_level == 0: continue - x, y = (i % width * TILE_SIZE, i // width * TILE_SIZE) + x, y = (i % width * TILE_SIZE + OFFSET[0], i // width * TILE_SIZE + OFFSET[1]) height = TILE_SIZE * water_level / 4 render_ctx.rectangle(((x,y+TILE_SIZE-height), (x+TILE_SIZE-1, y+TILE_SIZE-1)), WATER_COLOUR) lvl_render.show() diff --git a/scenes/level_select_scene.c b/scenes/level_select_scene.c index a1d275a..db0f5e1 100644 --- a/scenes/level_select_scene.c +++ b/scenes/level_select_scene.c @@ -10,10 +10,16 @@ static void level_select_render_func(Scene_t* scene) Sprite_t* spr = get_sprite(&scene->engine->assets, "bunny_spr1"); Sprite_t* level_board = get_sprite(&scene->engine->assets, "lvl_board"); Sprite_t* level_select = get_sprite(&scene->engine->assets, "lvl_select"); + Sprite_t* preview = get_sprite(&scene->engine->assets, "lvlprvw"); BeginTextureMode(scene->layers.render_layers[0].layer_tex); ClearBackground(BLANK); draw_sprite(level_select, 0, (Vector2){0,0},0, false); draw_sprite(level_board, 0, (Vector2){level_select->frame_size.x,0},0, false); + + draw_sprite(preview, 0, (Vector2){ + level_select->frame_size.x + (level_board->frame_size.x - preview->frame_size.x) / 2, + (level_board->frame_size.y - preview->frame_size.y) / 2, + },0, false); DrawText("Level Select", 10, 10, 40, BLACK); vert_scrollarea_render(&data->scroll_area); draw_sprite(