319. Limpiar sprite 0 hit en el prerenderizado
Limpia sprite 0 hit en el límite simplificado de prerenderizado.
Lección 319 de 356 · tests/chapter_11_sprite_zero_hit/test_319_clear_sprite_zero_hit_pre_render.py
Archivo a actualizar
emulator/ppu/ppu.pyPor qué existe este paso
Sprite 0 hit es el bit 6 de PPUSTATUS. Los juegos pueden usarlo como señal de temporización esperando a que el flag transicione a través de este ciclo de vida:
visible frame overlap -> sprite 0 hit becomes set
pre-render boundary -> sprite 0 hit becomes clear
next visible frame -> sprite 0 hit may become set againAntes de implementar la detección de solapamiento o de establecer el flag, este paso establece el invariante de limpieza/reinicio. Sin este reinicio, un futuro sprite 0 hit podría quedar activado para siempre y romper los juegos que esperan a que el flag se limpie antes de esperar al siguiente hit.
Modelo de temporización actual
El proyecto actualmente avanza la temporización en las transiciones de scanline. Por tanto, este paso limpia el flag cuando comienza el scanline 261. La temporización exacta a nivel de dot del hardware es un refinamiento de precisión futuro.
Fragmento de implementación de ejemplo
if self.scanline == PPU_PRE_RENDER_SCANLINE:
self.status &= ~VBLANK_STARTED
# --- NEW BLOCK: CLEAR SPRITE 0 HIT FOR THE NEXT FRAME ---
self.status &= ~SPRITE_ZERO_HIT
# --- END NEW BLOCK ---Invariante importante
Leer PPUSTATUS limpia el bit 7 de VBlank, pero no debe limpiar el bit 6 de sprite 0 hit. En el modelo actual, solo el evento del ciclo de vida de prerenderizado limpia sprite 0 hit.
Política actual de ROM manual
Continúa usando MarioBros.nes para las comprobaciones manuales actuales. La validación con Super Mario Bros. se pospone hasta que se implementen la detección de solapamiento y el establecimiento cronometrado del hit.
Fuera de alcance
- detectar el solapamiento entre sprite 0 y el fondo
- establecer sprite 0 hit
- hits fijos/falsos de scanline
- desbordamiento de sprites
- cambios en Console
- cambios en el renderizado
- validación con Super Mario Bros.
Ejecutar esta lección
uv run pytest tests/chapter_11_sprite_zero_hit/test_319_clear_sprite_zero_hit_pre_render.py -v