htmlanimationcanvashtml5-animation

Frame by frame animation in HTML5 with canvas


I have a flash animation I am trying to convert to HTML5. Now I have taken out all the images. For example in the hand animation, I have taken images of all hand images. I have made the canvas with the base drawing but I don't know how to replace those images frame by frame.

function draw(){
    var canvas = document.getElementById('canvas');
    if(canvas.getContext){
        // canvas animation code here:
        var ctx = canvas.getContext('2d');

        var lhs = new Image();

        lhs.src = "images/left_hnd_1.png";

        lhs.onload = function(){
            ctx.drawImage(lhs, 293, 137);
        }

    } else {
        // canvas unsupported code here:
        document.getElementById('girl').style.display = "block";
    }
}

Now I have three more frame for this image. left_hnd_2.png, left_hnd_3.png & left_hnd_4.png. I would've used one image but the difference in frames is way too much for it to be done with one image. How can I animate this with the time differences I want.

Any ideas would be greatly appreciated. Thanks!


Solution

  • Try this:

    var imgNumber = 1;
    var lastImgNumber = 4;
    
    var ctx = canvas.getContext('2d');
    var img = new Image;
    img.onload = function(){
      ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height );
      ctx.drawImage( img, 0, 0 );
    };
    var timer = setInterval( function(){
      if (imgNumber>lastImgNumber){
        clearInterval( timer );
      }else{
        img.src = "images/left_hnd_"+( imgNumber++ )+".png";
      }
    }, 1000/15 ); //Draw at 15 frames per second
    

    An alternative, if you only have 4 images, would be to create a single huge image with all four in a 'texture atlas', and then use setTimeout or setInterval to call drawImage() with different parameters to draw different subsets of the image to the canvas.