From b83b596b0f79fa1d5b95c462d3fa7171ff221a19 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Nov 2018 00:56:22 +0100 Subject: Add support for simple periodic sprite animations --- src/controller/entitycontext.ts | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src/controller/entitycontext.ts') diff --git a/src/controller/entitycontext.ts b/src/controller/entitycontext.ts index c1eb1fc..6932227 100644 --- a/src/controller/entitycontext.ts +++ b/src/controller/entitycontext.ts @@ -1,4 +1,4 @@ -import { EntityData } from '../model/data/entity'; +import { EntityAnimation, EntityData } from '../model/data/entity'; import { loadEntity } from '../view/entity'; import { Renderer } from '../view/renderer/renderer'; @@ -20,21 +20,30 @@ export class EntityContext implements CollidableGroup { name, await loadEntity(renderer, entity), mkCollision(entity.collision), + entity.animation, ); } public readonly pos: vec2 = vec2.create(); + private readonly totalTime: number; + private constructor( private readonly renderer: Renderer, private readonly name: string, - private readonly view: SpriteView, + private readonly sprites: SpriteView[], private readonly collision: Collidable[], - ) {} + private readonly animation?: EntityAnimation, + ) { + if (animation) + this.totalTime = animation.sequence.reduce((a, s) => a + s[0], 0); + else + this.totalTime = 0; + } - public render() { + public render(time: number) { this.renderer.setTranslation(this.pos); - this.view.render(); + this.getSprite(time).render(); } public getTranslation(): vec2 { @@ -48,4 +57,18 @@ export class EntityContext implements CollidableGroup { public interact() { alert(`You've interacted with ${this.name}!`); } + + private getSprite(time: number): SpriteView { + time %= this.totalTime; + + if (this.animation) { + for (const [len, sprite] of this.animation.sequence) { + time -= len; + if (time < 0) + return this.sprites[sprite]; + } + } + + return this.sprites[0]; + } } -- cgit v1.2.3