Skip to main content

HTML5 JavaScript canvas animation class method called within function



I am having trouble drawing an animation on a HTML 5 canvas inside a loop. I have created a javascript animation function/class that stores frames and duration information and provides a get function to getFrame()[returns image] sub-function to retrieve the relevant frame. This works perfectly fine so i haven't included the full script. If anyone wants or needs it i will send to you.





When i call the following code it displays the animation as intended.







canvas.drawImage(tile1a.getFrame(),50,60);

canvas.drawImage(tile1a.getFrame(),50,90);

canvas.drawImage(tile1a.getFrame(),50,120);

//etc







This isn't very efficient as i want to draw a lot of tiles is column so it would be better to use a for loop. Therefore i tried the following code but the page just keeps crashing.







for (i=1;i<=10;i++)

{

canvas.drawImage(tile1a.getFrame(),FIELD_WIDTH,i*30);

}







However, i then tried the following which worked:







var temp = tile1a.getFrame();

for (i=1;i<=10;i++)

{

canvas.drawImage(temp,FIELD_WIDTH,i*30);

}







So the problem is definitely something to with me calling getFrame() within the for loop. I recon it is probably something really stupid but i can't figure it out!





Any help is much appreciated. thanks Jason


Comments

  1. I think I figured it out. The loop in your draw function is set up like this:

    for (i=1; i<=10; i++) {
    // ...
    }


    Notice that you didn't create the i variable with the var keyword! That means that it will be a global variable!

    Now look at the loop in your getFrame function:

    for (i=0; i<this.frames.length; i++) {
    // ...
    }


    The i in that loop is also global...

    Your getFrame function is making sure that i will always be reset to 4 (because you only have four frames in it)!

    The quick fix is to add some vars:

    // in the `draw` function, for example
    for (var i = 1; i <= 10; i++) {
    // ...
    }

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.