diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2018-11-11 00:56:22 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2018-11-11 01:46:08 +0100 |
commit | b83b596b0f79fa1d5b95c462d3fa7171ff221a19 (patch) | |
tree | 0601d178aff79a47cade680fc2a193cd67108aca /src/controller/entitycontext.ts | |
parent | 426b2c37ff72d8de40f716365c8301449acfdfcb (diff) | |
download | rpgedit-b83b596b0f79fa1d5b95c462d3fa7171ff221a19.tar rpgedit-b83b596b0f79fa1d5b95c462d3fa7171ff221a19.zip |
Add support for simple periodic sprite animations
Diffstat (limited to 'src/controller/entitycontext.ts')
-rw-r--r-- | src/controller/entitycontext.ts | 33 |
1 files changed, 28 insertions, 5 deletions
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]; + } } |