top-down-action-adventure/src/assets.js

66 lines
1.6 KiB
JavaScript

import Room from "./room.js"
import Tileset from "./tileset.js"
const IMAGE_ASSETS = {
}
const TILESET_ASSETS = {
}
const ROOM_ASSETS = {
sampleRoom: "./rooms/sample.tmj"
}
export default class Assets {
constructor(game) {
this.game = game
this.assetMap = {}
}
get(assetName) {
return this.assetMap[assetName]
}
async load() {
await Promise.all([
this.loadImages(IMAGE_ASSETS),
this.loadTilesets(TILESET_ASSETS),
this.loadRooms(ROOM_ASSETS)
])
Object.keys(ROOM_ASSETS).forEach(roomName => this.get(roomName).populateTilesets(this))
}
loadImages(images) {
return Promise.all(Object.entries(images).map(entry => this.loadImage(...entry)))
}
loadTilesets(tilesets) {
return Promise.all(Object.entries(tilesets).map(entry => this.loadTileset(...entry)))
}
loadRooms(rooms) {
return Promise.all(Object.entries(rooms).map(entry => this.loadRoom(...entry)))
}
loadImage(name, path) {
return new Promise(resolve => {
const img = new Image()
this.assetMap[name] = img
img.src = path
img.addEventListener("load", () => resolve(img))
})
}
loadTileset(name, path) {
return fetch(path).then(rsp => rsp.json()).then(json => {
return this.assetMap[name] = new Tileset(this.game, json, name)
}).then(tileset => this.loadImages(tileset.imagesToLoad))
}
loadRoom(name, path) {
return fetch(path).then(rsp => rsp.json()).then(json => {
return this.assetMap[name] = new Room(this.game, json, name)
}).then(room => this.loadTilesets(room.tilesetsToLoad))
}
}