Desenvolvimento - Javascript
HTML5 Canvas: Movendo objetos
Veja neste artigo como desenhar um objeto na tag canvas da HTML5 e movê-lo utilizando as setas do teclado.
por Joel RodriguesIntrodução ao HTML5 Canvas
Os recursos gráficos que a tag canvas garante aos desenvolvedores web já são bastante comentados desde o lançamento da HTML5. Tais recursos, juntamente com outros avanços das tecnologias web básicas permitiram, por exemplo, o desenvolvimento de jogos completos utilizando apenas as web standards (HTML, CSS e Javascript).
Alguns desses jogos utilizam técnicas avançadas de renderização de imagens e desenho de elementos na tela, mas em geral a técnica utilizada (pelo menos para jogos 2D) é a seguinte: os elementos são desenhados repetidas vezes sobre uma área que é constantemente “limpa” e redesenhada.
Supondo o desenho e movimentação de um círculo na tela, o processo seria o seguinte:
- Limpar a tela;
- Desenhar o círculo em uma posição;
- Limpar a tela;
- Desenhar o círculo em outra posição;
- Limpar a tela;
- Desenhar o círculo em outra posição;
Dessa forma, se o processo a cima for executado em intervalos de tempos muito pequenos, haverá a impressão de continuidade, ou seja, o usuário não perceberá que a tela está sendo totalmente redesenhada a cada instante de tempo.
Neste artigo utilizaremos essa técnica para ilustrar a situação exposta acima, movimentando um círculo dentro de uma área retangular.
O código HTML do canvas
O código HTML que utilizaremos é bastante simples e pode ser visualizado na Listagem 1. O leitor pode copiar esse código e salvar como um arquivo de extensão “.html”.
Listagem 1: Código HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Canvas</title>
</head>
<body>
<div>
<canvas id="canvas" width="500" height="200">
Se você visualizar esse texto, seu browser não suporta a tag canvas.
</canvas>
</div>
<script type="text/javascript" src="desenhar_circulo.js"></script>
</body>
</html>Como vemos, existe uma referência para um arquivo chamado “desenhar_circulo.js”. Nele está contido o código que de fato é responsável pelo desenho e movimentação da forma geométrica na canvas.
Esse arquivo, como veremos a seguir, é composto por várias funções que trabalharão em conjunto para se obter o resultado desejado.
O código Javascript
Inicialmente é necessário declarar algumas variáveis globais que serão utilizadas nas funções.
Listagem 2: Declaração de variáveis
var canvas;//o elemento canvas sobre o qual desenharemos var ctx;//o "contexto" da canvas que será utilizado (2D ou 3D) var dx = 5;//a tava de variação (velocidade) horizontal do objeto var dy = 5;//a tava de variação (velocidade) vertical do objeto var x = 250;//posição horizontal do objeto (com valor inicial) var y = 100;//posição vertical do objeto (com valor inicial) var WIDTH = 500;//largura da área retangular var HEIGHT = 200;//altura da área retangular
As variáveis estão comentadas no código, dispensando maiores explicações.
A seguir, temos a função Desenhar, responsável literalmente por desenhar o objeto na tela com base nas coordenadas x e y. Nesse caso é desenhado um círculo usando a função arc, mas outras formas poderiam ser usadas.
Listagem 3: Função Desenhar
function Desenhar() {
ctx.beginPath();
ctx.arc(x, y, 10, 0, Math.PI*2, true);
ctx.fill();
}A próxima função chama-se LimparTela e é responsável por desenhar um retângulo uniforme sobre toda área “desenhável”. Ela deve ser chamada antes da função Desenhar, para limpar a área retangular antes que o círculo seja redesenhado.
Listagem 4: Função LimparTela
function LimparTela() {
ctx.fillStyle = "white";
ctx.strokeStyle = "black";
ctx.beginPath();
ctx.rect(0, 0, WIDTH, HEIGHT);
ctx.closePath();
ctx.fill();
ctx.stroke();
}As propriedades fillStyle e strokeStyle representam as cores do plano de fundo e da borda, respectivamente, do retângulo a ser desenhado. Finalizando, as funções fill e stroke desenham a forma geométrica e sua borda.
Observamos na função Desenhar que são utilizadas as variáveis x e y previamente declaradas e inicializadas. Mas como desejamos que o objeto possa ser movido conforme o pressionamento das setas do teclado, é preciso adicionar um tratamento para o evento keyDown do documento. Para isso, criaremos uma função chamada KeyDown que verificará a tecla pressionada e alterará as variáveis x e y, somando ou subtraindo os valores das variações dx e dy, respectivamente.
Listagem 4: Função KeyDown
function KeyDown(evt){
switch (evt.keyCode) {
case 38: /*seta para cima */
if (y - dy > 0){
y -= dy;
}
break;
case 40: /*set para baixo*/
if (y + dy < HEIGHT){
y += dy;
}
break;
case 37: /*set para esquerda*/
if (x - dx > 0){
x -= dx;
}
break;
case 39: /*seta para direita*/
if (x + dx < WIDTH){
x += dx;
}
break;
}
}De fato a função foi definida mas ainda não está diretamente relacionada ao evento keyDown do documento. Isso será feito mais adiante, após a definição de todas as funções a serem utilizadas.
A próxima função apresentada se chama Atualizar e é responsável por chamar as funções LimparTela e Desenhar, nessa ordem.
Listagem 5: Função Atualizar
function Atualizar() {
LimparTela();
Desenhar();
}A seguir temos a função responsável por inicializar os objetos canvas, ctx e por definir a chamada à função Atualizar periodicamente. Para isso é utilizada a função setInterval que recebe dois parâmetros: a função a ser executada e o intervalo em milissegundos.
Listagem 6: Função Iniciar
function Iniciar() {
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
return setInterval(Atualizar, 10);
}Agora que todas as funções estão definidas, é preciso chama-las para dar início ao processo. Isso é feito no final do código, fora de qualquer função, com as seguintes instruções.
Listagem 7: Iniciando o processo de desenho
window.addEventListener('keydown',KeyDown,true);
Iniciar();Testando o código do Canvas
Estando prontos os arquivos HTML e Javascript, podemos salvá-los e abrir o HTML no browser. Com isso, o resultado será semelhante ao mostrado na figura a seguir.

Figura 1: Testando o código
Pressionando as setas do teclado, é possível movimentar a “bolinha” dentro da área retangular definida. Esses limites são estabelecidos na função KeyDown.
Com isso finalizamos esse artigo. Espero que tenham gostado e até a próxima.
Clique aqui para obter o código fonte desenvolvido.
- Como bloquear o botão CTRL e impedir impressão de página com JavascriptJavascript
- Principais Frameworks de JavascriptJavascript
- Conhecendo o HTML5 Notifications APIJavascript
- Como inverter links ou textos com JavascriptJavascript
- Criando um jogo da velha em DHTML (HTML+Javascript) com jvGameJavascript


