quinta-feira, 15 de março de 2012

Dicas de Programação: Como fazer uma animação com Javascript?

Pois é, vou fazer um animação com Javascript, mas no HTML 4 e CSS 2... (ainda preciso me atualizar...)

Vamos aos passos:

Primeiramente, vamos obter uma imagem com sprites que serão trocadas para obter o efeito de "movimento" do objeto:

©D-Grafix 2006

Depois, vamos criar o html da seguinte maneira:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Walker</title>
</head>
<body>
<div id="walker"></div>
</body>
</html>


Agora, vamos criar o estilo para exibir a imagem acima (que possui o tamanho original de 750 pixels por 366 pixels) no div com id igual ao "walker" e definir o tamanho deste div para 150 pixels por 183 pixels (que é o tamanho de um sprite):

...
<head>
<style>
div#walker {
    background-image: url("walk_side.jpg");
    background-repeat: no-repeat;
    background-position: 0px 0px;
    width: 150px;
    height: 183px;
    position: absolute;
    left: 0px;
    top: 0px;
}
</style>

...


Com isso, a primeira parte da figura deve ter aparecido...
Para executar o efeito, vamos criar uma função que muda a posição da imagem para exibir cada sprite:

...
<script>
//Posições iniciais
var x = 0;
var y = 0;

//Função que troca a posição da figura e mostra um determinado sprite
function trocaSprite() {
   //Obtenho o valor atual da posição da imagem de fundo
   var position = document.getElementById('walker').style.backgroundPosition;
   //Se ela existir...
   if (position) {
       //Obtenho os novos valores x e y através de uma string (os valores estão separados por espaço)
       var pos = position.split(' ');
       //Garanto que existem dois valores (x e y)
       if (pos.length == 2) {
          //Calculo nova posição x (-150 pixels, que é a largura de cada sprite na imagem)
          x = parseInt(pos[0]) - 150;
          //Se ela for menor ou igual que -750 pixels é que a imagem acabou (tamanho máximo)
          if (x <= -750) {
               //Então reinicio a posição x
               x = 0;
              //Se a posição y for 0 pixel, troco o valor para -183 pixels (que é a parte debaixo da imagem), se for -183 pixels, volto a posição y para 0 pixel
               y = (y == 0 ? -183 : 0);
           }
       }
   }
   //Altero o valor da posição da imagem de fundo
  document.getElementById('walker').style.backgroundPosition = x + 'px ' + y + 'px';
}
</script>
...

Fora desta função, colocamos ela para ser executada a cada 100 milisegundos através da função setInterval:

...
<script>
setInterval(trocaSprite, 100);
</script>
...

Legal! Agora, se quiser que ele "ande" para frente, é só mudar a posição do div com a propriedade left  e colocar esta instrução abaixo do backgroundPosition:

...
   //Altero o valor da posição da imagem de fundo
  document.getElementById('walker').style.backgroundPosition = x + 'px ' + y + 'px';
 //Mudo a posição do div "walker" de 10 em 10 pixels
  document.getElementById('walker').style.left =
   (parseInt(document.getElementById('walker').offsetLeft) + 10) + 'px';
...

Ufa, deu trabalho mas foi... :)

Até mais!

Nenhum comentário: