A lightweight JavaScript game engine
git clone git://soophie.de/game-engine
2
import { scaleCanvas } from '../util/canvas.js';4
export default class Spritesheet extends Sprite {5
constructor(path, size) {5
constructor(path, width, height) {6
super(path);7
this.size = size;7
this.width = width;8
this.height = height || width;9
this.sprites = [];10
}11
async load() {12
await super.load();13
const {width, height} = this.image;13
if(width % this.size !== 0 || height % this.size !== 0) {14
throw new Error(`Invalid size ${this.size} for spritesheet '${this.path}'!`);14
if(width % this.width !== 0 || height % this.height !== 0) {15
throw new Error(`Invalid dimension ${this.width}x${this.height} for spritesheet '${this.path}'!`);16
}16
this.sprites = new Array(parseInt(width / this.size) * parseInt(height / this.size));17
this.sprites = new Array(parseInt(width / this.width) * parseInt(height / this.height));18
const canvas = document.createElement('canvas');18
scaleCanvas(canvas, this.size, this.size);19
scaleCanvas(canvas, this.width, this.height);20
const g = canvas.getContext('2d');21
g.imageSmoothingEnabled = false;22
for(let i = 0; i < this.sprites.length; i++) {22
const y = parseInt(i / (width / this.size));23
const x = parseInt(i % (width / this.size));24
g.clearRect(0, 0, this.size, this.size);25
g.drawImage(this.image, -x * this.size, -y * this.size, width, height);23
const y = parseInt(i / (width / this.width));24
const x = parseInt(i % (width / this.width));25
g.clearRect(0, 0, this.width, this.height);26
g.drawImage(this.image, -x * this.width, -y * this.height, width, height);27
const sprite = new Sprite(canvas.toDataURL('image/png'));28
await sprite.load();29
this.sprites[i] = sprite;