Add composite sprite_grid for multi-tile entities, closes #237

Entities can now specify per-tile sprite indices via the sprite_grid
property. When set, each tile in a multi-tile entity renders its own
sprite from the texture atlas instead of the single entity sprite.

API:
  entity.tile_size = (3, 2)
  entity.sprite_grid = [[10, 11, 12], [20, 21, 22]]
  entity.sprite_grid = None  # revert to single sprite

Accepts nested lists, flat lists, or tuples. Use -1 for empty tiles.
Dimensions must match tile_width x tile_height.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
John McCardle 2026-04-10 04:15:06 -04:00
commit 6bf5c451a3
4 changed files with 248 additions and 6 deletions

View file

@ -207,14 +207,30 @@ void UIGrid::render(sf::Vector2f offset, sf::RenderTarget& target)
continue; // Skip this entity as it's not visible
}
//auto drawent = e->cGrid->indexsprite.drawable();
auto& drawent = e->sprite;
//drawent.setScale(zoom, zoom);
drawent.setScale(sf::Vector2f(zoom, zoom));
auto pixel_pos = sf::Vector2f(
(e->position.x*cell_width - left_spritepixels + e->sprite_offset.x) * zoom,
(e->position.y*cell_height - top_spritepixels + e->sprite_offset.y) * zoom );
drawent.render(pixel_pos, *activeTexture);
// #237: Composite sprite grid - render per-tile sprites
if (!e->sprite_grid.empty() && e->sprite.getTexture()) {
auto tex = e->sprite.getTexture();
for (int dy = 0; dy < e->tile_height; dy++) {
for (int dx = 0; dx < e->tile_width; dx++) {
int idx = e->sprite_grid[dy * e->tile_width + dx];
if (idx < 0) continue;
auto tile_pos = sf::Vector2f(
pixel_pos.x + dx * cell_width * zoom,
pixel_pos.y + dy * cell_height * zoom);
auto spr = tex->sprite(idx, tile_pos, sf::Vector2f(zoom, zoom));
activeTexture->draw(spr);
}
}
} else {
// Single sprite path
auto& drawent = e->sprite;
drawent.setScale(sf::Vector2f(zoom, zoom));
drawent.render(pixel_pos, *activeTexture);
}
entitiesRendered++;
}