Hola, este es el segundo post de la serie, puedes ver todos los post anteriores aquí.
En esta oportunidad estaremos dandole vida a Mario utilizando el elemento Canvas y el API de Javascript. Puedes ver el resultado final de lo que aprenderemos en este post aquí, pero primero vamos a aclarar algunos conceptos para entender mejor el asunto.
El elemento Canvas (nuevo en HTML5) es un contenedor de graficos, el cual expone una serie de metodos que podemos usar mediante scripting para manipular cada pixel (para nuestro caso utilizaremos javascript).
Aunque el estandar HTML5 aun no es oficial, la mayoria de los navegadores ya ofrecen soporte a gran parte de los nuevos elementos de HTML5 como el Canvas.
Para darle vida a Mario sobre nuestro Canvas utilizaremos su contexto, para ello utilizaremos el metodo getContext("2d"). Pensaremos en este contexto como un plano cartesiano(2D) donde las coordenadas (x=0, y=0) se encuentran en la esquina superior izquierda del elemento canvas. Anteriormente creamos un Canvas de 500x300, las coordenadas dentro de su contexto serían algo asi:

Aclarados estos conceptos, vamos a ensuciarnos las manos con un poco de codigo!
Utilizaremos la misma pagina html5 que construimos en el post anterior y agregaremos la referencia a la libreria jQuery, adicionaremos el atributo ID a nuestro canvas y obtendremos el contexto de nuestro Canvas al cargar la pagina web utilizando la función $(document).ready(function(){ ... }
No es estrictamente necesario utiliar jQuery, en lugar de la función $(document).ready(function(){ ... } de jQuery podriamos utilizar el evento onload de nuestro documento, sin embargo utilizaremos jQuery para simplificar algunos elementos que introduciremos mas adelante.
Hasta ahora, el codigo de nuestro documento luciría algo como:
Obtener contexto
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8" />
- <title>Aprendiendo HTML5 con Mario Bros!</title>
- <script src="scripts/jquery-1.7.1.min.js"></script>
- <script>
- var contexto;
-
- $(document).ready(function () {
- var marioCanvas = document.getElementById("marioCanvas");
- contexto = marioCanvas.getContext("2d");
- });
- </script>
- </head>
- <body>
- <canvas id="marioCanvas" width="500" height="300" style="border: 1px dotted #000;">
- Este texto se mostrara unicamente si tu navegador
- no soporta el elemento canvas de html5
- </canvas>
- </body>
- </html>
Puedes ver este codigo en vivo aquí
Muy bien, hasta ahora solo hemos creado el documento html5, el canvas y hemos obtenido su contexto. Ahora vamos a dibujar a Mario sobre nuestro canvas. Para ello crearemos una función llamada dibujarMario() que utilizará el metodo drawImage(imagen, x, y)el cual recibe como argumentos una imagen, y las coordenadas (x,y) donde será ubicada. Llameremos la funcion dibujarMario() desde nuestro $(document).ready() para que se ejecuté al cargar la pagina, el codigo de nuestro script lucirá asi:
Dibujar a mario en el vanvas
- <script>
- var contexto;
- var imagenMario = new Image();
- imagenMario.src = "imagenes/mariod1.png";
-
- $(document).ready(function(){
- var marioCanvas = document.getElementById("marioCanvas");
- contexto = marioCanvas.getContext("2d");
-
- dibujarMario();
- });
-
- function dibujarMario() {
- contexto.drawImage(imagenMario, 20, 230);
- }
- </script>
Puedes ver este codigo en vivo aquí
Muy bien, ahora que tenemos a Mario en el canvas vamos a enseñarle a dar sus primeros pasos! Para ello vamos a crear una variable llamada xMario que representará su coordenada "x" dentro del plano y aumentaremos dicha posición cada 100 milisegundos utilizando la funcion setInterval(script, miliSegundos)para crear la ilusión de movimiento horizonal. Nuestro script luciría asi:
Desplazamiento horizontal
- <script>
- var contexto, xMario = 20;
- var imagenMario = new Image();
- imagenMario.src = "imagenes/mariod1.png";
-
- $(document).ready(function(){
- var marioCanvas = document.getElementById("marioCanvas");
- contexto = marioCanvas.getContext("2d");
-
- setInterval(dibujarMario, 100);
- });
-
- function dibujarMario() {
- contexto.drawImage(imagenMario, xMario, 230);
- xMario += 10;
- }
- </script>
Puedes ver este codigo en vivo aquí
Aja!Como habrás podido notar, Mario se desplaza horizontalmente pero lo persigue su karma XD
Esto ocurre porque a diferencia de Flash o Silverlight, en HTML el Canvas funciona como una "pintura", de manera que en lugar de mover los objetos debemos limpiar nuestra "pintura" y volver a pintar los objetos en su nueva posición.
Para limpiar nuestra "pintura" utilizaremos el metodo clearRect(xi, yi, xf, yf)el cual recibe como argumento las cordenadas x,y iniciales y finales del segmento que será borrado. Nuestro codigo script se vería así:
Limpiando y repintando
- <script>
- var contexto, xMario = 20;
- var imagenMario = new Image();
- imagenMario.src = "imagenes/mariod1.png";
-
- $(document).ready(function(){
- var marioCanvas = document.getElementById("marioCanvas");
- contexto = marioCanvas.getContext("2d");
-
- setInterval(dibujarMario, 100);
- });
-
- function dibujarMario() {
- contexto.clearRect(0, 0, 500, 300);
-
- contexto.drawImage(imagenMario, xMario, 230);
- xMario += 10;
- }
- </script>
Puedes ver este codigo en vivo aquí
Puedes encontrar el codigo completo de lo que desarrollamos en este post haciendo click aquí. Adicionalmente encontrarás allí la función dibujarMontanias() la cual utiliza el metodo contexto.lineTo(x, y) para marcar puntos en el plano, y el metodo contexto.stroke() para unir todos estos puntos con lineas y asi dar la aparencia de montañas en el fondo de nuestro plano.
En nuestro proximo post crearemos una sensación de movimiento mucho mas realista y adicionaremos soporte para poder controlar a Mario en varias direcciones utilizando las flechas de nuestro teclado.Si quieres aprender más sobre los temas tratados en este post, puedes consultar las siguientes referencias:
Gracias por pasar por aquí, y recuerda no quedarte con esto para ti solamente, puedes compartirlo y/o dejar un comentario XD
Nos leemos! @orendon