305. Soporte de volteo en el renderizado de sprites

Añadir soporte de volteo horizontal y vertical al renderizado de un sprite.

Lección 305 de 356 · tests/chapter_09_sprite_rendering/test_305_sprite_render_flip_support.py

Archivo a actualizar

emulator/rendering/sprite_renderer.py

Por qué existe este paso

Los atributos de sprite ya decodifican los bits de volteo horizontal y vertical. El renderizador de un sprite ahora debería usar esos bits al elegir qué píxel CHR dibujar.

Bits de volteo en los atributos de sprite

bit 6: horizontal flip
bit 7: vertical flip

Modelo importante

El volteo refleja la imagen dentro de la caja 8x8 del sprite. No mueve la posición del sprite en pantalla.

Ejemplo de implementación sugerido dentro de render_sprite_8x8_to_framebuffer():

for tile_y in range(8):
    for tile_x in range(8):
        source_x = 7 - tile_x if attributes.flip_horizontal else tile_x
        source_y = 7 - tile_y if attributes.flip_vertical else tile_y

        color_index = color_indexes[source_y][source_x]

        if color_index == 0:
            continue

        screen_x = sprite.x + tile_x
        screen_y = sprite.y + tile_y

        ...

Ejemplo mínimo

original row:          1 2 3 . . . . .
horizontal flip row:   . . . . . 3 2 1

Concepto erróneo frecuente

"Horizontal flip should change sprite.x."

No. La caja de destino permanece en sprite.x/sprite.y. Solo se refleja la búsqueda del píxel de origen.

Fuera del alcance

  • renderizado de los 64 sprites
  • prioridad de sprite detrás del fondo
  • sprite 0 hit
  • sprite overflow
  • pygame

Ejecutar esta lección

uv run pytest tests/chapter_09_sprite_rendering/test_305_sprite_render_flip_support.py -v