Texture
SFML Texture object for sprite atlases and tile sheets.
Overview
A Texture loads an image file and divides it into a grid of sprites based on the specified tile dimensions. Textures are shared across Sprites, Grids, Entities, and TileLayers. McRogueFace caches textures internally, so loading the same image with the same tile size returns the same texture object.
Quick Reference
import mcrfpy
# Load a 16x16 tile sprite sheet
texture = mcrfpy.Texture("assets/sprites/dungeon.png", 16, 16)
# Check texture properties
print(f"Sprite size: {texture.sprite_width}x{texture.sprite_height}")
print(f"Sheet size: {texture.sheet_width}x{texture.sheet_height}")
print(f"Total sprites: {texture.sprite_count}")
# Use with Sprite
sprite = mcrfpy.Sprite(pos=(100, 100), texture=texture, sprite_index=0)
# Use with Grid
grid = mcrfpy.Grid(grid_size=(20, 15), texture=texture)
# Use with Entity
player = mcrfpy.Entity(pos=(5, 5), texture=texture, sprite_index=84)
Constructor
mcrfpy.Texture(filename: str, sprite_width: int, sprite_height: int)
| Parameter | Type | Description |
|---|---|---|
filename |
str | Path to image file (PNG, JPG, etc.) |
sprite_width |
int | Width of each sprite in pixels |
sprite_height |
int | Height of each sprite in pixels |
Raises IOError if the image file cannot be loaded.
Properties
| Property | Type | Access | Description |
|---|---|---|---|
source |
str | read-only | Path to the loaded image file |
sprite_width |
int | read-only | Width of each sprite in pixels |
sprite_height |
int | read-only | Height of each sprite in pixels |
sheet_width |
int | read-only | Total width of texture in pixels |
sheet_height |
int | read-only | Total height of texture in pixels |
sprite_count |
int | read-only | Total number of sprites in the sheet |
Sprite Index Calculation
Sprites are indexed left-to-right, top-to-bottom, starting from 0:
+----+----+----+----+
| 0 | 1 | 2 | 3 |
+----+----+----+----+
| 4 | 5 | 6 | 7 |
+----+----+----+----+
| 8 | 9 | 10 | 11 |
+----+----+----+----+
To calculate the index for a sprite at row r, column c:
columns = texture.sheet_width // texture.sprite_width
index = r * columns + c
Examples
Basic Texture Loading
import mcrfpy
# Load a sprite sheet
texture = mcrfpy.Texture("assets/kenney_tinydungeon.png", 16, 16)
# Create sprites using different indices
floor = mcrfpy.Sprite(pos=(0, 0), texture=texture, sprite_index=0)
wall = mcrfpy.Sprite(pos=(16, 0), texture=texture, sprite_index=1)
player = mcrfpy.Sprite(pos=(32, 0), texture=texture, sprite_index=84)
Texture for Grid and Entities
# Load texture
texture = mcrfpy.Texture("assets/tiles.png", 16, 16)
# Create grid using texture
grid = mcrfpy.Grid(
grid_size=(40, 30),
texture=texture,
pos=(0, 0),
size=(640, 480)
)
# Set tile sprites
for x in range(40):
for y in range(30):
cell = grid.at(x, y)
cell.sprite_index = 0 # Floor tile
# Add entity with same texture
player = mcrfpy.Entity(
pos=(5, 5),
texture=texture,
sprite_index=84 # Player sprite
)
grid.entities.append(player)
Texture Manager
class TextureManager:
_textures = {}
@classmethod
def get(cls, name):
"""Get a preloaded texture by name."""
return cls._textures.get(name)
@classmethod
def load(cls, name, path, tile_w, tile_h):
"""Load and register a texture."""
cls._textures[name] = mcrfpy.Texture(path, tile_w, tile_h)
return cls._textures[name]
@classmethod
def preload_all(cls):
"""Load all game textures."""
cls.load("dungeon", "assets/dungeon.png", 16, 16)
cls.load("characters", "assets/chars.png", 16, 16)
cls.load("ui", "assets/ui.png", 8, 8)
cls.load("effects", "assets/effects.png", 32, 32)
# Usage
TextureManager.preload_all()
dungeon_tex = TextureManager.get("dungeon")
Sprite Sheet Information
def print_texture_info(texture):
"""Display texture properties."""
cols = texture.sheet_width // texture.sprite_width
rows = texture.sheet_height // texture.sprite_height
print(f"Source: {texture.source}")
print(f"Sheet size: {texture.sheet_width}x{texture.sheet_height} pixels")
print(f"Sprite size: {texture.sprite_width}x{texture.sprite_height} pixels")
print(f"Grid: {cols} columns x {rows} rows")
print(f"Total sprites: {texture.sprite_count}")
texture = mcrfpy.Texture("assets/sprites.png", 16, 16)
print_texture_info(texture)
Animated Sprite Frames
class AnimatedSprite:
def __init__(self, sprite, start_index, frame_count):
self.sprite = sprite
self.start_index = start_index
self.frame_count = frame_count
self.current_frame = 0
self.frame_time = 0.1 # seconds per frame
self.elapsed = 0
def update(self, dt):
self.elapsed += dt
if self.elapsed >= self.frame_time:
self.elapsed -= self.frame_time
self.current_frame = (self.current_frame + 1) % self.frame_count
self.sprite.sprite_index = self.start_index + self.current_frame
# Usage: Character walk animation (frames 0-3)
texture = mcrfpy.Texture("assets/character.png", 16, 16)
sprite = mcrfpy.Sprite(pos=(100, 100), texture=texture, sprite_index=0)
anim = AnimatedSprite(sprite, start_index=0, frame_count=4)
Different Tile Sizes
# Standard dungeon tiles
tiles_16 = mcrfpy.Texture("assets/tiles_16x16.png", 16, 16)
# Larger character sprites
chars_32 = mcrfpy.Texture("assets/characters_32x32.png", 32, 32)
# Small UI icons
icons_8 = mcrfpy.Texture("assets/icons_8x8.png", 8, 8)
# Non-square tiles (isometric)
iso_tiles = mcrfpy.Texture("assets/isometric.png", 64, 32)
Notes
- Supported formats: PNG (recommended), JPG, BMP, TGA
- PNG with transparency is recommended for sprites
- Textures are cached internally - same file + tile size returns same object
- Large textures may impact memory and performance
- Sprite indices are 0-based and wrap left-to-right, top-to-bottom