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.
Files changed (2) hide show
  1. package/dist/index.js +24 -16
  2. 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
- if (this.imagePromises.has(src)) return this.imagePromises.get(src);
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 = 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: ${src}`);
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(src, img);
400
+ this.images.set(resolved, img);
395
401
  return img;
396
402
  })();
397
- this.imagePromises.set(src, promise);
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
- if (this.audio.has(src)) return this.audio.get(src);
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(src);
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(src, audioBuffer);
425
+ this.audio.set(resolved, audioBuffer);
419
426
  return audioBuffer;
420
427
  } catch (err) {
421
- console.warn(`[Cubeforge] Failed to load audio: ${src}`);
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
- const viteEnv = import.meta.env;
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) c.image = img;
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");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cubeforge",
3
- "version": "0.3.12",
3
+ "version": "0.3.13",
4
4
  "description": "React-first 2D browser game engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",