Sprite([properties])
A versatile way to update and draw your sprites. It can handle simple rectangles, images, and sprite sheet animations. It can be used for your main player object as well as tiny particles in a particle engine.
Extends: GameObject
Sprite Parameters
-
properties
Optional Object. Properties of the sprite.
-
properties.color
Optional String. Fill color for the game object if no image or animation is provided.
-
properties.image
Optional HTMLImageElement or HTMLCanvasElement. Use an image to draw the sprite.
-
properties.animations
Optional Object. An object of Animations from a Spritesheet to animate the sprite.
Table of Contents
Rectangle Sprite
In its most basic form, a sprite is a rectangle with a fill color. To create a rectangle sprite, pass the arguments width
, height
, and color
. A rectangle sprite is great for initial prototyping and particles.
let { Sprite } = kontra
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for a rectangle sprite
width: 20,
height: 40,
color: 'red'
});
sprite.render();
import { Sprite } from 'path/to/kontra.mjs'
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for a rectangle sprite
width: 20,
height: 40,
color: 'red'
});
sprite.render();
import { Sprite } from 'kontra';
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for a rectangle sprite
width: 20,
height: 40,
color: 'red'
});
sprite.render();
Image Sprite
A sprite can use an image instead of drawing a rectangle. To create an image sprite, pass the image
argument. The size of the sprite will automatically be set as the width and height of the image.
let { Sprite } = kontra
let image = new Image();
image.src = 'assets/imgs/character.png';
image.onload = function() {
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for an image sprite
image: image
});
sprite.render();
};
import { Sprite } from 'path/to/kontra.mjs'
let image = new Image();
image.src = 'assets/imgs/character.png';
image.onload = function() {
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for an image sprite
image: image
});
sprite.render();
};
import { Sprite } from 'kontra';
let image = new Image();
image.src = 'assets/imgs/character.png';
image.onload = function() {
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for an image sprite
image: image
});
sprite.render();
};
Animation Sprite
A sprite can use a spritesheet animation as well. To create an animation sprite, pass the animations
argument. The size of the sprite will automatically be set as the width and height of a frame of the spritesheet.
A sprite can have multiple named animations. The easiest way to create animations is to use SpriteSheet. All animations will automatically be cloned so no two sprites update the same animation.
let { Sprite, SpriteSheet, GameLoop } = kontra
let image = new Image();
image.src = 'assets/imgs/character_walk_sheet.png';
image.onload = function() {
// use spriteSheet to create animations from an image
let spriteSheet = SpriteSheet({
image: image,
frameWidth: 72,
frameHeight: 97,
animations: {
// create a named animation: walk
walk: {
frames: '0..9', // frames 0 through 9
frameRate: 30
}
}
});
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for an animation sprite
animations: spriteSheet.animations
});
// use kontra.gameLoop to play the animation
let loop = GameLoop({
update: function(dt) {
sprite.update();
},
render: function() {
sprite.render();
}
});
loop.start();
};
import { Sprite, SpriteSheet, GameLoop } from 'path/to/kontra.mjs'
let image = new Image();
image.src = 'assets/imgs/character_walk_sheet.png';
image.onload = function() {
// use spriteSheet to create animations from an image
let spriteSheet = SpriteSheet({
image: image,
frameWidth: 72,
frameHeight: 97,
animations: {
// create a named animation: walk
walk: {
frames: '0..9', // frames 0 through 9
frameRate: 30
}
}
});
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for an animation sprite
animations: spriteSheet.animations
});
// use kontra.gameLoop to play the animation
let loop = GameLoop({
update: function(dt) {
sprite.update();
},
render: function() {
sprite.render();
}
});
loop.start();
};
import { Sprite, SpriteSheet, GameLoop } from 'kontra';
let image = new Image();
image.src = 'assets/imgs/character_walk_sheet.png';
image.onload = function() {
// use spriteSheet to create animations from an image
let spriteSheet = SpriteSheet({
image: image,
frameWidth: 72,
frameHeight: 97,
animations: {
// create a named animation: walk
walk: {
frames: '0..9', // frames 0 through 9
frameRate: 30
}
}
});
let sprite = Sprite({
x: 300,
y: 100,
anchor: {x: 0.5, y: 0.5},
// required for an animation sprite
animations: spriteSheet.animations
});
// use kontra.gameLoop to play the animation
let loop = GameLoop({
update: function(dt) {
sprite.update();
},
render: function() {
sprite.render();
}
});
loop.start();
};
Custom Properties
If you need to draw a different shape, such as a circle, you can pass in custom properties and a render function to handle drawing the sprite.
Do note that the canvas has been rotated and translated to the sprites position (taking into account anchor), so {0,0} will be the top-left corner of the sprite when drawing.
let { Sprite } = kontra
let sprite = Sprite({
x: 300,
y: 100,
color: 'red',
// custom properties
radius: 20,
render: function() {
this.context.fillStyle = this.color;
this.context.beginPath();
this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);
this.context.fill();
}
});
sprite.render();
import { Sprite } from 'path/to/kontra.mjs'
let sprite = Sprite({
x: 300,
y: 100,
color: 'red',
// custom properties
radius: 20,
render: function() {
this.context.fillStyle = this.color;
this.context.beginPath();
this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);
this.context.fill();
}
});
sprite.render();
import { Sprite } from 'kontra';
let sprite = Sprite({
x: 300,
y: 100,
color: 'red',
// custom properties
radius: 20,
render: function() {
this.context.fillStyle = this.color;
this.context.beginPath();
this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);
this.context.fill();
}
});
sprite.render();
Extending a Sprite
If you want to extend a Sprite, you can do so by extending the Sprite class. The one caveat is that Sprite
is not the Sprite class, but actually is a factory function. To extend the Sprite class, import SpriteClass
from kontra.
You should also override the draw()
function instead of the render()
function in your class. The draw()
function determines how to draw the Sprite. It is called by the render
function after transforms and rotations have been applied.
Do note that the canvas has been rotated and translated to the objects position (taking into account anchor), so {0,0} will be the top-left corner of the game object when drawing.
let { Sprite, SpriteClass } = kontra;
class CustomSprite extends SpriteClass {
constructor(properties) {
super(properties);
this.myProp = properties.myProp;
}
draw() {
if (this.myProp) {
super.draw();
}
}
}
import { Sprite, SpriteClass } from 'path/to/kontra.mjs';
class CustomSprite extends SpriteClass {
constructor(properties) {
super(properties);
this.myProp = properties.myProp;
}
draw() {
if (this.myProp) {
super.draw();
}
}
}
import { Sprite, SpriteClass } from 'kontra';
class CustomSprite extends SpriteClass {
constructor(properties) {
super(properties);
this.myProp = properties.myProp;
}
draw() {
if (this.myProp) {
super.draw();
}
}
}
Sprite.animations
Object. An object of Animations from a SpriteSheet to animate the sprite. Each animation is named so that it can can be used by name for the sprites playAnimation() function.
let { Sprite, SpriteSheet } = kontra;
let spriteSheet = SpriteSheet({
// ...
animations: {
idle: {
frames: 1,
loop: false,
},
walk: {
frames: [1,2,3]
}
}
});
let sprite = Sprite({
x: 100,
y: 200,
animations: spriteSheet.animations
});
sprite.playAnimation('idle');
import { Sprite, SpriteSheet } from 'path/to/kontra.mjs';
let spriteSheet = SpriteSheet({
// ...
animations: {
idle: {
frames: 1,
loop: false,
},
walk: {
frames: [1,2,3]
}
}
});
let sprite = Sprite({
x: 100,
y: 200,
animations: spriteSheet.animations
});
sprite.playAnimation('idle');
import { Sprite, SpriteSheet } from 'kontra';
let spriteSheet = SpriteSheet({
// ...
animations: {
idle: {
frames: 1,
loop: false,
},
walk: {
frames: [1,2,3]
}
}
});
let sprite = Sprite({
x: 100,
y: 200,
animations: spriteSheet.animations
});
sprite.playAnimation('idle');
Sprite.color
String. The color of the game object if it was passed as an argument.
Sprite.currentAnimation
Animation. The currently playing Animation object if animations
was passed as an argument.
Sprite.height
Number. The height of the sprite. If the sprite is a rectangle sprite, it uses the passed in value. For an image sprite it is the height of the image. And for an animation sprite it is the height of a single frame of the animation.
Sprite.image
HTMLImageElement or HTMLCanvasElement. The image the sprite will use when drawn if passed as an argument.
Sprite.playAnimation(name)
Set the currently playing animation of an animation sprite.
let { Sprite, SpriteSheet } = kontra;
let spriteSheet = SpriteSheet({
// ...
animations: {
idle: {
frames: 1
},
walk: {
frames: [1,2,3]
}
}
});
let sprite = Sprite({
x: 100,
y: 200,
animations: spriteSheet.animations
});
sprite.playAnimation('idle');
import { Sprite, SpriteSheet } from 'path/to/kontra.mjs';
let spriteSheet = SpriteSheet({
// ...
animations: {
idle: {
frames: 1
},
walk: {
frames: [1,2,3]
}
}
});
let sprite = Sprite({
x: 100,
y: 200,
animations: spriteSheet.animations
});
sprite.playAnimation('idle');
import { Sprite, SpriteSheet } from 'kontra';
let spriteSheet = SpriteSheet({
// ...
animations: {
idle: {
frames: 1
},
walk: {
frames: [1,2,3]
}
}
});
let sprite = Sprite({
x: 100,
y: 200,
animations: spriteSheet.animations
});
sprite.playAnimation('idle');
playAnimation Parameters
-
name
String. Name of the animation to play.
Sprite.width
Number. The width of the sprite. If the sprite is a rectangle sprite, it uses the passed in value. For an image sprite it is the width of the image. And for an animation sprite it is the width of a single frame of the animation.