Uma bola que sai do canto superior esquerdo com um determinado ângulo e velocidade e, ao batar numa tabela, reflete o movimento com o mesmo ângulo, no sentido oposto.
É um exemplo simples de uma animação criada com a função setInterval. Mais à frente usaremos outra forma de criar animações.
A direção inicial é dada pelos valores de incx e incy. O ecrã é atualizado a cada 40ms. Em cada atualização do ecrã, a posição da bola é atualizada com os incrementos incx e incy. Estes incrementos são atualizados sempre que a bola bate nas extremidades do canvas.
Note-se que o canvas tem que ser totalmente rescrito em cada frame.
Visualização:
<!DOCTYPE html> <html> <head> <title>Gráfico</title> <meta charset="iso-8859-1"> <script type="text/javascript"> var incx = 3 + 6 * Math.random(); // direção- coordenada x var incy = 3 + 6 * Math.random(); // direção- coordenada y // Garante velocidade mínima var vMin = 8; var vel = Math.sqrt(incx*incx+incy*incy); if(vel<vMin) { incx *= vMin/vel; incy *= vMin/vel; } // Nota: Para garantir velocidade mínima exata de vMin, era necessário corrigir as fórmulas anteriores com base na direção da velocidade. // É preferível não tornar isto muito mais complexo, para não dificultar a compreensão. incx = Math.floor(incx); incy = Math.floor(incy); var raio=5; // raio do ponto cintilante var x=raio, y=raio; // coordenadas do ponto cintilante var ctx; var larg, alt; function init() { var c = document.getElementById("cvs"); ctx = c.getContext("2d"); larg = c.getAttribute("width"); alt = c.getAttribute("height"); var periodoRelogio = 40; setInterval("anima()", periodoRelogio); } function anima() { // Desenhar ctx.fillStyle = "black"; ctx.beginPath(); ctx.rect(0,0,larg,alt); ctx.fill(); x += incx; y += incy; //window.alert(x+','+y); ctx.fillStyle = "#FFFF20"; ctx.beginPath(); ctx.arc(x,y,raio,0,2*Math.PI); ctx.fill(); if(x+2*raio>larg) incx = -incx; if(x-raio<0) incx = -incx; if(y+2*raio>alt) incy = -incy; if(y-raio<0) incy = -incy; } </script> </head> <body onload="init();"> <canvas width="600" height="400" id="cvs"></canvas> </body> </html>