336. Console usa el viewport de fondo

Integra en Console los viewports de framebuffer horizontal y de máscara de opacidad.

Lección 336 de 356 · tests/chapter_13_scrolling/test_336_console_uses_background_viewport.py

Archivo a actualizar

emulator/console.py

Por qué existe este paso

Los pasos 334 y 335 producen datos de fondo conscientes del viewport a partir del estado de desplazamiento actual de la PPU. Este paso ensambla esas funciones nuevas dentro de Console para que la ruta de fotograma completo use tanto el framebuffer desplazado como su máscara de opacidad correspondiente.

Qué cambia

Console.render_background_framebuffer()
    -> keeps the older fixed-background behavior

Console.render_framebuffer()
    -> uses ppu_background_viewport_to_framebuffer(self.ppu)
    -> uses the new viewport opacity mask through a compatibility alias
    -> passes both new results to the existing sprite compositor

¿Por qué usar un alias para la máscara? Las lecciones anteriores ya usan el nombre ppu_background_to_opaque_mask dentro de Console. Importar la nueva función de máscara de viewport bajo ese nombre permite que la ruta de fotograma completo use el nuevo comportamiento sin romper la compatibilidad con esas lecciones anteriores.

Limitación temporal de Super Mario Bros.: No te preocupes si todavía no se desplaza como se espera. Este paso usa solo una posición de desplazamiento para el fotograma completo. Super Mario Bros. usa una posición para la barra de estado fija y otra para el área de juego en movimiento durante el mismo fotograma. Por ello, el juego todavía puede mostrar un fondo estático, una barra de estado en movimiento u otro desplazamiento incorrecto después de que esta prueba pase. Eso es lo esperado. Los pasos futuros registrarán los cambios de desplazamiento y renderizarán la barra de estado y el juego como bandas horizontales separadas.

Fuera del alcance

  • cambiar la planificación del sprite-zero-hit
  • trazar las escrituras de $2005
  • renderizado de bandas de pantalla dividida
  • desplazamiento vertical por píxeles
  • pygame

Implementación de ejemplo completa

# emulator/console.py

from emulator.rendering.ppu_background_renderer import (
    ppu_background_to_framebuffer,
    # --- NEW LINE: FULL-FRAME RENDERING USES THE VIEWPORT ADAPTER ---
    ppu_background_viewport_to_framebuffer,
    # --- UPDATED LINE: USE THE NEW MASK WITH THE EXISTING CONSOLE NAME ---
    ppu_background_viewport_to_opaque_mask as ppu_background_to_opaque_mask,
    PATTERN_TABLE_0_ADDR,
    PATTERN_TABLE_1_ADDR,
)

...

def render_background_framebuffer(self) -> Framebuffer:
    # Keep the older background-only behavior for compatibility.
    return ppu_background_to_framebuffer(self.ppu)

def render_framebuffer(self) -> Framebuffer:
    # --- UPDATED LINE: FULL-FRAME OUTPUT USES THE VIEWPORT FRAMEBUFFER ---
    background = ppu_background_viewport_to_framebuffer(self.ppu)

    # The existing name now refers to the new viewport-mask function.
    background_opaque_mask = ppu_background_to_opaque_mask(self.ppu)

    ...
    # Everything remains the same below this point.

Ejecutar esta lección

uv run pytest tests/chapter_13_scrolling/test_336_console_uses_background_viewport.py -v