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
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
- Documentación de Pygame:
pygame.time.Clock()- https://www.pygame.org/docs/ref/time.html#pygame.time.Clock - Documentación de Pygame:
pygame.font- https://www.pygame.org/docs/ref/font.html - Documentación de Pygame:
pygame.transform.scale()- https://www.pygame.org/docs/ref/transform.html#pygame.transform.scale
Integridad Educativa
Lo que Entiendo Ahora
- Control de tiempo en Pygame:
pygame.time.Clock()permite controlar el FPS de la aplicación ypygame.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