Este proyecto es un experimento de aprendizaje diseñado para explorar las capacidades de HTML5 Canvas y animaciones en JavaScript. El objetivo principal fue crear una simulación visual que combina un cielo estrellado interactivo con una criatura espacial procedural, mientras se aprenden conceptos fundamentales como:
- Manipulación del Canvas API
- Programación orientada a objetos en JavaScript
- Sistemas de animación basados en requestAnimationFrame
- Gestión de estados y renderizado eficiente
- Patrones de diseño para aplicaciones web interactivas
- Generación procedural de movimiento
- Interacción basada en eventos del mouse
El resultado es una aplicación web que presenta dos elementos principales:
- Un cielo nocturno animado con estrellas que parpadean de forma dinámica
- Una criatura espacial única que se desplaza por el canvas con movimientos procedurales de sus extremidades, simulando una forma de vida alienígena. Esta entidad exhibe dos comportamientos distintos:
- Movimiento autónomo cuando el cursor del mouse está inmóvil
- Seguimiento suave del cursor cuando el usuario mueve el mouse
- Navegador web moderno con soporte para Canvas API
- JavaScript habilitado
- Resolución mínima recomendada: 1024x768
- Clonar el repositorio:
git clone https://github.com/devjoi2018/starry-sky.git
- Navegar al directorio del proyecto:
cd starry-sky - Abrir
src/index.htmlen un navegador web
El proyecto está organizado en las siguientes carpetas y archivos:
starry-sky
├── src
│ ├── index.html
│ ├── css
│ │ ├── styles.css
│ │ └── animations.css
│ ├── js
│ │ ├── main.js
│ │ ├── Star.js
│ │ ├── SkyRenderer.js
│ │ ├── AnimationController.js
│ │ ├── SpaceCreature.js
│ │ └── ParticleSystem.js
│ └── utils
│ └── constants.js
└── README.md
- Clase:
Star- Constructor:
constructor(x, y, size, brightness);
- Propiedades:
x: Posición horizontal de la estrella.y: Posición vertical de la estrella.size: Tamaño de la estrella.
- Métodos:
draw(): Dibuja la estrella en el lienzo.animate(): Aplica la animación de brillo a la estrella.
- Métodos Nuevos:
setBrightness(value): Ajusta el brillo de la estrellaupdate(): Actualiza el estado de la estrella
- Constructor:
- Clase:
SkyRenderer- Métodos:
initializeCanvas(): Inicializa el lienzo para el renderizado.render(stars): Renderiza las estrellas en el cielo.
- Métodos:
- Clase:
AnimationController- Métodos:
start(): Inicia las animaciones de las estrellas.stop(): Detiene las animaciones.update(): Actualiza el estado de las animaciones.
- Métodos:
- Clase:
SpaceCreature- Constructor:
constructor(x, y, size);
- Métodos:
draw(): Renderiza la criatura espacialupdate(mouseX, mouseY): Actualiza la posición y estadoanimateTentacles(): Controla la animación de las extremidadesfollowMouse(mouseX, mouseY): Gestiona el comportamiento de seguimiento
- Constructor:
- Clase:
ParticleSystem- Constructor:
constructor(maxParticles);
- Métodos:
emit(x, y): Emite partículas desde una posiciónupdate(): Actualiza el estado de todas las partículasrender(): Dibuja las partículas en el canvas
- Constructor:
- Funciones Principales:
init(): Inicializa la aplicaciónanimate(): Maneja el loop principal de animaciónhandleResize(): Gestiona el redimensionamiento del canvassetupEventListeners(): Configura los listeners de eventos
-
Movimiento Autónomo:
- La criatura se desplaza libremente por el espacio cuando el mouse está quieto
- Sus extremidades se mueven de forma procedural, simulando un nado espacial
- El movimiento sigue patrones orgánicos y fluidos
-
Seguimiento del Cursor:
- Al mover el mouse, la criatura transiciona suavemente hacia la posición del cursor
- Las extremidades mantienen su animación procedural durante el seguimiento
- La velocidad de seguimiento está regulada para mantener un movimiento natural
Puedes personalizar el comportamiento modificando las constantes en utils/constants.js:
{
MAX_STARS: 200,
MIN_BRIGHTNESS: 0.3,
MAX_BRIGHTNESS: 1.0,
ANIMATION_SPEED: 0.05
}Para utilizar el proyecto, simplemente abre el archivo index.html en un navegador. Las estrellas comenzarán a parpadear automáticamente.
- Haz fork del repositorio
- Crea una rama para tu función:
git checkout -b feature/nueva-funcion - Realiza tus cambios y haz commit:
git commit -m 'Agrega nueva función' - Envía un pull request
- Usa ESLint con la configuración proporcionada
- Mantén el código documentado usando JSDoc
- Sigue las convenciones de nombres existentes
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
