summaryrefslogtreecommitdiff
path: root/client/lib/config/assets.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client/lib/config/assets.ts')
-rw-r--r--client/lib/config/assets.ts40
1 files changed, 40 insertions, 0 deletions
diff --git a/client/lib/config/assets.ts b/client/lib/config/assets.ts
new file mode 100644
index 0000000..51a5303
--- /dev/null
+++ b/client/lib/config/assets.ts
@@ -0,0 +1,40 @@
+import type { SpriteSpec } from "./sprites";
+import { SPRITE_SPECS } from "./sprites";
+
+export const IMAGES = new Map<string, HTMLImageElement>();
+
+export const loadSpritesIntoImageElements = (
+ spriteSpecs: Partial<SpriteSpec>[]
+): Promise<void>[] => {
+ const spritePromises: Promise<void>[] = [];
+
+ for (const spriteSpec of spriteSpecs) {
+ if (spriteSpec.sheet) {
+ const img = new Image();
+ img.src = spriteSpec.sheet;
+ IMAGES.set(spriteSpec.sheet, img);
+
+ spritePromises.push(
+ new Promise((resolve) => {
+ img.onload = () => resolve();
+ })
+ );
+ }
+
+ if (spriteSpec.states) {
+ spritePromises.push(
+ ...loadSpritesIntoImageElements(Object.values(spriteSpec.states))
+ );
+ }
+ }
+
+ return spritePromises;
+};
+
+export const loadAssets = () =>
+ Promise.all([
+ ...loadSpritesIntoImageElements(
+ Array.from(SPRITE_SPECS.keys()).map((key) => SPRITE_SPECS.get(key))
+ ),
+ // TODO: Sound
+ ]);