Olá pessoal, tudo certin?
Meu último post, sobre REST, ficou bastante “denso”. Por isso, resolvi pegar leve hoje. Hoje faremos alguma animação usando HTML5.
Dica: fica muito mais fácil acompanhar pegando o código-fonte;
A idéia é diversão …
![]()
O que já vimos?
Para você que está chegando agora, veja o que já foi abordado:
- HTML5 – Parte 9 – Começando a mexer com Canvas
- HTML5 – Parte 8 – Messaging
- HTML5 – Parte 7 – Suporte para offline
- HTML5 – Parte 6 – Armazenando dados com Web SQL Databases
- HTML5 – Parte 5 – Armazenando dados com Web Storage
- HTML5 – Parte 4 – Vídeo e Áudio
- HTML5 – Parte 3 – Formulários
- HTML5 – Parte 2 – Semântica para todos
- HTML5 – Parte 1 – história e elementos de estrutura
Pegando a idéia…
O conceito de animação disponível para Canvas, no HTML5, é muito simples (quase rudimentar). Se há uma área do canvas que se deseja “animar”, devemos fazer o desenho, limpar a área, desenhar novamente e assim vai..
Pintando uma imagem
Animação com HTML é na unha! Basicamente, sobreposição de imagens. Essas imagens podem ser construídas dinamicamente (com as técnicas que mostrei no post anterior) ou totalmente carregadas de uma fonte externa (o que vou fazer hoje).
Observe o código:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>animation 0</title> 5 <style> 6 body, canvas 7 { 8 margin: 0; 9 display: block; 10 } 11 </style> 12 </head> 13 <body> 14 <canvas /> 15 <script> 16 var x = 150, y = 150; 17 var context = document 18 .querySelector('canvas') 19 .getContext("2d"); 20 21 var WIDTH, HEIGHT; 22 var ballImg; 23 24 function drawBall(x, y) { 25 context.fillStyle = 'rgb(255,255,255)'; 26 context.fillRect(0, 0, 27 context.canvas.width, 28 context.canvas.height 29 ); 30 context.drawImage(ballImg, x, y 31 ); 32 } 33 34 function init() { 35 ballImg = document.createElement('img'); 36 ballImg.src = 'ball.png'; 37 ballImg.onload = function () { 38 WIDTH = context.canvas.width = 39 window.innerWidth; 40 HEIGHT = context.canvas.height = 41 window.innerHeight; 42 drawBall(x, y); 43 } 44 } 45 init(); 46 </script> 47 </body> 48 </html>
O que eu fiz?
- criei um objeto canvas;
- criei um método de inicialização que carrega dinâmicamente uma imagem;
- redimensiono o canvas para que tenha o tamanho da área útil no browser;
- com a imagem carregada, desenho-a no canvas.
O resultado, no meu computador ficou assim:
Bacana! Mas ainda sem animação….
Fazendo a bola girar
Para dar um pouco mais de graça… vamos fazer a bola girar. Observe:
1 var x = 150, y = 150; 2 var context = document 3 .querySelector('canvas') 4 .getContext("2d"); 5 6 var ballCanvasContext; 7 8 var WIDTH, HEIGHT; 9 var ballImg; 10 11 var halfBallSize = 90; 12 var running; 13 14 function drawBall(x, y) { 15 ballCanvasContext.rotate(Math.PI / 180 * 3); 16 ballCanvasContext.drawImage( 17 ballImg, 0, 0, 18 ballImg.width, 19 ballImg.height, 20 -halfBallSize, -halfBallSize, 21 halfBallSize * 2, halfBallSize * 2 22 ); 23 24 context.fillStyle = 'rgb(255,255,255)'; 25 context.fillRect(0, 0, 26 context.canvas.width, 27 context.canvas.height 28 ); 29 context.drawImage(ballCanvasContext.canvas, x, y 30 ); 31 } 32 33 function init() { 34 ballImg = document.createElement('img'); 35 ballImg.src = 'ball.png'; 36 ballImg.onload = function () { 37 var ballCanvas = document.createElement('canvas'); 38 ballCanvas.style.display = 'none'; 39 document.body.appendChild(ballCanvas); 40 ballCanvas.height = halfBallSize * 2; 41 ballCanvas.width = halfBallSize * 2; 42 ballCanvasContext = ballCanvas.getContext('2d'); 43 ballCanvasContext.translate(halfBallSize, halfBallSize); 44 WIDTH = context.canvas.width = window.innerWidth; 45 HEIGHT = context.canvas.height = window.innerHeight; 46 47 clearInterval(running); 48 running = setInterval(draw, 13); 49 } 50 } 51 52 function draw() { 53 drawBall(x, y); 54 } 55 56 init();
O que eu fiz? Bem, vamos por partes…
- criei um canvas onde eu processaria “a rotação” da bola. Observe que, para fins de simplicidade na rotação, desloco o ponto de trabalho para o centro do canvas (init);
- criei um “timer” para execução do meu procedimento de desenho (init);
- em cada desenho, rotaciono o “canvas” da bolinha em 3 graus (drawBall);
- utilizo o canvas da bolinha como source para o drawImage no meu canvas principal (drawBall).
Bacana!
Movendo a bolinha pela tela
Vamos fazer a bola rolar pela nossa tela! ![]()
1 var dx = 2; 2 var dy = 4; 3 var rotateDirection = 1; 4 function draw() { 5 drawBall(x, y); 6 7 if (x + dx > (WIDTH - (halfBallSize * 2)) || x + dx < 0) 8 dx = -dx; 9 if (y + dy > (HEIGHT - (halfBallSize * 2)) || y + dy < 0) 10 dy = -dy; 11 12 x += dx; 13 y += dy; 14 }
Retirei o código que apaga o desenho anterior. Logo, podemos ver, pelo rastro, o caminho que a bola:
Dando peso para a bola
Esse movimento seco da bolinha pela tela não ficou dos mais legais… Ela não está se deslocando no vácuo.. Vamos adicionar um efeito… Vamos aumentar gradativamente o peso da bola (dy)..
1 var dx = 2; 2 var dy = 4; 3 var rotateDirection = 1; 4 function draw() { 5 drawBall(x, y); 6 7 if (x + dx > (WIDTH - (halfBallSize * 2)) || x + dx < 0) 8 dx = -dx; 9 if (y + dy > (HEIGHT - (halfBallSize * 2)) || y + dy < 0) 10 dy = -dy; 11 12 dy += 0.3; 13 x += dx; 14 y += dy; 15 }
O “pulo do gato” está na linha 12
Um último ponto que me chateava bastante nesse exemplo era a rotação da bolinha. Ela fica girando sempre para o mesmo lado. O que fazer? Inverter o sentido da bola conforme a direção horizontal (em X). Observe:
1 function drawBall(x, y) { 2 rotateDirection = (dx > 0 ? 1 : -1) 3 ballCanvasContext.rotate(Math.PI / 180 * 3 * rotateDirection); 4 ... 5 }
Pronto e … bacana!
Por hoje, era isso!
![]()






sónia
03/10/2011
muito giro! parabéns
uma pergunta: imaginando que não usávamos a bola, como apagávamos o desenho anterior?
Marcelo
30/12/2011
Tenho a mesma duvida como retirar o rastro gerado pela bola ? abraco.
elemarjr
30/12/2011
Limpando a área. Mostro isso no post, mesmo.
BTW, há outros posts, mais recentes, mostrando animações com html5
Rodrigo Fernandes
10/01/2012
Caso ainda tenham a dúvida, é só adicionar: “context.clearRect(0, 0, WIDTH, HEIGHT);” logo no inicio da função “draw”.
adailton
12/03/2012
posso criar um mapa com tiles com um for(loop) e depois adicionar em um grid(tile) um avatar com os atributos drawimage? pode me dar um exemplo nesse codigo aqui.
http://glacialflame.com/tutorials/tiles/06/
esse ta em um loop e char é atribuido no mapa por meio de um if
if (j i == newplayerX && j == newplayerY){
ctx.drawImage(charImg[0],xpos,ypos-(charImg[0].height/2));
}
mais esta dentro de um loop quero adicionar mas fora do loop;
Fellipe
09/05/2012
Como faço para tirar esses números das linhas