Tarp

A small (751b) canvas wrapper to quickly make animations.

Github

Drawing

<canvas id="canvas1"></canvas>
<script>
    let canvas1 = tarp('#canvas1');
        canvas1.render = (canvas, context)=>{
            context.fillStyle = '#ff0000';
            context.beginPath();
            context.rect(20, 20, 150, 100);
            context.fill();
        }
</script>

Animations

<canvas id="canvas2"></canvas>
<script>
    let object = {
        color: '#ff0000',
        size: {x: 20, y: 20, w: 150, h: 100}
    };
    let moveRight = setInterval(()=>{
        object.size.x++;
        if(object.size.x > 100){
            clearInterval(moveRight)
        }
    }, 16);
    let canvas2 = tarp('#canvas2');
        canvas2.render = (canvas, context)=>{
            context.fillStyle = object.color;
            context.beginPath();
            context.rect(object.size.x, object.size.y, object.size.w, object.size.h);
            context.fill();
        }
</script>

Multiple Objects (try: w,a,s,d)

<canvas id="canvas3"></canvas>
<script>
    let objects = [
        {name: 'red box',    color: '#ff0000', size: {x: 20, y: 20, w: 40, h: 40}},
        {name: 'green box',  color: '#00ff00', size: {x: 100, y: 20, w: 40, h: 40}},
        {name: 'blue box',   color: '#0000ff', size: {x: 100, y: 100, w: 40, h: 40}},
        {name: 'purple box', color: '#ff00ff', size: {x: 20, y: 100, w: 40, h: 40}},
    ];
    let player = objects[0];
    document.body.addEventListener('keydown', (event)=>{
        switch(event.key){
            case 'w': case 'ArrowUp': player.size.y-= 5; break;
            case 'a': case 'ArrowLeft': player.size.x-= 5; break;
            case 's': case 'ArrowDown': player.size.y+= 5; break;
            case 'd': case 'ArrowRight': player.size.x+= 5; break;
        }
    });
    let canvas3 = tarp('#canvas3');
        canvas3.render = (canvas, context)=>{
            objects.forEach((object)=>{
                context.fillStyle = object.color;
                context.beginPath();
                context.rect(object.size.x, object.size.y, object.size.w, object.size.h);
                context.fill(); 
            });
        }
</script>

Sprites (try: w,a,s,d)

<canvas id="canvas4"></canvas>
<script>
	// sprite
	let sprite = {
		img: tarpSprite('./tarp-sprite.png'),
		sprites: {
			walkingDown: [
				{sx: 0, sy: 0, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:20, sy: 0, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:40, sy: 0, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
			],
			walkingLeft: [
				{sx: 0, sy:20, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:20, sy:20, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:40, sy:20, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
			],
			walkingRight: [
				{sx: 0, sy:40, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:20, sy:40, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:40, sy:40, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
			],
			walkingUp: [
				{sx: 0, sy:60, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:20, sy:60, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
				{sx:40, sy:60, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
			],
		},
		spriteIndex: 0,
		spriteSelected: 'walkingUp',
	};
	
	// key presses
	document.body.addEventListener('keydown', (event)=>{
		switch(event.key){
			case 'w': 
			case 'ArrowUp': sprite.spriteSelected = 'walkingUp'; break;
			case 'a':
			case 'ArrowLeft': sprite.spriteSelected = 'walkingLeft'; break;
			case 's': 
			case 'ArrowDown': sprite.spriteSelected = 'walkingDown'; break;
			case 'd':
			case 'ArrowRight': sprite.spriteSelected = 'walkingRight'; break;
		}
	});
	
	// loop through sprite tiles
	function changeAnimation(){
		setTimeout(()=>{
			sprite.spriteIndex++;
			if(sprite.spriteIndex >= sprite.sprites[sprite.spriteSelected].length){
				sprite.spriteIndex = 0
			}
			changeAnimation()
		}, 100)
	}
	changeAnimation();

	// render
	let canvas4 = tarp('#canvas4');
            canvas4.render = (canvas, context)=>{
			context.drawImage(
				sprite.img, 
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sx, 
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sy, 
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sw,
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sh,	
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dx,
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dy, 
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dw, 
				sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dh
			);
		};
</script>

Sprites (try: w,a,s,d)

<canvas id="canvas5"></canvas>
<script>
    let sprites = [
        {
            name: 'Blue Pumpkin',
            img: tarpSprite('./tarp-sprite-1.png'),
            sprites: {
                walkingDown: [
                    {sx: 0, sy: 0, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy: 0, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy: 0, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                ],
                walkingLeft: [
                    {sx: 0, sy:20, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy:20, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy:20, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                ],
                walkingRight: [
                    {sx: 0, sy:40, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy:40, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy:40, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                ],
                walkingUp: [
                    {sx: 0, sy:60, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy:60, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy:60, sw: 20, sh: 20, dx: 0, dy: 0, dw: 80, dh: 80,},
                ],
            },
            spriteIndex: 0,
            spriteSelected: 'walkingUp',
        },
        {
            name: 'Red Pumpkin',
            img: tarpSprite('./tarp-sprite-2.png'),
            sprites: {
                walkingDown: [
                    {sx: 0, sy: 0, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy: 0, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy: 0, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                ],
                walkingLeft: [
                    {sx: 0, sy:20, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy:20, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy:20, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                ],
                walkingRight: [
                    {sx: 0, sy:40, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy:40, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy:40, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                ],
                walkingUp: [
                    {sx: 0, sy:60, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:20, sy:60, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                    {sx:40, sy:60, sw: 20, sh: 20, dx:90, dy: 0, dw: 80, dh: 80,},
                ],
            },
            spriteIndex: 0,
            spriteSelected: 'walkingUp',
        },
    ];

    document.body.addEventListener('keydown', (event)=>{
        switch(event.key){
            case 'w': 
            case 'ArrowUp': 
                sprites[0].spriteSelected = 'walkingUp';
                sprites[1].spriteSelected = 'walkingUp';
                break;
            case 'a':
            case 'ArrowLeft':
                sprites[0].spriteSelected = 'walkingLeft';
                sprites[1].spriteSelected = 'walkingLeft';
                break;
            case 's': 
            case 'ArrowDown': 
                sprites[0].spriteSelected = 'walkingDown';
                sprites[1].spriteSelected = 'walkingDown';
                break;
            case 'd':
            case 'ArrowRight': 
                sprites[0].spriteSelected = 'walkingRight';
                sprites[1].spriteSelected = 'walkingRight';
                break;
        }
    });
    function changeAnimation(){
        setTimeout(()=>{
            sprites.forEach((sprite)=>{
                sprite.spriteIndex++;
                if(sprite.spriteIndex >= sprite.sprites[sprite.spriteSelected].length){
                    sprite.spriteIndex = 0
                }
            });
            changeAnimation()
        }, 100)
    }

    // render
    let canvas5 = tarp('#canvas5');
        canvas5.render = (canvas, context)=>{
            sprites.forEach((sprite)=>{
                context.drawImage(
                    sprite.img, 
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sx, 
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sy, 
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sw,
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].sh,	
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dx,
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dy, 
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dw, 
                    sprite.sprites[sprite.spriteSelected][sprite.spriteIndex].dh
                );
            })
        };
</script>