import RoomObject from "./roomObject.js" export default class Room { constructor(game, json, name) { this.game = game this.json = json this.name = name const objectJson = this.json.layers.find(layer => layer.type == "objectgroup")?.objects || [] this.objects = objectJson.map(RoomObject.fromJson.bind(null, this.game)) } get tilesetsToLoad() { const ts = {} this.json.tilesets.forEach((tileset, index) => { ts[`${this.name}-${index}`] = tileset.source }) return ts } populateTilesets(assets) { this.tilesets = this.json.tilesets.map((tileset, index) => { const ts = assets.get(`${this.name}-${index}`) ts.populateImage(assets) return ts }) } draw(ctx) { this.json.layers.forEach(this.drawLayer.bind(this, ctx)) } drawLayer(ctx, layer) { if (layer.type == "tilelayer") this.drawTileLayer(ctx, layer) } tilesUnderRectangle(layer, rect) { return [{ x: rect.x, y: rect.y }, { x: rect.x + rect.width, y: rect.y }, { x: rect.x, y: rect.y + rect.height }, { x: rect.x + rect.width, y: rect.y + rect.height } ].map(point => { const tileset = this.tilesets[0] const { x, y } = point const tileX = Math.floor(x / tileset.tileWidth) const tileY = Math.floor(y / tileset.tileHeight) const index = tileX + (tileY * layer.width) const tileIndex = layer.data[index] - 1 return tileset.tileAt(tileIndex) }) } drawTileLayer(ctx, layer) { for (let y = 0; y < layer.height; y++) { for (let x = 0; x < layer.width; x++) { const index = x + (y * layer.width) const tileIndex = layer.data[index] - 1 const tileset = this.tilesets[0] const [sx, sy] = tileset.tileOffset(tileIndex) ctx.drawImage( tileset.image, sx, sy, tileset.tileWidth, tileset.tileHeight, x * this.json.tilewidth, y * this.json.tileheight, this.json.tilewidth, this.json.tileheight ) if (tileset.collides(tileIndex)) { ctx.fillStyle = "#aa660088" ctx.fillRect( x * this.json.tilewidth, y * this.json.tileheight, this.json.tilewidth, this.json.tileheight ) } } } } }