'use strict' util = require '../util' tileSize = 32 body = document.getElementsByTagName('body')[0] loadImage = (url) -> new Promise (resolve, reject) -> img = new Image() img.addEventListener 'load', -> resolve img img.addEventListener 'error', -> reject Error('Failed to load ' + url) img.src = url loadImages = (imgs) -> util.mapPromises(_.mapValues imgs, loadImage) loadTiles = (tiles) -> loadImages(_.mapValues tiles, (t) -> "resources/sprite/tile/#{t.file}.png") loadEntities = (entities) -> p = {} for e in entities do (e) -> p[e.entity.name] = loadImage "resources/sprite/entity/#{e.entity.name}.png" util.mapPromises p class MapView constructor: (@map, @entities) -> @redrawPending = false @canvas = document.createElement 'canvas' @canvas.style.position = 'absolute' body.appendChild @canvas @ctx = @canvas.getContext '2d' window.addEventListener 'resize', @setSize @setSize() tilesReady = loadTiles(@map.tiles).then (tiles) => @tiles = tiles entitiesReady = loadEntities(_.values @entities).then (entities) => @entitySprites = entities tilesReady.then(entitiesReady).then => @redraw() return drawTile: (x, y, tile) => return unless tile @ctx.drawImage tile, x, y drawEntity: (e) => sprite = @entitySprites[e.entity.name] return unless sprite @ctx.drawImage( sprite, e.direction*tileSize, 0, tileSize, tileSize, e.position.x*tileSize, e.position.y*tileSize, tileSize, tileSize) draw: => @redrawPending = false @ctx.clearRect 0, 0, @canvas.width, @canvas.height return unless @tiles and @entitySprites for layer in @map.layers y = 0 for row in layer x = 0 for tile in row @drawTile x, y, @tiles[tile] x += tileSize y += tileSize for e in _.values @entities @drawEntity e redraw: => unless @redrawPending @redrawPending = true window.requestAnimationFrame @draw setSize: => e = document.documentElement @canvas.width = window.innerWidth || e.clientWidth || body.clientWidth @canvas.height = window.innerHeight || e.clientHeight || body.clientHeight @redraw() module.exports = MapView