cubeforge 0.3.12 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +24 -16
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -345,6 +345,11 @@ var AssetManager = class {
|
|
|
345
345
|
_loaded = 0;
|
|
346
346
|
_total = 0;
|
|
347
347
|
_progressListeners = /* @__PURE__ */ new Set();
|
|
348
|
+
/** Base URL prefix applied to all asset paths starting with '/'. Set by Game component. */
|
|
349
|
+
baseURL = "";
|
|
350
|
+
resolve(src) {
|
|
351
|
+
return this.baseURL && src.startsWith("/") ? this.baseURL + src : src;
|
|
352
|
+
}
|
|
348
353
|
getAudioContext() {
|
|
349
354
|
if (!this.audioCtx) {
|
|
350
355
|
this.audioCtx = new AudioContext();
|
|
@@ -373,28 +378,29 @@ var AssetManager = class {
|
|
|
373
378
|
return () => this._progressListeners.delete(cb);
|
|
374
379
|
}
|
|
375
380
|
async loadImage(src) {
|
|
376
|
-
|
|
381
|
+
const resolved = this.resolve(src);
|
|
382
|
+
if (this.imagePromises.has(resolved)) return this.imagePromises.get(resolved);
|
|
377
383
|
this._total++;
|
|
378
384
|
this.emitProgress();
|
|
379
385
|
const promise = (async () => {
|
|
380
386
|
const img = new Image();
|
|
381
|
-
img.src =
|
|
387
|
+
img.src = resolved;
|
|
382
388
|
try {
|
|
383
389
|
await new Promise((resolve, reject) => {
|
|
384
390
|
img.onload = () => resolve();
|
|
385
391
|
img.onerror = () => reject(new Error(`Failed to load image: ${src}`));
|
|
386
392
|
});
|
|
387
393
|
} catch (err) {
|
|
388
|
-
console.warn(`[Cubeforge] Failed to load image: ${
|
|
394
|
+
console.warn(`[Cubeforge] Failed to load image: ${resolved}`);
|
|
389
395
|
throw err;
|
|
390
396
|
} finally {
|
|
391
397
|
this._loaded++;
|
|
392
398
|
this.emitProgress();
|
|
393
399
|
}
|
|
394
|
-
this.images.set(
|
|
400
|
+
this.images.set(resolved, img);
|
|
395
401
|
return img;
|
|
396
402
|
})();
|
|
397
|
-
this.imagePromises.set(
|
|
403
|
+
this.imagePromises.set(resolved, promise);
|
|
398
404
|
return promise;
|
|
399
405
|
}
|
|
400
406
|
/** Resolves once every image that has been requested via loadImage() is settled. */
|
|
@@ -402,23 +408,24 @@ var AssetManager = class {
|
|
|
402
408
|
await Promise.allSettled([...this.imagePromises.values()]);
|
|
403
409
|
}
|
|
404
410
|
getImage(src) {
|
|
405
|
-
return this.images.get(src);
|
|
411
|
+
return this.images.get(this.resolve(src));
|
|
406
412
|
}
|
|
407
413
|
/** Returns a read-only snapshot of all loaded images keyed by src. */
|
|
408
414
|
getLoadedImages() {
|
|
409
415
|
return this.images;
|
|
410
416
|
}
|
|
411
417
|
async loadAudio(src) {
|
|
412
|
-
|
|
418
|
+
const resolved = this.resolve(src);
|
|
419
|
+
if (this.audio.has(resolved)) return this.audio.get(resolved);
|
|
413
420
|
const ctx = this.getAudioContext();
|
|
414
421
|
try {
|
|
415
|
-
const response = await fetch(
|
|
422
|
+
const response = await fetch(resolved);
|
|
416
423
|
const arrayBuffer = await response.arrayBuffer();
|
|
417
424
|
const audioBuffer = await ctx.decodeAudioData(arrayBuffer);
|
|
418
|
-
this.audio.set(
|
|
425
|
+
this.audio.set(resolved, audioBuffer);
|
|
419
426
|
return audioBuffer;
|
|
420
427
|
} catch (err) {
|
|
421
|
-
console.warn(`[Cubeforge] Failed to load audio: ${
|
|
428
|
+
console.warn(`[Cubeforge] Failed to load audio: ${resolved}`);
|
|
422
429
|
throw err;
|
|
423
430
|
}
|
|
424
431
|
}
|
|
@@ -3886,6 +3893,8 @@ function Game({
|
|
|
3886
3893
|
const input = new InputManager();
|
|
3887
3894
|
const events = new EventBus();
|
|
3888
3895
|
const assets = new AssetManager();
|
|
3896
|
+
const viteEnv = import.meta.env;
|
|
3897
|
+
assets.baseURL = (viteEnv?.BASE_URL ?? "/").replace(/\/$/, "");
|
|
3889
3898
|
ecs.assets = assets;
|
|
3890
3899
|
const physics = new PhysicsSystem(gravity, events);
|
|
3891
3900
|
const entityIds = /* @__PURE__ */ new Map();
|
|
@@ -4213,13 +4222,12 @@ function Sprite({
|
|
|
4213
4222
|
});
|
|
4214
4223
|
engine.ecs.addComponent(entityId, comp);
|
|
4215
4224
|
if (src) {
|
|
4216
|
-
|
|
4217
|
-
const base = (viteEnv?.BASE_URL ?? "/").replace(/\/$/, "");
|
|
4218
|
-
const resolvedSrc = base && src.startsWith("/") ? base + src : src;
|
|
4219
|
-
comp.src = resolvedSrc;
|
|
4220
|
-
engine.assets.loadImage(resolvedSrc).then((img) => {
|
|
4225
|
+
engine.assets.loadImage(src).then((img) => {
|
|
4221
4226
|
const c = engine.ecs.getComponent(entityId, "Sprite");
|
|
4222
|
-
if (c)
|
|
4227
|
+
if (c) {
|
|
4228
|
+
c.image = img;
|
|
4229
|
+
c.src = img.src;
|
|
4230
|
+
}
|
|
4223
4231
|
}).catch(console.error);
|
|
4224
4232
|
}
|
|
4225
4233
|
return () => engine.ecs.removeComponent(entityId, "Sprite");
|