⚠️ Clean-Room / Educativo

Este proyecto es educativo y Open Source. No se copia código de otros emuladores. Implementación basada únicamente en documentación técnica y tests permitidas.

Pantalla de Carga Animada

Fecha: 2025-12-18 Step ID: 0084 Estado: Verified

Resumen

Se implementó una pantalla de carga animada que se muestra durante 3.5 segundos al iniciar el emulador. La pantalla muestra el icono de la aplicación (viboycolor-icon.png) centrado en la pantalla y texto "Loading..." con puntos animados que cambian cada 300ms (Loading. → Loading.. → Loading...). La animación utiliza pygame.time.Clock() para mantener 60 FPS y permite cerrar la aplicación con ESC o cerrando la ventana durante la carga.

Concepto de Hardware

Aunque la pantalla de carga no es parte del hardware original de la Game Boy, es una característica común en emuladores modernos que mejora la experiencia de usuario. Proporciona feedback visual durante la inicialización del sistema y da tiempo para que todos los componentes se inicialicen correctamente antes de comenzar la emulación.

La animación de puntos es una técnica clásica de retro gaming que indica que el sistema está procesando. El uso de pygame.time.Clock() garantiza que la animación se ejecute a 60 FPS, proporcionando una experiencia visual suave y profesional.

Implementación

Se añadió el método _show_loading_screen() a la clase Renderer que se ejecuta automáticamente después de inicializar la ventana de Pygame.

Componentes creados/modificados

  • src/gpu/renderer.py: Añadido método _show_loading_screen() y llamada desde __init__()

Decisiones de diseño

  • Duración configurable: El método acepta un parámetro duration (por defecto 3.5 segundos) para permitir ajustes futuros.
  • Escalado automático del icono: El icono se escala automáticamente si es demasiado grande, manteniendo su proporción y limitando su tamaño a 1/3 de la ventana.
  • Fuente retro: Se utiliza una fuente monospace (Courier) en negrita para dar un aspecto retro al texto.
  • Animación suave: Los puntos cambian cada 300ms, creando un ciclo de 1 a 3 puntos (Loading. → Loading.. → Loading...).
  • Control de eventos: Durante la carga se pueden manejar eventos (cerrar ventana, presionar ESC) para permitir salir si es necesario.
  • FPS controlado: Se usa pygame.time.Clock() para mantener 60 FPS durante la animación.

Código implementado

def _show_loading_screen(self, duration: float = 3.5) -> None:
    """Muestra una pantalla de carga con el icono y texto animado."""
    # Cargar icono y escalarlo si es necesario
    icon_path = Path(__file__).parent.parent.parent / "viboycolor-icon.png"
    # ... carga y escalado del icono ...
    
    # Inicializar fuente retro
    font = pygame.font.SysFont("courier", font_size, bold=True)
    
    # Bucle de animación con control de tiempo
    clock = pygame.time.Clock()
    start_time = pygame.time.get_ticks()
    dot_count = 0
    dot_interval = 300  # Cambiar puntos cada 300ms
    
    while elapsed < duration:
        # Actualizar animación de puntos
        if current_time - last_dot_time >= dot_interval:
            dot_count = (dot_count + 1) % 3
            dots = "." * (dot_count + 1)  # 1, 2, o 3 puntos
            loading_text = f"Loading{dots}"
        
        # Dibujar icono centrado y texto
        # ... renderizado ...
        
        clock.tick(60)  # 60 FPS

Archivos Afectados

  • src/gpu/renderer.py - Añadido método _show_loading_screen() y llamada desde __init__()

Tests y Verificación

La verificación se realizó mediante ejecución manual de la aplicación:

  • Verificación visual: Se ejecutó el emulador y se comprobó que la pantalla de carga aparece correctamente con el icono centrado y el texto animado.
  • Verificación de duración: Se confirmó que la pantalla de carga dura aproximadamente 3.5 segundos antes de comenzar la emulación.
  • Verificación de animación: Se observó que los puntos cambian suavemente cada 300ms en el ciclo Loading. → Loading.. → Loading...
  • Verificación de eventos: Se comprobó que se puede cerrar la aplicación con ESC o cerrando la ventana durante la carga.
  • Verificación de escalado: Se verificó que el icono se escala correctamente si es demasiado grande, manteniendo su proporción.

Resultado: Verified - La pantalla de carga funciona correctamente con animación suave y control de eventos.

Fuentes Consultadas

Integridad Educativa

Lo que Entiendo Ahora

  • Control de tiempo en Pygame: pygame.time.Clock() permite controlar el FPS de la aplicación y pygame.time.get_ticks() proporciona el tiempo transcurrido en milisegundos desde que se inicializó Pygame.
  • Animación de texto: La animación de puntos se logra actualizando el texto cada cierto intervalo de tiempo y renderizándolo de nuevo en cada frame.
  • Escalado de imágenes: pygame.transform.scale() permite redimensionar imágenes manteniendo o no la proporción, y es importante calcular el factor de escala correctamente para evitar distorsión.
  • Fuentes del sistema: Pygame puede usar fuentes del sistema con pygame.font.SysFont(), lo que garantiza compatibilidad entre diferentes sistemas operativos.

Lo que Falta Confirmar

  • No hay aspectos pendientes de confirmar en esta implementación. El comportamiento está bien documentado en la API de Pygame.

Hipótesis y Suposiciones

No hay suposiciones en esta implementación. El comportamiento de las funciones de Pygame utilizadas está documentado oficialmente y la implementación sigue las mejores prácticas para animaciones y control de tiempo en Pygame.

Próximos Pasos

  • [ ] Continuar con mejoras de rendimiento y funcionalidad del emulador
  • [ ] Implementar características adicionales según necesidades del proyecto