I am making some code for school that is supposed to get a sprite sheet from an online source and run through them to make it look just run through the sprite animation. I'm not sure what I need to fix here because I pretty much just used the slip of paper that my teacher gave me to write all of the code.
let img = new Image();
img.src = 'https://opengameart.org/sites/default/files/Green-Cap-Character-16x18.png';
img.onload = function() {
init();
};
let canvas = document.getElementById('c');
let ctx = canvas.getContext('2d');
const scale = 2;
const width = 16;
const height = 18;
const scaledWidth = scale * width;
const scaledHeight = scale * height;
function drawFrame(frameX, frameY, canvasX, canvasY) {
ctx.drawImage(img, frameX * width, frameY * height, width, height, canvasX, canvasY, scaledWidth, scaledHeight);
}
const cycleLoop = [0, 1, 0, 2];
let currentLoopIndex = 0;
let frameCount = 0;
function step() {
frameCount++;
if (frameCount < 15) {
window.requestAnimationFrame(step);
return;
}
frameCount = 0;
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawFrame(cycleLoop[currentLoopIndex], 0, 0, 0);
currentLoopIndex++;
if (currentLoopIndex >= cycleLoop.length) {
currentLoopIndex = 0;
}
window.requestAnimationFrame(step);
}
function init() {
window.requestAnimationFrame(step);
}
canvas {
border: 1px solid black;
}
<canvas id="c" width="300" height="200"></canvas>
You can lookup the frame by index and then convert that index to a row and column index, as long as you know how many columns are in the sprite sheet.
In the example below, I render all 4 walking animations by specifying a sequence of indices for each animation. These indices are 0-11, working from top to bottom, left to right.