# atlas.ludic — the namespaced spritesheet / atlas API (#81): load one sheet and # address a cell by grid coords or by name, including sprites that span more than # one cell, instead of one png_load per 16x16 file. Cells are sub-rects of the kept # image, so they are not restricted to the 16x16 sprite table. Draws go through the # camera / zoom / clip. # # Deterministic; a full run prints: 16 16 32 48 1 1 1 16 1 program AtlasDemo { # a model so the program runs the ECS and links the core runtime / framebuffer. property Cam { z: fixed = 1.0 } model V { Cam } function bi(b: bool) -> int { if b { return 1 }; return 0 } entry { let sheet = Sprite.sheet("assets/kenney/tiny-dungeon/Tilemap/tilemap_packed.png", 16, 16) let cell = Sprite.cell(sheet, 0, 0) print(Sprite.width(cell)) # 16 print(Sprite.height(cell)) # 16 let span = Sprite.cell_span(sheet, 0, 0, 2, 3) # a sprite spanning 2x3 cells print(Sprite.width(span)) # 32 print(Sprite.height(span)) # 48 let d = Sprite.define("hero", sheet, 2, 3) # name a cell print(bi(Sprite.named("hero") == d)) # 1 — looked up by name print(bi(Assets.get("hero") == d)) # 1 — Assets.get is the same lookup print(bi(Sprite.named("nope") == (-1))) # 1 — an unknown name is -1 let whole = Assets.image("assets/kenney/tiny-dungeon/Tiles/tile_0096.png") print(Sprite.width(whole)) # 16 — a whole tile as one sprite # draw verification: clear, draw the tile, count non-transparent pixels drawn. Screen.clear(0) Sprite.draw(whole, 10, 10) var n = 0 for yy in 10 .. 26 { for xx in 10 .. 26 { if Screen.pixel(xx, yy) != 0 { n += 1 } } } print(bi(n > 0)) # 1 — the sprite drew content } }