HTML and CSS Reference
In-Depth Information
Here is pseudocode for the sourceX calculation:
sourceX = integer(current_frame_index modulo
the_number_columns_in_the_tilesheet) * tile_width
The modulo (%) operator gives us the remainder of the division calculation. The actual
code we will use for this calculation looks like this:
var sourceX = Math.floor(animationFrames[frameIndex] % 8) *32;
The calculation for the sourceY value is similar, except we divide rather than use the
modulo operation:
sourceY = integer(current_frame_index divided by
the_number_columns_in_the_tilesheet) *tile_height
Here is the actual code we will use for this calculation:
var sourceY = Math.floor(animationFrames[frameIndex] / 8) *32;
Looping Through the Tiles
We will update the frameIndex value on each frame tick. When frameIndex becomes
greater than 7 , we will set it back to 0 :
if (frameIndex == animationFrames.length) {
frameIndex = 0;
The animationFrames.length value is 8 . When the frameIndex is equal to 8 , we must set
it back to 0 to start reading the array values over again, which creates an infinite ani-
mation loop.
Drawing the Tile
We will use drawImage() to place the new tile on the screen on each iteration:
context.drawImage(tileSheet, sourceX, sourceY,32,32,50,50,32,32);
Here, we are passing the calculated sourceX and sourceY values into the drawImage()
function. We then pass in the width ( 32 ), the height ( 32 ), and the location ( 50,50 ) to
draw the image on the canvas. Example 4-5 shows the full code.
Example 4-5. Advanced sprite animation
var tileSheet = new Image();
tileSheet.addEventListener('load', eventShipLoaded , false);
tileSheet.src = "tanks_sheet.png";
var animationFrames = [1,2,3,4,5,6,7,8];
var frameIndex = 0;
Search WWH ::

Custom Search