Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome, Safari or Firefox browser. Upcoming version 10 of Internet Explorer should also handle it.
Vimeo: bit.ly/video-juegos-en-js
- Sergio Ruiz
- @serginator
- www.serginator.com
- Carlos Benitez
- @etnassoft
- www.etnassoft.com
- www.openlibra.com
Antes y ahora
- Hardware
- 8/16 bits
- 2D
- Optimización
- Navegador
- Memoria
- 2D y 3D (WebGL)
- Optimización
HTML5
- Introduce el elemento canvas
- Audio
- Vídeo
- Transformaciones CSS
- LocalStorage (OFFLINE)
- WebSockets
- NodeJS
Frameworks
DE PAGO
- impactJS ($99)GRATUITOS
- Akihabara- Crafty
- LimeJS
- MelonJS
- Mibbu
Herramientas
Editor de niveles
Validar código
Depurar código
Navegador
Firefox
- ENGINE: SpiderMonkey
- Mejor para desarrollar
Chrome
- ENGINE: V8
- Mejor para ejecutar
3D
WebGL
- OpenGL 2.0
- Aceleración por hardware
- Juegos y aplicaciones gráficas
- Chrome WebGL Experiments
Y ahora la chicha
Preparación de la web
- Hoja de estilos
- Necesaria como mínimo para el canvas
- Canvas
- Es el elemento que nos servirá de "lienzo"
Página desde la que empezamos
El CSS
Y el JS
Componentes de un juego
- Gameloop
- Keyhandler
- Objetos (personajes, balas, etc)
- Colisiones
- IA
Gameloop
setTimeout
- Antes lo hacíamos de esta forma:
- Ahora se hace con requestAnimationFrame
requestAnimationFrame
- 60 FPS
- Ahorro en CPU, GPU, memoria y batería
update()
Se encarga de actualizar el estado del juego
draw()
Se encarga de dibujar el buffer en el contexto
buffer y bufferctx
Dibujamos en éstos porque al renderizar las imágenes sin mostrarlas ganamos mucho en rendimiento. Luego la copia del buffer al canvas actual es súper rápido.KeyHandler
Objetos
Player
Tenemos dos formas de crear objetos en JavaScript. Una sería prototipando, y la otra sería en el propio objeto. Por claridad nos vamos a decantar por hacerlo dentro de la misma función.
Normal
var Ship = function(){{this.speed = 10;
this.posX = 0;
this.posY = 0;
this.moreSpeed = function(newSpeed){
this.speed += newSpeed;
}
}
Prototipado
var Ship = function(){this.speed = 10;
this.posX = 0;
this.posY = 0;
}
Ship.prototype.moreSpeed = function(newSpeed){
this.speed += newSpeed;
}
console.log(a.speed);
a.moreSpeed(20);
console.log(a.speed);
Player - Nuestro ejemplo
Player - Sprites
Aunque lo pongamos más adelante en Recursos, cabe mencionar una web desde la que podéis descargar gran cantidad de sprites con los que crear cualquier juego que queráis:
Sprite DatabaseDisparos
Enemigos
Colisiones
- Podemos complicarnos tanto como queramos
- En nuestro caso, serán colisiones rectangulares
- Artículo más que recomendado:
Collision detection for dummies
Colisiones - Ejemplo
IA
Hasta el primer juego creado tuvo una IA.
Algo tan "simple" como un Pong, o
tan complejo como un Ajedrez.
- Fuerza bruta (damas, 3 en raya)
- Sistema de veladuras (arcades, plataformas...)
- Algoritmos genéticos (ajedrez, go)
¿Qué sería lo siguiente a hacer?
- Contador de puntos
- Pantalla de inicio (press start to play)
- Que el enemigo se mueva
- Que el enemigo dispare
- Poner vidas a nuestra nave
- Que haya varios enemigos
- ¡Compartirlo!
¡Compártelo!
Para que la charla sirva de algo, merece la pena que cada uno continúe a su manera con el juego.
He abierto un repositorio para que podáis compartir vuestros juegos: github.com/SeRGiNaToR/charla-juegos-en-js.
Si lo preferís, mandadmelo por correo o twitter.
Después montaremos una web para mostrar los distintos juegos que hayamos hecho.
¡Y así vemos los resultados de la charla dentro de unos días!
Recursos
Y para finalizar
¡Esperamos que os haya gustado y servido!