'use strict'; import Direction from '../model/Direction'; import Entity from '../model/Entity'; import EntityPosition from '../model/EntityPosition'; import MapData from '../model/MapData'; import Position from '../model/Position'; import Transition from '../model/Transition'; import InputHandler from '../view/InputHandler'; import MapView from '../view/MapView'; export default class MapContext { view: MapView; entities: {[key: string]: EntityPosition} = {}; playerEntity: EntityPosition; constructor(private map: MapData, private inputHandler: InputHandler) { this.playerEntity = new EntityPosition( new Entity('square'), new Position(8, 8), Direction.East ); this.addEntity(this.playerEntity); this.view = new MapView(map, this.entities, (time: number) => this.updateState(time)); inputHandler.addListener(() => { if (this.updateState(performance.now())) this.view.redraw(); }); } private addEntity(entity: EntityPosition) { this.entities[entity.position.asString()] = entity; } private addTransition(entity: EntityPosition, dest: Position, start: number, dur: number) { entity.transition = new Transition(start, start+dur, entity.position, dest); } private finishTransition(entity: EntityPosition) { entity.position = entity.transition.dest; entity.transition = null; } private updateState(time: number): boolean { var ret = false; while (true) { var origTime = time; if (this.playerEntity.transition && this.playerEntity.transition.end <= time) { origTime = this.playerEntity.transition.end; this.finishTransition(this.playerEntity); ret = true; } if (this.playerEntity.transition) return true; var dir: Direction = null; if (this.inputHandler.keys[InputHandler.Up]) dir = Direction.North; else if (this.inputHandler.keys[InputHandler.Right]) dir = Direction.East; else if (this.inputHandler.keys[InputHandler.Down]) dir = Direction.South; else if (this.inputHandler.keys[InputHandler.Left]) dir = Direction.West; if (dir === null) return ret; this.playerEntity.direction = dir; this.addTransition(this.playerEntity, this.playerEntity.position.translate(dir, 1), origTime, 250); } } }