kiwiengine 0.5.3 → 0.5.5

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 (58) hide show
  1. package/examples/auto-battle/objects/character.ts +1 -1
  2. package/examples/battle-benchmark-matterjs/objects/character.ts +1 -1
  3. package/examples/battle-benchmark-separation/objects/character.ts +1 -1
  4. package/examples/battle-benchmark-separation2/objects/character.ts +1 -1
  5. package/examples/simple-battle/objects/character.ts +1 -1
  6. package/lib/dom/dom-animated-sprite.js.map +1 -1
  7. package/lib/dom/dom-game-object.js.map +1 -1
  8. package/lib/dom/dom-sprite.js.map +1 -1
  9. package/lib/index.js.map +1 -1
  10. package/lib/node/core/game-object.js.map +1 -1
  11. package/lib/node/core/renderable.js +2 -0
  12. package/lib/node/core/renderable.js.map +1 -1
  13. package/lib/node/ext/animated-sprite.js +16 -15
  14. package/lib/node/ext/animated-sprite.js.map +1 -1
  15. package/lib/node/ext/bitmap-text.js +29 -19
  16. package/lib/node/ext/bitmap-text.js.map +1 -1
  17. package/lib/node/ext/spine.js.map +1 -1
  18. package/lib/node/ext/sprite.js.map +1 -1
  19. package/lib/node/physics/physics-object.js +8 -1
  20. package/lib/node/physics/physics-object.js.map +1 -1
  21. package/lib/node/physics/physics-world.js.map +1 -1
  22. package/lib/types/dom/dom-animated-sprite.d.ts +1 -1
  23. package/lib/types/dom/dom-animated-sprite.d.ts.map +1 -1
  24. package/lib/types/dom/dom-game-object.d.ts +1 -1
  25. package/lib/types/dom/dom-game-object.d.ts.map +1 -1
  26. package/lib/types/dom/dom-sprite.d.ts +1 -1
  27. package/lib/types/dom/dom-sprite.d.ts.map +1 -1
  28. package/lib/types/index.d.ts +1 -0
  29. package/lib/types/index.d.ts.map +1 -1
  30. package/lib/types/node/core/game-object.d.ts +1 -1
  31. package/lib/types/node/core/game-object.d.ts.map +1 -1
  32. package/lib/types/node/core/renderable.d.ts +2 -0
  33. package/lib/types/node/core/renderable.d.ts.map +1 -1
  34. package/lib/types/node/ext/animated-sprite.d.ts +1 -1
  35. package/lib/types/node/ext/animated-sprite.d.ts.map +1 -1
  36. package/lib/types/node/ext/bitmap-text.d.ts +4 -2
  37. package/lib/types/node/ext/bitmap-text.d.ts.map +1 -1
  38. package/lib/types/node/ext/spine.d.ts +1 -1
  39. package/lib/types/node/ext/spine.d.ts.map +1 -1
  40. package/lib/types/node/ext/sprite.d.ts +1 -1
  41. package/lib/types/node/ext/sprite.d.ts.map +1 -1
  42. package/lib/types/node/physics/physics-object.d.ts +2 -1
  43. package/lib/types/node/physics/physics-object.d.ts.map +1 -1
  44. package/lib/types/node/physics/physics-world.d.ts +1 -1
  45. package/lib/types/node/physics/physics-world.d.ts.map +1 -1
  46. package/package.json +1 -1
  47. package/src/dom/dom-animated-sprite.ts +1 -1
  48. package/src/dom/dom-game-object.ts +1 -1
  49. package/src/dom/dom-sprite.ts +1 -1
  50. package/src/index.ts +1 -0
  51. package/src/node/core/game-object.ts +1 -1
  52. package/src/node/core/renderable.ts +3 -0
  53. package/src/node/ext/animated-sprite.ts +18 -17
  54. package/src/node/ext/bitmap-text.ts +37 -21
  55. package/src/node/ext/spine.ts +1 -1
  56. package/src/node/ext/sprite.ts +1 -1
  57. package/src/node/physics/physics-object.ts +9 -2
  58. package/src/node/physics/physics-world.ts +1 -1
@@ -12,7 +12,7 @@ export type CharacterOptions = {
12
12
  hurtbox: RectangleCollider
13
13
  } & PhysicsObjectOptions
14
14
 
15
- export abstract class Character<E extends EventMap = EventMap> extends PhysicsObject<E & {
15
+ export abstract class Character<E extends EventMap = {}> extends PhysicsObject<E & {
16
16
  changeHp: (damage: number) => void
17
17
  dead: () => void
18
18
  }> {
@@ -12,7 +12,7 @@ export type CharacterOptions = {
12
12
  hurtbox: RectangleCollider
13
13
  } & PhysicsObjectOptions
14
14
 
15
- export abstract class Character<E extends EventMap = EventMap> extends PhysicsObject<E & {
15
+ export abstract class Character<E extends EventMap = {}> extends PhysicsObject<E & {
16
16
  changeHp: (damage: number) => void
17
17
  dead: () => void
18
18
  }> {
@@ -21,7 +21,7 @@ export type CharacterOptions = {
21
21
  hurtbox: RectangleCollider
22
22
  } & PhysicsObjectOptions
23
23
 
24
- export abstract class Character<E extends EventMap = EventMap> extends GameObject<E & {
24
+ export abstract class Character<E extends EventMap = {}> extends GameObject<E & {
25
25
  changeHp: (damage: number) => void
26
26
  dead: () => void
27
27
  }> {
@@ -18,7 +18,7 @@ export type CharacterOptions = {
18
18
  separationStrength?: number
19
19
  } & PhysicsObjectOptions
20
20
 
21
- export abstract class Character<E extends EventMap = EventMap> extends GameObject<E & {
21
+ export abstract class Character<E extends EventMap = {}> extends GameObject<E & {
22
22
  changeHp: (damage: number) => void
23
23
  dead: () => void
24
24
  }> {
@@ -12,7 +12,7 @@ export type CharacterOptions = {
12
12
  hurtbox: RectangleCollider
13
13
  } & PhysicsObjectOptions
14
14
 
15
- export abstract class Character<E extends EventMap = EventMap> extends PhysicsObject<E & {
15
+ export abstract class Character<E extends EventMap = {}> extends PhysicsObject<E & {
16
16
  changeHp: (damage: number) => void
17
17
  dead: () => void
18
18
  }> {
@@ -1 +1 @@
1
- {"version":3,"file":"dom-animated-sprite.js","sourceRoot":"","sources":["../../src/dom/dom-animated-sprite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAQtC,MAAM,OAAO,qBAAqD,SAAQ,aAExE;IACA,IAAI,CAAQ;IACZ,MAAM,CAAO;IACb,UAAU,CAAQ;IAElB,cAAc,CAAY;IAC1B,cAAc,CAAS;IACvB,YAAY,GAAG,CAAC,CAAA;IAChB,gBAAgB,GAAG,CAAC,CAAA;IAEpB,YAAY,OAAqC;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACpE,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,cAAc,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAA;QAE/B,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE3C,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,eAAe,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG;YACpC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI;YACrB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI;YACtB,cAAc,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,IAAI;YACxD,kBAAkB,EAAE,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI;SAClD,CAAC,CAAA;IACJ,CAAC;IAEQ,MAAM,CAAC,EAAU;QACxB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAEhB,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAA;QAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAM;QAE5E,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;QACrC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;YAAE,OAAM;QAE1D,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QACvB,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc;YAAE,OAAM;QAEnD,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,CAAA;YAExC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;gBAEnD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;oBACX,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;gBAC3B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;oBACrB,MAAK;gBACP,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE3C,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE;YAChB,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI;YACrB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI;YACtB,kBAAkB,EAAE,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI;SAClD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,KAAK;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YACnB,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAA,CAAC,CAAC;IAElC,IAAI,SAAS,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;YAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;YACvD,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;YACzB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC;IAEjC,MAAM;QACb,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Animation, Atlas } from '../types/atlas'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\nexport type DomAnimatedSpriteNodeOptions = {\n src: string\n atlas: Atlas\n animation: string\n} & DomGameObjectOptions\n\nexport class DomAnimatedSpriteNode<E extends EventMap = EventMap> extends DomGameObject<E & {\n animationend: (animation: string) => void\n}> {\n #src: string\n #atlas: Atlas\n #animation: string\n\n #animationData?: Animation\n #frameDuration?: number\n #elapsedTime = 0\n #currentFrameIdx = 0\n\n constructor(options: DomAnimatedSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#atlas = options.atlas\n this.#animation = options.animation\n this.#load()\n }\n\n async #load() {\n let texture\n if (domTextureLoader.checkCached(this.#src)) {\n texture = domTextureLoader.getCached(this.#src)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#src}`)\n texture = await domTextureLoader.load(this.#src)\n }\n\n const a = this.#atlas.animations[this.#animation]\n this.#animationData = a\n this.#frameDuration = 1 / a.fps\n\n const frameName = a.frames[this.#currentFrameIdx]\n const frame = this.#atlas.frames[frameName]\n\n setStyle(this.el, !frameName || !texture ? { backgroundImage: 'none' } : {\n backgroundImage: `url(${this.#src})`,\n width: `${frame.w}px`,\n height: `${frame.h}px`,\n backgroundSize: `${texture.width}px ${texture.height}px`,\n backgroundPosition: `-${frame.x}px -${frame.y}px`\n })\n }\n\n override render(dt: number) {\n super.render(dt)\n\n const a = this.#animationData\n if (!a || a.frames.length === 0 || this.#frameDuration === undefined) return\n\n const lastIndex = a.frames.length - 1\n if (!a.loop && this.#currentFrameIdx === lastIndex) return\n\n this.#elapsedTime += dt\n if (this.#elapsedTime < this.#frameDuration) return\n\n while (this.#elapsedTime >= this.#frameDuration) {\n this.#elapsedTime -= this.#frameDuration\n\n if (this.#currentFrameIdx === lastIndex) {\n (this as any).emit('animationend', this.#animation)\n\n if (a.loop) {\n this.#currentFrameIdx = 0\n } else {\n this.#elapsedTime = 0\n break\n }\n } else {\n this.#currentFrameIdx++\n }\n }\n\n const frameName = a.frames[this.#currentFrameIdx]\n const frame = this.#atlas.frames[frameName]\n\n setStyle(this.el, {\n width: `${frame.w}px`,\n height: `${frame.h}px`,\n backgroundPosition: `-${frame.x}px -${frame.y}px`\n })\n }\n\n set src(src) {\n if (this.#src !== src) {\n domTextureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n domTextureLoader.release(this.#src)\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#animationData = this.#atlas.animations[animation]\n this.#currentFrameIdx = 0\n this.#elapsedTime = 0\n }\n }\n\n get animation() { return this.#animation }\n\n override remove() {\n domTextureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
1
+ {"version":3,"file":"dom-animated-sprite.js","sourceRoot":"","sources":["../../src/dom/dom-animated-sprite.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Animation, Atlas } from '../types/atlas'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\nexport type DomAnimatedSpriteNodeOptions = {\n src: string\n atlas: Atlas\n animation: string\n} & DomGameObjectOptions\n\nexport class DomAnimatedSpriteNode<E extends EventMap = {}> extends DomGameObject<E & {\n animationend: (animation: string) => void\n}> {\n #src: string\n #atlas: Atlas\n #animation: string\n\n #animationData?: Animation\n #frameDuration?: number\n #elapsedTime = 0\n #currentFrameIdx = 0\n\n constructor(options: DomAnimatedSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#atlas = options.atlas\n this.#animation = options.animation\n this.#load()\n }\n\n async #load() {\n let texture\n if (domTextureLoader.checkCached(this.#src)) {\n texture = domTextureLoader.getCached(this.#src)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#src}`)\n texture = await domTextureLoader.load(this.#src)\n }\n\n const a = this.#atlas.animations[this.#animation]\n this.#animationData = a\n this.#frameDuration = 1 / a.fps\n\n const frameName = a.frames[this.#currentFrameIdx]\n const frame = this.#atlas.frames[frameName]\n\n setStyle(this.el, !frameName || !texture ? { backgroundImage: 'none' } : {\n backgroundImage: `url(${this.#src})`,\n width: `${frame.w}px`,\n height: `${frame.h}px`,\n backgroundSize: `${texture.width}px ${texture.height}px`,\n backgroundPosition: `-${frame.x}px -${frame.y}px`\n })\n }\n\n override render(dt: number) {\n super.render(dt)\n\n const a = this.#animationData\n if (!a || a.frames.length === 0 || this.#frameDuration === undefined) return\n\n const lastIndex = a.frames.length - 1\n if (!a.loop && this.#currentFrameIdx === lastIndex) return\n\n this.#elapsedTime += dt\n if (this.#elapsedTime < this.#frameDuration) return\n\n while (this.#elapsedTime >= this.#frameDuration) {\n this.#elapsedTime -= this.#frameDuration\n\n if (this.#currentFrameIdx === lastIndex) {\n (this as any).emit('animationend', this.#animation)\n\n if (a.loop) {\n this.#currentFrameIdx = 0\n } else {\n this.#elapsedTime = 0\n break\n }\n } else {\n this.#currentFrameIdx++\n }\n }\n\n const frameName = a.frames[this.#currentFrameIdx]\n const frame = this.#atlas.frames[frameName]\n\n setStyle(this.el, {\n width: `${frame.w}px`,\n height: `${frame.h}px`,\n backgroundPosition: `-${frame.x}px -${frame.y}px`\n })\n }\n\n set src(src) {\n if (this.#src !== src) {\n domTextureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n domTextureLoader.release(this.#src)\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#animationData = this.#atlas.animations[animation]\n this.#currentFrameIdx = 0\n this.#elapsedTime = 0\n }\n }\n\n get animation() { return this.#animation }\n\n override remove() {\n domTextureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dom-game-object.js","sourceRoot":"","sources":["../../src/dom/dom-game-object.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { DirtyNumber } from '../node/core/dirty-number'\nimport { GameNode } from '../node/core/game-node'\nimport { LocalTransform, WorldTransform } from '../node/core/transform'\nimport { setStyle } from './dom-utils'\n\nexport function isDomGameObject(v: unknown): v is DomGameObject {\n return (v as DomGameObject).worldTransform !== undefined\n}\n\nexport type DomGameObjectOptions = {\n x?: number\n y?: number\n scale?: number\n scaleX?: number\n scaleY?: number\n pivotX?: number\n pivotY?: number\n rotation?: number\n\n alpha?: number\n useYSort?: boolean\n}\n\nclass DomRootNode extends GameNode<EventMap> {\n worldTransform = new WorldTransform()\n worldAlpha = new DirtyNumber(1)\n\n constructor() {\n super()\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n }\n}\n\nexport class DomGameObject<E extends EventMap = EventMap> extends GameNode<E> {\n protected el = document.createElement('div')\n\n #localTransform = new LocalTransform()\n worldTransform = new WorldTransform()\n alpha = 1\n worldAlpha = new DirtyNumber(1)\n #useYSort = false\n\n constructor(options?: DomGameObjectOptions) {\n super()\n\n setStyle(this.el, {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: '1',\n transform: 'translate(-50%, -50%)',\n })\n\n if (options) {\n if (options.x !== undefined) this.x = options.x\n if (options.y !== undefined) this.y = options.y\n if (options.scale !== undefined) this.scale = options.scale\n if (options.scaleX !== undefined) this.scaleX = options.scaleX\n if (options.scaleY !== undefined) this.scaleY = options.scaleY\n if (options.pivotX !== undefined) this.pivotX = options.pivotX\n if (options.pivotY !== undefined) this.pivotY = options.pivotY\n if (options.rotation !== undefined) this.rotation = options.rotation\n if (options.alpha !== undefined) this.alpha = options.alpha\n\n this.#useYSort = options.useYSort ?? false\n }\n }\n\n render(dt: number) {\n this.update(dt)\n this.#updateWorldTransform()\n }\n\n #updateWorldTransform() {\n const parent = this.parent\n if (parent && isDomGameObject(parent)) {\n this.worldTransform.update(parent.worldTransform, this.#localTransform)\n this.worldAlpha.v = parent.worldAlpha.v * this.alpha\n }\n\n if (this.worldTransform.dirty) {\n const wt = this.worldTransform\n\n this.el.style.transform = `\n translate(\n calc(-50% + ${wt.x.v}px),\n calc(-50% + ${wt.y.v}px)\n )\n scale(${wt.scaleX.v}, ${wt.scaleY.v})\n rotate(${wt.rotation.v}rad)\n `\n }\n if (this.worldAlpha.dirty) this.el.style.opacity = this.worldAlpha.v.toString()\n\n for (const child of this.children) {\n if (isDomGameObject(child)) child.#updateWorldTransform()\n }\n this.worldTransform.resetDirty()\n }\n\n attachTo(target: HTMLElement) {\n target.appendChild(this.el)\n this.parent = new DomRootNode()\n this.#updateWorldTransform()\n return this\n }\n\n set x(v) { this.#localTransform.x = v }\n get x() { return this.#localTransform.x }\n\n set y(v) { this.#localTransform.y = v }\n get y() { return this.#localTransform.y }\n\n set scale(v) { this.#localTransform.scaleX = v; this.#localTransform.scaleY = v }\n get scale() { return this.#localTransform.scaleX }\n\n set scaleX(v) { this.#localTransform.scaleX = v }\n get scaleX() { return this.#localTransform.scaleX }\n\n set scaleY(v) { this.#localTransform.scaleY = v }\n get scaleY() { return this.#localTransform.scaleY }\n\n set pivotX(v) { this.#localTransform.pivotX = v }\n get pivotX() { return this.#localTransform.pivotX }\n\n set pivotY(v) { this.#localTransform.pivotY = v }\n get pivotY() { return this.#localTransform.pivotY }\n\n set rotation(v) { this.#localTransform.rotation = v }\n get rotation() { return this.#localTransform.rotation }\n}\n"]}
1
+ {"version":3,"file":"dom-game-object.js","sourceRoot":"","sources":["../../src/dom/dom-game-object.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { DirtyNumber } from '../node/core/dirty-number'\nimport { GameNode } from '../node/core/game-node'\nimport { LocalTransform, WorldTransform } from '../node/core/transform'\nimport { setStyle } from './dom-utils'\n\nexport function isDomGameObject(v: unknown): v is DomGameObject {\n return (v as DomGameObject).worldTransform !== undefined\n}\n\nexport type DomGameObjectOptions = {\n x?: number\n y?: number\n scale?: number\n scaleX?: number\n scaleY?: number\n pivotX?: number\n pivotY?: number\n rotation?: number\n\n alpha?: number\n useYSort?: boolean\n}\n\nclass DomRootNode extends GameNode<EventMap> {\n worldTransform = new WorldTransform()\n worldAlpha = new DirtyNumber(1)\n\n constructor() {\n super()\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n }\n}\n\nexport class DomGameObject<E extends EventMap = {}> extends GameNode<E> {\n protected el = document.createElement('div')\n\n #localTransform = new LocalTransform()\n worldTransform = new WorldTransform()\n alpha = 1\n worldAlpha = new DirtyNumber(1)\n #useYSort = false\n\n constructor(options?: DomGameObjectOptions) {\n super()\n\n setStyle(this.el, {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: '1',\n transform: 'translate(-50%, -50%)',\n })\n\n if (options) {\n if (options.x !== undefined) this.x = options.x\n if (options.y !== undefined) this.y = options.y\n if (options.scale !== undefined) this.scale = options.scale\n if (options.scaleX !== undefined) this.scaleX = options.scaleX\n if (options.scaleY !== undefined) this.scaleY = options.scaleY\n if (options.pivotX !== undefined) this.pivotX = options.pivotX\n if (options.pivotY !== undefined) this.pivotY = options.pivotY\n if (options.rotation !== undefined) this.rotation = options.rotation\n if (options.alpha !== undefined) this.alpha = options.alpha\n\n this.#useYSort = options.useYSort ?? false\n }\n }\n\n render(dt: number) {\n this.update(dt)\n this.#updateWorldTransform()\n }\n\n #updateWorldTransform() {\n const parent = this.parent\n if (parent && isDomGameObject(parent)) {\n this.worldTransform.update(parent.worldTransform, this.#localTransform)\n this.worldAlpha.v = parent.worldAlpha.v * this.alpha\n }\n\n if (this.worldTransform.dirty) {\n const wt = this.worldTransform\n\n this.el.style.transform = `\n translate(\n calc(-50% + ${wt.x.v}px),\n calc(-50% + ${wt.y.v}px)\n )\n scale(${wt.scaleX.v}, ${wt.scaleY.v})\n rotate(${wt.rotation.v}rad)\n `\n }\n if (this.worldAlpha.dirty) this.el.style.opacity = this.worldAlpha.v.toString()\n\n for (const child of this.children) {\n if (isDomGameObject(child)) child.#updateWorldTransform()\n }\n this.worldTransform.resetDirty()\n }\n\n attachTo(target: HTMLElement) {\n target.appendChild(this.el)\n this.parent = new DomRootNode()\n this.#updateWorldTransform()\n return this\n }\n\n set x(v) { this.#localTransform.x = v }\n get x() { return this.#localTransform.x }\n\n set y(v) { this.#localTransform.y = v }\n get y() { return this.#localTransform.y }\n\n set scale(v) { this.#localTransform.scaleX = v; this.#localTransform.scaleY = v }\n get scale() { return this.#localTransform.scaleX }\n\n set scaleX(v) { this.#localTransform.scaleX = v }\n get scaleX() { return this.#localTransform.scaleX }\n\n set scaleY(v) { this.#localTransform.scaleY = v }\n get scaleY() { return this.#localTransform.scaleY }\n\n set pivotX(v) { this.#localTransform.pivotX = v }\n get pivotX() { return this.#localTransform.pivotX }\n\n set pivotY(v) { this.#localTransform.pivotY = v }\n get pivotY() { return this.#localTransform.pivotY }\n\n set rotation(v) { this.#localTransform.rotation = v }\n get rotation() { return this.#localTransform.rotation }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dom-sprite.js","sourceRoot":"","sources":["../../src/dom/dom-sprite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAMtC,MAAM,OAAO,aAA6C,SAAQ,aAAgB;IAChF,IAAI,CAAQ;IAEZ,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACpE,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACzD,eAAe,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG;YACpC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI;YAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI;YAC7B,cAAc,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,IAAI;SACzD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAErB,MAAM;QACb,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\nexport type DomSpriteNodeOptions = {\n src: string\n} & DomGameObjectOptions\n\nexport class DomSpriteNode<E extends EventMap = EventMap> extends DomGameObject<E> {\n #src: string\n\n constructor(options: DomSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#load()\n }\n\n async #load() {\n let texture\n if (domTextureLoader.checkCached(this.#src)) {\n texture = domTextureLoader.getCached(this.#src)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#src}`)\n texture = await domTextureLoader.load(this.#src)\n }\n\n setStyle(this.el, !texture ? { backgroundImage: 'none' } : {\n backgroundImage: `url(${this.#src})`,\n width: `${texture.width}px`,\n height: `${texture.height}px`,\n backgroundSize: `${texture.width}px ${texture.height}px`,\n })\n }\n\n set src(src) {\n if (this.#src !== src) {\n domTextureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n override remove() {\n domTextureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
1
+ {"version":3,"file":"dom-sprite.js","sourceRoot":"","sources":["../../src/dom/dom-sprite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAMtC,MAAM,OAAO,aAAuC,SAAQ,aAAgB;IAC1E,IAAI,CAAQ;IAEZ,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACpE,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACzD,eAAe,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG;YACpC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI;YAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI;YAC7B,cAAc,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,IAAI;SACzD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAErB,MAAM;QACb,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { DomGameObject, DomGameObjectOptions } from './dom-game-object'\nimport { domTextureLoader } from './dom-texture-loader'\nimport { setStyle } from './dom-utils'\n\nexport type DomSpriteNodeOptions = {\n src: string\n} & DomGameObjectOptions\n\nexport class DomSpriteNode<E extends EventMap = {}> extends DomGameObject<E> {\n #src: string\n\n constructor(options: DomSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#load()\n }\n\n async #load() {\n let texture\n if (domTextureLoader.checkCached(this.#src)) {\n texture = domTextureLoader.getCached(this.#src)\n } else {\n console.info(`Dom texture not preloaded. Loading now: ${this.#src}`)\n texture = await domTextureLoader.load(this.#src)\n }\n\n setStyle(this.el, !texture ? { backgroundImage: 'none' } : {\n backgroundImage: `url(${this.#src})`,\n width: `${texture.width}px`,\n height: `${texture.height}px`,\n backgroundSize: `${texture.width}px ${texture.height}px`,\n })\n }\n\n set src(src) {\n if (this.#src !== src) {\n domTextureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n override remove() {\n domTextureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,UAAU,EAAqB,MAAM,yBAAyB,CAAA;AAEvE,WAAW;AACX,OAAO,EAAE,QAAQ,EAAmB,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEtD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAA4B,YAAY,EAAuD,MAAM,uBAAuB,CAAA;AAEnI,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAA6B,MAAM,4BAA4B,CAAA;AAC1F,OAAO,EAAE,cAAc,EAAyB,MAAM,wBAAwB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAA2B,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AAEjE,UAAU;AACV,OAAO,EAAE,aAAa,EAAwB,MAAM,+BAA+B,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAoE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE5H,YAAY;AACZ,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAA4B,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAwB,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEtD,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA","sourcesContent":["// Core\nexport { GameObject, GameObjectOptions } from './node/core/game-object'\n\n// Renderer\nexport { Renderer, RendererOptions } from './renderer/renderer'\nexport { Ticker } from './renderer/ticker'\n\n// Assets\nexport { musicPlayer, sfxPlayer } from './asset/audio'\nexport { AssetSource, preload } from './asset/preload'\n\n// Collision\nexport { checkCollision } from './collision/check-collision'\nexport { CircleCollider, Collider, ColliderType, EllipseCollider, PolygonCollider, RectangleCollider } from './collision/colliders'\n\n// Node Extensions\nexport { AnimatedSpriteNode, AnimatedSpriteNodeOptions } from './node/ext/animated-sprite'\nexport { BitmapTextNode, BitmapTextNodeOptions } from './node/ext/bitmap-text'\nexport { CircleNode, CircleNodeOptions } from './node/ext/circle'\nexport { DelayNode } from './node/ext/deplay'\nexport { DomContainerNode, DomContainerNodeOptions } from './node/ext/dom-container'\nexport { IntervalNode } from './node/ext/interval'\nexport { ParticleSystem, ParticleSystemOptions } from './node/ext/particle'\nexport { RectangleNode, RectangleNodeOptions } from './node/ext/rectangle'\nexport { SpineNode, SpineNodeOptions } from './node/ext/spine'\nexport { SpriteNode, SpriteNodeOptions } from './node/ext/sprite'\n\n// Physics\nexport { PhysicsObject, PhysicsObjectOptions } from './node/physics/physics-object'\nexport { PhysicsWorld } from './node/physics/physics-world'\nexport { CircleRigidbody, PolygonRigidbody, RectangleRigidbody, Rigidbody, RigidbodyType } from './node/physics/rigidbodies'\n\n// DOM Nodes\nexport { DomAnimatedSpriteNode } from './dom/dom-animated-sprite'\nexport { DomParticleSystem, DomParticleSystemOptions } from './dom/dom-particle'\nexport { domPreload } from './dom/dom-preload'\nexport { DomSpriteNode, DomSpriteNodeOptions } from './dom/dom-sprite'\nexport { setStyle, textStroke } from './dom/dom-utils'\n\n// Input\nexport { Joystick } from './input/joystick'\n\n// Utils\nexport { isMobile } from './utils/device'\n\n// Debug\nexport { debugMode, enableDebug } from './debug'\n\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,UAAU,EAAqB,MAAM,yBAAyB,CAAA;AAEvE,WAAW;AACX,OAAO,EAAE,QAAQ,EAAmB,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAGtD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAA4B,YAAY,EAAuD,MAAM,uBAAuB,CAAA;AAEnI,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAA6B,MAAM,4BAA4B,CAAA;AAC1F,OAAO,EAAE,cAAc,EAAyB,MAAM,wBAAwB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAA2B,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AAEjE,UAAU;AACV,OAAO,EAAE,aAAa,EAAwB,MAAM,+BAA+B,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAoE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE5H,YAAY;AACZ,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAA4B,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAwB,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEtD,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA","sourcesContent":["// Core\nexport { GameObject, GameObjectOptions } from './node/core/game-object'\n\n// Renderer\nexport { Renderer, RendererOptions } from './renderer/renderer'\nexport { Ticker } from './renderer/ticker'\n\n// Assets\nexport { musicPlayer, sfxPlayer } from './asset/audio'\nexport { AssetSource, preload } from './asset/preload'\nexport { Atlas } from './types/atlas'\n\n// Collision\nexport { checkCollision } from './collision/check-collision'\nexport { CircleCollider, Collider, ColliderType, EllipseCollider, PolygonCollider, RectangleCollider } from './collision/colliders'\n\n// Node Extensions\nexport { AnimatedSpriteNode, AnimatedSpriteNodeOptions } from './node/ext/animated-sprite'\nexport { BitmapTextNode, BitmapTextNodeOptions } from './node/ext/bitmap-text'\nexport { CircleNode, CircleNodeOptions } from './node/ext/circle'\nexport { DelayNode } from './node/ext/deplay'\nexport { DomContainerNode, DomContainerNodeOptions } from './node/ext/dom-container'\nexport { IntervalNode } from './node/ext/interval'\nexport { ParticleSystem, ParticleSystemOptions } from './node/ext/particle'\nexport { RectangleNode, RectangleNodeOptions } from './node/ext/rectangle'\nexport { SpineNode, SpineNodeOptions } from './node/ext/spine'\nexport { SpriteNode, SpriteNodeOptions } from './node/ext/sprite'\n\n// Physics\nexport { PhysicsObject, PhysicsObjectOptions } from './node/physics/physics-object'\nexport { PhysicsWorld } from './node/physics/physics-world'\nexport { CircleRigidbody, PolygonRigidbody, RectangleRigidbody, Rigidbody, RigidbodyType } from './node/physics/rigidbodies'\n\n// DOM Nodes\nexport { DomAnimatedSpriteNode } from './dom/dom-animated-sprite'\nexport { DomParticleSystem, DomParticleSystemOptions } from './dom/dom-particle'\nexport { domPreload } from './dom/dom-preload'\nexport { DomSpriteNode, DomSpriteNodeOptions } from './dom/dom-sprite'\nexport { setStyle, textStroke } from './dom/dom-utils'\n\n// Input\nexport { Joystick } from './input/joystick'\n\n// Utils\nexport { isMobile } from './utils/device'\n\n// Debug\nexport { debugMode, enableDebug } from './debug'\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"game-object.js","sourceRoot":"","sources":["../../../src/node/core/game-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAA4B,MAAM,iBAAiB,CAAA;AAI7E,MAAM,OAAO,UAA0C,SAAQ,iBAAmC;IAChG,YAAY,OAA2B;QACrC,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IACrE,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { TransformableNode, TransformableNodeOptions } from './transformable'\n\nexport type GameObjectOptions = {} & TransformableNodeOptions\n\nexport class GameObject<E extends EventMap = EventMap> extends TransformableNode<PixiContainer, E> {\n constructor(options?: GameObjectOptions) {\n super(new PixiContainer({ sortableChildren: true }), options ?? {})\n }\n}\n"]}
1
+ {"version":3,"file":"game-object.js","sourceRoot":"","sources":["../../../src/node/core/game-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAA4B,MAAM,iBAAiB,CAAA;AAI7E,MAAM,OAAO,UAAoC,SAAQ,iBAAmC;IAC1F,YAAY,OAA2B;QACrC,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IACrE,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { TransformableNode, TransformableNodeOptions } from './transformable'\n\nexport type GameObjectOptions = {} & TransformableNodeOptions\n\nexport class GameObject<E extends EventMap = {}> extends TransformableNode<PixiContainer, E> {\n constructor(options?: GameObjectOptions) {\n super(new PixiContainer({ sortableChildren: true }), options ?? {})\n }\n}\n"]}
@@ -55,5 +55,7 @@ export class RenderableNode extends GameNode {
55
55
  }
56
56
  set tint(t) { this._pixiContainer.tint = t; }
57
57
  get tint() { return this._pixiContainer.tint; }
58
+ hide() { this._pixiContainer.visible = false; }
59
+ show() { this._pixiContainer.visible = true; }
58
60
  }
59
61
  //# sourceMappingURL=renderable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderable.js","sourceRoot":"","sources":["../../../src/node/core/renderable.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAQ,CAA6C,CAAC,cAAc,KAAK,SAAS,CAAA;AACpF,CAAC;AAED,MAAM,OAAgB,cAA4D,SAAQ,QAAW;IACnG,SAAS,CAAW;IACpB,cAAc,CAAG;IAEjB,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;IACrC,UAAU,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;IAE/B,YAAY,aAAgB;QAC1B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;IACrC,CAAC;IAED,IAAc,QAAQ,CAAC,QAA8B;QACnD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAEzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAEQ,GAAG,CAAC,GAAG,QAA8B;QAC5C,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;QAEtB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;gBAElD,SAAS;gBACT,IAAI,IAAI,CAAC,SAAS;oBAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAEQ,MAAM;QACb,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;IAED,qBAAqB;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,gBAAgB,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,qBAAqB,EAAE,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,yBAAyB;QACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,gBAAgB,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,yBAAyB,EAAE,CAAA;QAChE,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAA;IAC9B,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAA,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAA,CAAC,CAAC;CAC/C","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { Renderer } from '../../renderer/renderer'\nimport { DirtyNumber } from './dirty-number'\nimport { GameNode } from './game-node'\nimport { WorldTransform } from './transform'\n\nexport function isRenderableNode(v: unknown): v is RenderableNode<PixiContainer, EventMap> {\n return (v as RenderableNode<PixiContainer, EventMap>).worldTransform !== undefined\n}\n\nexport abstract class RenderableNode<C extends PixiContainer, E extends EventMap> extends GameNode<E> {\n #renderer?: Renderer\n _pixiContainer: C\n\n worldTransform = new WorldTransform()\n worldAlpha = new DirtyNumber(1)\n\n constructor(pixiContainer: C) {\n super()\n this._pixiContainer = pixiContainer\n }\n\n protected set renderer(renderer: Renderer | undefined) {\n this.#renderer = renderer\n\n for (const child of this.children) {\n if (isRenderableNode(child)) {\n child.renderer = renderer\n }\n }\n }\n\n protected get renderer() {\n return this.#renderer\n }\n\n override add(...children: GameNode<EventMap>[]) {\n super.add(...children)\n\n for (const child of children) {\n if (isRenderableNode(child)) {\n this._pixiContainer.addChild(child._pixiContainer)\n\n // 렌더러 설정\n if (this.#renderer) child.renderer = this.#renderer\n }\n }\n }\n\n override remove() {\n this._pixiContainer.destroy({ children: true })\n super.remove()\n }\n\n _updateWorldTransform() {\n for (const child of this.children) {\n if (isRenderableNode(child)) child._updateWorldTransform()\n }\n }\n\n _resetWorldTransformDirty() {\n for (const child of this.children) {\n if (isRenderableNode(child)) child._resetWorldTransformDirty()\n }\n this.worldTransform.resetDirty()\n this.worldAlpha.resetDirty()\n }\n\n set tint(t) { this._pixiContainer.tint = t }\n get tint() { return this._pixiContainer.tint }\n}\n"]}
1
+ {"version":3,"file":"renderable.js","sourceRoot":"","sources":["../../../src/node/core/renderable.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAQ,CAA6C,CAAC,cAAc,KAAK,SAAS,CAAA;AACpF,CAAC;AAED,MAAM,OAAgB,cAA4D,SAAQ,QAAW;IACnG,SAAS,CAAW;IACpB,cAAc,CAAG;IAEjB,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;IACrC,UAAU,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;IAE/B,YAAY,aAAgB;QAC1B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;IACrC,CAAC;IAED,IAAc,QAAQ,CAAC,QAA8B;QACnD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAEzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAEQ,GAAG,CAAC,GAAG,QAA8B;QAC5C,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;QAEtB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;gBAElD,SAAS;gBACT,IAAI,IAAI,CAAC,SAAS;oBAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAEQ,MAAM;QACb,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;IAED,qBAAqB;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,gBAAgB,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,qBAAqB,EAAE,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,yBAAyB;QACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,gBAAgB,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,yBAAyB,EAAE,CAAA;QAChE,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAA;IAC9B,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAA,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAA,CAAC,CAAC;IAE9C,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAA,CAAC,CAAC;IAC9C,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAA,CAAC,CAAC;CAC9C","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { Renderer } from '../../renderer/renderer'\nimport { DirtyNumber } from './dirty-number'\nimport { GameNode } from './game-node'\nimport { WorldTransform } from './transform'\n\nexport function isRenderableNode(v: unknown): v is RenderableNode<PixiContainer, EventMap> {\n return (v as RenderableNode<PixiContainer, EventMap>).worldTransform !== undefined\n}\n\nexport abstract class RenderableNode<C extends PixiContainer, E extends EventMap> extends GameNode<E> {\n #renderer?: Renderer\n _pixiContainer: C\n\n worldTransform = new WorldTransform()\n worldAlpha = new DirtyNumber(1)\n\n constructor(pixiContainer: C) {\n super()\n this._pixiContainer = pixiContainer\n }\n\n protected set renderer(renderer: Renderer | undefined) {\n this.#renderer = renderer\n\n for (const child of this.children) {\n if (isRenderableNode(child)) {\n child.renderer = renderer\n }\n }\n }\n\n protected get renderer() {\n return this.#renderer\n }\n\n override add(...children: GameNode<EventMap>[]) {\n super.add(...children)\n\n for (const child of children) {\n if (isRenderableNode(child)) {\n this._pixiContainer.addChild(child._pixiContainer)\n\n // 렌더러 설정\n if (this.#renderer) child.renderer = this.#renderer\n }\n }\n }\n\n override remove() {\n this._pixiContainer.destroy({ children: true })\n super.remove()\n }\n\n _updateWorldTransform() {\n for (const child of this.children) {\n if (isRenderableNode(child)) child._updateWorldTransform()\n }\n }\n\n _resetWorldTransformDirty() {\n for (const child of this.children) {\n if (isRenderableNode(child)) child._resetWorldTransformDirty()\n }\n this.worldTransform.resetDirty()\n this.worldAlpha.resetDirty()\n }\n\n set tint(t) { this._pixiContainer.tint = t }\n get tint() { return this._pixiContainer.tint }\n\n hide() { this._pixiContainer.visible = false }\n show() { this._pixiContainer.visible = true }\n}\n"]}
@@ -29,22 +29,23 @@ export class AnimatedSpriteNode extends GameObject {
29
29
  #updateAnimation() {
30
30
  this.#sprite?.destroy();
31
31
  this.#sprite = undefined;
32
- if (this.#sheet) {
33
- if (!this.#sheet.animations[this.#animation]) {
34
- console.error(`Animation not found: ${this.#animation}`);
35
- return;
36
- }
37
- const a = this.#atlas.animations[this.#animation];
38
- const s = new PixiAnimatedSprite(this.#sheet.animations[this.#animation]);
39
- s.anchor.set(0.5, 0.5);
40
- s.loop = a.loop;
41
- s.animationSpeed = a.fps / 60;
42
- s.play();
43
- s.onLoop = () => this.emit('animationend', this.#animation);
44
- s.onComplete = () => this.emit('animationend', this.#animation);
45
- this._pixiContainer.addChild(s);
46
- this.#sprite = s;
32
+ if (!this.#sheet)
33
+ return;
34
+ if (!this.#sheet.animations[this.#animation]) {
35
+ console.error(`Animation not found: ${this.#animation}`);
36
+ return;
47
37
  }
38
+ const a = this.#atlas.animations[this.#animation];
39
+ const s = new PixiAnimatedSprite(this.#sheet.animations[this.#animation]);
40
+ s.anchor.set(0.5, 0.5);
41
+ s.zIndex = -999999;
42
+ s.loop = a.loop;
43
+ s.animationSpeed = a.fps / 60;
44
+ s.play();
45
+ s.onLoop = () => this.emit('animationend', this.#animation);
46
+ s.onComplete = () => this.emit('animationend', this.#animation);
47
+ this._pixiContainer.addChild(s);
48
+ this.#sprite = s;
48
49
  }
49
50
  set src(src) {
50
51
  if (this.#src !== src) {
@@ -1 +1 @@
1
- {"version":3,"file":"animated-sprite.js","sourceRoot":"","sources":["../../../src/node/ext/animated-sprite.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { AnimatedSprite as PixiAnimatedSprite, Spritesheet } from 'pixi.js'\nimport { getCachedAtlasId, spritesheetLoader } from '../../asset/loaders/spritesheet'\nimport { Atlas } from '../../types/atlas'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type AnimatedSpriteNodeOptions = {\n src: string\n atlas: Atlas\n animation: string\n} & GameObjectOptions\n\nexport class AnimatedSpriteNode<E extends EventMap = EventMap> extends GameObject<E & {\n animationend: (animation: string) => void\n}> {\n #src: string\n #atlas: Atlas\n #animation: string\n\n #atlasId!: string\n #sheet?: Spritesheet\n #sprite?: PixiAnimatedSprite\n\n constructor(options: AnimatedSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#atlas = options.atlas\n this.#animation = options.animation\n this.#load()\n }\n\n async #load() {\n this.#atlasId = getCachedAtlasId(this.#src, this.#atlas)\n\n if (spritesheetLoader.checkCached(this.#atlasId)) {\n this.#sheet = spritesheetLoader.getCached(this.#atlasId)\n } else {\n console.info(`Spritesheet not preloaded. Loading now: ${this.#atlasId}`)\n this.#sheet = await spritesheetLoader.load(this.#atlasId, this.#src, this.#atlas)\n }\n\n this.#updateAnimation()\n }\n\n #updateAnimation() {\n this.#sprite?.destroy()\n this.#sprite = undefined\n\n if (this.#sheet) {\n if (!this.#sheet.animations[this.#animation]) {\n console.error(`Animation not found: ${this.#animation}`)\n return\n }\n\n const a = this.#atlas.animations[this.#animation]\n const s = new PixiAnimatedSprite(this.#sheet.animations[this.#animation])\n\n s.anchor.set(0.5, 0.5)\n s.loop = a.loop\n s.animationSpeed = a.fps / 60\n s.play()\n s.onLoop = () => (this as any).emit('animationend', this.#animation)\n s.onComplete = () => (this as any).emit('animationend', this.#animation)\n\n this._pixiContainer.addChild(s)\n this.#sprite = s\n }\n }\n\n set src(src) {\n if (this.#src !== src) {\n spritesheetLoader.release(this.#atlasId)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n spritesheetLoader.release(this.#atlasId)\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#updateAnimation()\n }\n }\n\n get animation() { return this.#animation }\n\n remove() {\n spritesheetLoader.release(this.#atlasId)\n super.remove()\n }\n}\n"]}
1
+ {"version":3,"file":"animated-sprite.js","sourceRoot":"","sources":["../../../src/node/ext/animated-sprite.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { AnimatedSprite as PixiAnimatedSprite, Spritesheet } from 'pixi.js'\nimport { getCachedAtlasId, spritesheetLoader } from '../../asset/loaders/spritesheet'\nimport { Atlas } from '../../types/atlas'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type AnimatedSpriteNodeOptions = {\n src: string\n atlas: Atlas\n animation: string\n} & GameObjectOptions\n\nexport class AnimatedSpriteNode<E extends EventMap = {}> extends GameObject<E & {\n animationend: (animation: string) => void\n}> {\n #src: string\n #atlas: Atlas\n #animation: string\n\n #atlasId!: string\n #sheet?: Spritesheet\n #sprite?: PixiAnimatedSprite\n\n constructor(options: AnimatedSpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#atlas = options.atlas\n this.#animation = options.animation\n this.#load()\n }\n\n async #load() {\n this.#atlasId = getCachedAtlasId(this.#src, this.#atlas)\n\n if (spritesheetLoader.checkCached(this.#atlasId)) {\n this.#sheet = spritesheetLoader.getCached(this.#atlasId)\n } else {\n console.info(`Spritesheet not preloaded. Loading now: ${this.#atlasId}`)\n this.#sheet = await spritesheetLoader.load(this.#atlasId, this.#src, this.#atlas)\n }\n\n this.#updateAnimation()\n }\n\n #updateAnimation() {\n this.#sprite?.destroy()\n this.#sprite = undefined\n\n if (!this.#sheet) return\n\n if (!this.#sheet.animations[this.#animation]) {\n console.error(`Animation not found: ${this.#animation}`)\n return\n }\n\n const a = this.#atlas.animations[this.#animation]\n const s = new PixiAnimatedSprite(this.#sheet.animations[this.#animation])\n\n s.anchor.set(0.5, 0.5)\n s.zIndex = -999999\n s.loop = a.loop\n s.animationSpeed = a.fps / 60\n s.play()\n s.onLoop = () => (this as any).emit('animationend', this.#animation)\n s.onComplete = () => (this as any).emit('animationend', this.#animation)\n\n this._pixiContainer.addChild(s)\n this.#sprite = s\n }\n\n set src(src) {\n if (this.#src !== src) {\n spritesheetLoader.release(this.#atlasId)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n spritesheetLoader.release(this.#atlasId)\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#updateAnimation()\n }\n }\n\n get animation() { return this.#animation }\n\n remove() {\n spritesheetLoader.release(this.#atlasId)\n super.remove()\n }\n}\n"]}
@@ -5,6 +5,7 @@ export class BitmapTextNode extends GameObject {
5
5
  #fnt;
6
6
  #src;
7
7
  #text;
8
+ #font;
8
9
  #sprites = [];
9
10
  constructor(options) {
10
11
  super(options);
@@ -13,21 +14,13 @@ export class BitmapTextNode extends GameObject {
13
14
  this.#text = options.text;
14
15
  this.#load();
15
16
  }
16
- async #load() {
17
- let font;
18
- if (bitmapFontLoader.checkCached(this.#fnt)) {
19
- font = bitmapFontLoader.getCached(this.#fnt);
20
- }
21
- else {
22
- console.info(`Bitmap font not preloaded. Loading now: ${this.#fnt}`);
23
- font = await bitmapFontLoader.load(this.#fnt, this.#src);
24
- }
25
- if (!font)
26
- return;
17
+ #updateText() {
27
18
  for (const sprite of this.#sprites) {
28
19
  sprite.destroy();
29
20
  }
30
21
  this.#sprites = [];
22
+ if (!this.#font || !this.#text)
23
+ return;
31
24
  let xPos = 0, yPos = 0;
32
25
  let minX = Infinity, minY = Infinity;
33
26
  let maxX = -Infinity, maxY = -Infinity;
@@ -35,15 +28,15 @@ export class BitmapTextNode extends GameObject {
35
28
  const charCode = this.#text.charCodeAt(i);
36
29
  if (charCode === 10) {
37
30
  xPos = 0;
38
- yPos += font.lineHeight;
31
+ yPos += this.#font.lineHeight;
39
32
  continue;
40
33
  }
41
- const c = font.chars[charCode];
34
+ const c = this.#font.chars[charCode];
42
35
  if (!c)
43
36
  continue;
44
37
  const frame = new PixiRectangle(c.x, c.y, c.width, c.height);
45
- const texture = new PixiTexture({ source: font.texture.source, frame });
46
- const sprite = new PixiSprite(texture);
38
+ const texture = new PixiTexture({ source: this.#font.texture.source, frame });
39
+ const sprite = new PixiSprite({ texture, zIndex: -999999 });
47
40
  const x0 = xPos + c.xoffset;
48
41
  const y0 = yPos + c.yoffset;
49
42
  sprite.x = x0;
@@ -69,14 +62,24 @@ export class BitmapTextNode extends GameObject {
69
62
  maxX = 0;
70
63
  maxY = 0;
71
64
  }
72
- const width = maxX - minX;
73
- const height = maxY - minY;
65
+ const cx = (minX + maxX) / 2;
66
+ const cy = (minY + maxY) / 2;
74
67
  for (const s of this.#sprites) {
75
- s.x -= width / 2;
76
- s.y -= height / 2;
68
+ s.x -= cx;
69
+ s.y -= cy;
77
70
  this._pixiContainer.addChild(s);
78
71
  }
79
72
  }
73
+ async #load() {
74
+ if (bitmapFontLoader.checkCached(this.#fnt)) {
75
+ this.#font = bitmapFontLoader.getCached(this.#fnt);
76
+ }
77
+ else {
78
+ console.info(`Bitmap font not preloaded. Loading now: ${this.#fnt}`);
79
+ this.#font = await bitmapFontLoader.load(this.#fnt, this.#src);
80
+ }
81
+ this.#updateText();
82
+ }
80
83
  changeFont(fnt, src) {
81
84
  if (this.#fnt !== fnt || this.#src !== src) {
82
85
  bitmapFontLoader.release(this.#fnt);
@@ -85,6 +88,13 @@ export class BitmapTextNode extends GameObject {
85
88
  this.#load();
86
89
  }
87
90
  }
91
+ set text(text) {
92
+ this.#text = text;
93
+ this.#updateText();
94
+ }
95
+ get text() {
96
+ return this.#text;
97
+ }
88
98
  remove() {
89
99
  bitmapFontLoader.release(this.#fnt);
90
100
  super.remove();
@@ -1 +1 @@
1
- {"version":3,"file":"bitmap-text.js","sourceRoot":"","sources":["../../../src/node/ext/bitmap-text.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Rectangle as PixiRectangle, Sprite as PixiSprite, Texture as PixiTexture } from 'pixi.js'\nimport { bitmapFontLoader } from '../../asset/loaders/bitmap-font'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type BitmapTextNodeOptions = {\n fnt: string\n src: string\n text: string\n} & GameObjectOptions\n\nexport class BitmapTextNode<E extends EventMap = EventMap> extends GameObject<E> {\n #fnt: string\n #src: string\n #text: string\n #sprites: PixiSprite[] = []\n\n constructor(options: BitmapTextNodeOptions) {\n super(options)\n this.#fnt = options.fnt\n this.#src = options.src\n this.#text = options.text\n this.#load()\n }\n\n async #load() {\n let font\n if (bitmapFontLoader.checkCached(this.#fnt)) {\n font = bitmapFontLoader.getCached(this.#fnt)\n } else {\n console.info(`Bitmap font not preloaded. Loading now: ${this.#fnt}`)\n font = await bitmapFontLoader.load(this.#fnt, this.#src)\n }\n if (!font) return\n\n for (const sprite of this.#sprites) {\n sprite.destroy()\n }\n this.#sprites = []\n\n let xPos = 0, yPos = 0\n let minX = Infinity, minY = Infinity\n let maxX = -Infinity, maxY = -Infinity\n\n for (let i = 0; i < this.#text.length; i++) {\n const charCode = this.#text.charCodeAt(i)\n\n if (charCode === 10) {\n xPos = 0\n yPos += font.lineHeight\n continue\n }\n\n const c = font.chars[charCode]\n if (!c) continue\n\n const frame = new PixiRectangle(c.x, c.y, c.width, c.height)\n const texture = new PixiTexture({ source: font.texture.source, frame })\n const sprite = new PixiSprite(texture)\n\n const x0 = xPos + c.xoffset\n const y0 = yPos + c.yoffset\n\n sprite.x = x0\n sprite.y = y0\n\n this.#sprites.push(sprite)\n\n const x1 = x0 + c.width\n const y1 = y0 + c.height\n\n if (x0 < minX) minX = x0\n if (y0 < minY) minY = y0\n if (x1 > maxX) maxX = x1\n if (y1 > maxY) maxY = y1\n\n xPos += c.xadvance\n }\n\n if (minX === Infinity) {\n minX = 0\n minY = 0\n }\n\n if (maxX === -Infinity) {\n maxX = 0\n maxY = 0\n }\n\n const width = maxX - minX\n const height = maxY - minY\n\n for (const s of this.#sprites) {\n s.x -= width / 2\n s.y -= height / 2\n this._pixiContainer.addChild(s)\n }\n }\n\n changeFont(fnt: string, src: string) {\n if (this.#fnt !== fnt || this.#src !== src) {\n bitmapFontLoader.release(this.#fnt)\n this.#fnt = fnt\n this.#src = src\n this.#load()\n }\n }\n\n override remove() {\n bitmapFontLoader.release(this.#fnt)\n super.remove()\n }\n}\n"]}
1
+ {"version":3,"file":"bitmap-text.js","sourceRoot":"","sources":["../../../src/node/ext/bitmap-text.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Rectangle as PixiRectangle, Sprite as PixiSprite, Texture as PixiTexture } from 'pixi.js'\nimport { bitmapFontLoader } from '../../asset/loaders/bitmap-font'\nimport { BitmapFont } from '../../types/bitmap-font'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type BitmapTextNodeOptions = {\n fnt: string\n src: string\n text?: string\n} & GameObjectOptions\n\nexport class BitmapTextNode<E extends EventMap = {}> extends GameObject<E> {\n #fnt: string\n #src: string\n #text?: string\n\n #font?: BitmapFont\n #sprites: PixiSprite[] = []\n\n constructor(options: BitmapTextNodeOptions) {\n super(options)\n this.#fnt = options.fnt\n this.#src = options.src\n this.#text = options.text\n this.#load()\n }\n\n #updateText() {\n for (const sprite of this.#sprites) {\n sprite.destroy()\n }\n this.#sprites = []\n\n if (!this.#font || !this.#text) return\n\n let xPos = 0, yPos = 0\n let minX = Infinity, minY = Infinity\n let maxX = -Infinity, maxY = -Infinity\n\n for (let i = 0; i < this.#text.length; i++) {\n const charCode = this.#text.charCodeAt(i)\n\n if (charCode === 10) {\n xPos = 0\n yPos += this.#font.lineHeight\n continue\n }\n\n const c = this.#font.chars[charCode]\n if (!c) continue\n\n const frame = new PixiRectangle(c.x, c.y, c.width, c.height)\n const texture = new PixiTexture({ source: this.#font.texture.source, frame })\n const sprite = new PixiSprite({ texture, zIndex: -999999 })\n\n const x0 = xPos + c.xoffset\n const y0 = yPos + c.yoffset\n\n sprite.x = x0\n sprite.y = y0\n\n this.#sprites.push(sprite)\n\n const x1 = x0 + c.width\n const y1 = y0 + c.height\n\n if (x0 < minX) minX = x0\n if (y0 < minY) minY = y0\n if (x1 > maxX) maxX = x1\n if (y1 > maxY) maxY = y1\n\n xPos += c.xadvance\n }\n\n if (minX === Infinity) {\n minX = 0\n minY = 0\n }\n\n if (maxX === -Infinity) {\n maxX = 0\n maxY = 0\n }\n\n const cx = (minX + maxX) / 2\n const cy = (minY + maxY) / 2\n\n for (const s of this.#sprites) {\n s.x -= cx\n s.y -= cy\n this._pixiContainer.addChild(s)\n }\n }\n\n async #load() {\n if (bitmapFontLoader.checkCached(this.#fnt)) {\n this.#font = bitmapFontLoader.getCached(this.#fnt)\n } else {\n console.info(`Bitmap font not preloaded. Loading now: ${this.#fnt}`)\n this.#font = await bitmapFontLoader.load(this.#fnt, this.#src)\n }\n\n this.#updateText()\n }\n\n changeFont(fnt: string, src: string) {\n if (this.#fnt !== fnt || this.#src !== src) {\n bitmapFontLoader.release(this.#fnt)\n this.#fnt = fnt\n this.#src = src\n this.#load()\n }\n }\n\n set text(text: string | undefined) {\n this.#text = text\n this.#updateText()\n }\n\n get text() {\n return this.#text\n }\n\n override remove() {\n bitmapFontLoader.release(this.#fnt)\n super.remove()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"spine.js","sourceRoot":"","sources":["../../../src/node/ext/spine.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtlasAttachmentLoader, Spine as PixiSpine, SkeletonBinary, SkeletonJson, Skin, SpineTexture, TextureAtlas } from '@esotericsoftware/spine-pixi-v8'\nimport { EventMap } from '@webtaku/event-emitter'\nimport { Texture } from 'pixi.js'\nimport { binaryLoader } from '../../asset/loaders/binary'\nimport { textLoader } from '../../asset/loaders/text'\nimport { textureLoader } from '../../asset/loaders/texture'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type SpineNodeOptions = {\n atlas: string\n texture: string | Record<string, string>\n\n rawSkeletonData?: any\n skel?: string\n json?: string\n\n skins?: string[]\n animation?: string\n loop?: boolean\n} & GameObjectOptions\n\nexport class SpineNode<E extends EventMap = EventMap> extends GameObject<E & {\n animationend: (animation: string) => void\n}> {\n #atlas: string\n #texture: string | Record<string, string>\n\n #rawSkeletonData?: any\n #skel?: string\n #json?: string\n\n #skins?: string[]\n #animation?: string\n #loop?: boolean\n\n #spine?: PixiSpine\n\n constructor(options: SpineNodeOptions) {\n super(options)\n this.#atlas = options.atlas\n this.#texture = options.texture\n this.#rawSkeletonData = options.rawSkeletonData\n this.#skel = options.skel\n this.#json = options.json\n this.#skins = options.skins\n this.#animation = options.animation\n this.#loop = options.loop\n this.#load()\n }\n\n #buildSkeletonData(\n atlasText: string,\n texture: Texture | undefined,\n textures: Record<string, Texture> | undefined,\n skeletonBinary: Uint8Array | undefined,\n textSkeletonData: string | undefined\n ) {\n if (!atlasText) return undefined\n if (!texture && !textures) return undefined\n if (!this.rawSkeletonData && !skeletonBinary && !textSkeletonData) return undefined\n\n // Create TextureAtlas and bind pages to provided textures\n const atlas = new TextureAtlas(atlasText)\n atlas.pages.forEach((page) => {\n if (texture) {\n page.setTexture(SpineTexture.from(texture.source))\n } else if (textures) {\n const t = textures[page.name]\n if (!t) throw new Error(`Missing texture for atlas page: ${page.name}`)\n page.setTexture(SpineTexture.from(t.source))\n }\n })\n\n const atlasLoader = new AtlasAttachmentLoader(atlas)\n\n // Parse skeleton data depending on available source\n if (this.rawSkeletonData) {\n const jsonLoader = new SkeletonJson(atlasLoader)\n return jsonLoader.readSkeletonData(this.rawSkeletonData)\n }\n if (skeletonBinary) {\n const binLoader = new SkeletonBinary(atlasLoader)\n return binLoader.readSkeletonData(skeletonBinary)\n }\n if (textSkeletonData) {\n const jsonLoader = new SkeletonJson(atlasLoader)\n return jsonLoader.readSkeletonData(textSkeletonData)\n }\n return undefined\n }\n\n #getCachedSkeletonData() {\n try {\n if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined\n if (!textLoader.checkCached(this.#atlas)) return undefined\n\n const atlasText = textLoader.getCached(this.#atlas)!\n\n let texture: Texture | undefined\n let textures: Record<string, Texture> | undefined\n\n if (typeof this.#texture === 'string') {\n if (!textureLoader.checkCached(this.#texture)) return undefined\n texture = textureLoader.getCached(this.#texture)!\n } else if (this.#texture) {\n textures = {}\n for (const [key, path] of Object.entries(this.#texture)) {\n if (!textureLoader.checkCached(path)) return undefined\n textures[key] = textureLoader.getCached(path)!\n }\n } else {\n return undefined\n }\n\n let skeletonBinary: Uint8Array | undefined\n let textSkeletonData: string | undefined\n\n if (!this.#rawSkeletonData) {\n if (this.#skel) {\n if (!binaryLoader.checkCached(this.#skel)) return undefined\n skeletonBinary = binaryLoader.getCached(this.#skel)!\n } else if (this.#json) {\n if (!textLoader.checkCached(this.#json)) return undefined\n textSkeletonData = textLoader.getCached(this.#json)!\n }\n }\n\n return this.#buildSkeletonData(\n atlasText,\n texture,\n textures,\n skeletonBinary,\n textSkeletonData,\n )\n } catch (e) {\n console.error('Failed to build skeleton data from cache:', e)\n return undefined\n }\n }\n\n async #loadSkeletonData() {\n if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined\n\n const promises: Promise<any>[] = []\n\n let atlasText: string | undefined\n let skeletonBinary: Uint8Array | undefined\n let textSkeletonData: string | undefined\n let texture: Texture | undefined\n let textures: Record<string, Texture> | undefined\n\n // Load atlas (text)\n if (!textLoader.checkCached(this.#atlas)) console.info(`Atlas not preloaded. Loading now: ${this.#atlas}`)\n promises.push((async () => (atlasText = await textLoader.load(this.#atlas)))())\n\n // Load skeleton (raw / binary / json)\n if (this.#rawSkeletonData) {\n // already provided\n } else if (this.#skel) {\n if (!binaryLoader.checkCached(this.#skel)) console.info(`Skeleton not preloaded. Loading now: ${this.#skel}`)\n promises.push((async () => (skeletonBinary = await binaryLoader.load(this.#skel!)))())\n } else if (this.#json) {\n if (!textLoader.checkCached(this.#json)) console.info(`Skeleton not preloaded. Loading now: ${this.#json}`)\n promises.push((async () => (textSkeletonData = await textLoader.load(this.#json!)))())\n } else {\n console.error('Either skel or json must be provided')\n return undefined\n }\n\n // Load textures (single or multiple)\n if (typeof this.#texture === 'string') {\n if (!textureLoader.checkCached(this.#texture)) console.info(`Texture not preloaded. Loading now: ${this.#texture}`)\n promises.push((async () => (texture = await textureLoader.load(this.#texture as string)))())\n } else if (this.#texture) {\n textures = {}\n for (const [key, path] of Object.entries(this.#texture)) {\n if (!textureLoader.checkCached(path)) console.info(`Texture not preloaded. Loading now: ${path}`)\n promises.push((async () => {\n const t = await textureLoader.load(path)\n if (t) textures![key] = t\n })())\n }\n }\n\n await Promise.all(promises)\n\n if (!atlasText) return undefined\n if (!texture && !(textures && Object.keys(textures).length)) return undefined\n\n return this.#buildSkeletonData(\n atlasText,\n texture,\n textures,\n skeletonBinary,\n textSkeletonData,\n )\n }\n\n async #load() {\n let skeletonData = this.#getCachedSkeletonData()\n if (!skeletonData) {\n skeletonData = await this.#loadSkeletonData()\n }\n\n this.#spine?.destroy()\n this.#spine = undefined\n\n if (skeletonData) {\n const s = new PixiSpine(skeletonData)\n s.state.addListener({\n complete: (e) => (this as any).emit('animationend', e.animation?.name ?? '')\n })\n this.#spine = s\n this.#updateAnimation()\n this.#updateSkins()\n this._pixiContainer.addChild(s)\n }\n }\n\n #updateSkins() {\n const s = this.#spine?.skeleton\n if (s && this.#skins) {\n const newSkin = new Skin('combined-skin')\n for (const skinName of this.#skins) {\n const skin = s.data.findSkin(skinName)\n if (skin) newSkin.addSkin(skin)\n }\n s.setSkin(newSkin)\n s.setSlotsToSetupPose()\n }\n }\n\n #updateAnimation() {\n const s = this.#spine\n if (s && this.#animation) {\n s.state.setAnimation(0, this.#animation, this.#loop ?? true)\n s.state.apply(s.skeleton)\n }\n }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set texture(texture) {\n if (this.#texture !== texture) {\n this.#texture = texture\n this.#load()\n }\n }\n\n get texture() { return this.#texture }\n\n set rawSkeletonData(rawSkeletonData) {\n if (this.#rawSkeletonData !== rawSkeletonData) {\n this.#rawSkeletonData = rawSkeletonData\n this.#load()\n }\n }\n\n get rawSkeletonData() { return this.#rawSkeletonData }\n\n set skel(skel) {\n if (this.#skel !== skel) {\n this.#skel = skel\n this.#load()\n }\n }\n\n get skel() { return this.#skel }\n\n set json(json) {\n if (this.#json !== json) {\n this.#json = json\n this.#load()\n }\n }\n\n get json() { return this.#json }\n\n set skins(skins) {\n if (this.#skins !== skins) {\n this.#skins = skins\n this.#updateSkins()\n }\n }\n\n get skins() { return this.#skins }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#updateAnimation()\n }\n }\n\n get animation() { return this.#animation }\n\n set loop(loop) {\n if (this.#loop !== loop) {\n this.#loop = loop\n this.#updateAnimation()\n }\n }\n\n get loop() { return this.#loop }\n\n remove() {\n if (typeof this.#texture === 'string') {\n textureLoader.release(this.#texture)\n } else if (this.#texture) {\n for (const path of Object.values(this.#texture)) {\n textureLoader.release(path)\n }\n }\n super.remove()\n }\n}\n"]}
1
+ {"version":3,"file":"spine.js","sourceRoot":"","sources":["../../../src/node/ext/spine.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtlasAttachmentLoader, Spine as PixiSpine, SkeletonBinary, SkeletonJson, Skin, SpineTexture, TextureAtlas } from '@esotericsoftware/spine-pixi-v8'\nimport { EventMap } from '@webtaku/event-emitter'\nimport { Texture } from 'pixi.js'\nimport { binaryLoader } from '../../asset/loaders/binary'\nimport { textLoader } from '../../asset/loaders/text'\nimport { textureLoader } from '../../asset/loaders/texture'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type SpineNodeOptions = {\n atlas: string\n texture: string | Record<string, string>\n\n rawSkeletonData?: any\n skel?: string\n json?: string\n\n skins?: string[]\n animation?: string\n loop?: boolean\n} & GameObjectOptions\n\nexport class SpineNode<E extends EventMap = {}> extends GameObject<E & {\n animationend: (animation: string) => void\n}> {\n #atlas: string\n #texture: string | Record<string, string>\n\n #rawSkeletonData?: any\n #skel?: string\n #json?: string\n\n #skins?: string[]\n #animation?: string\n #loop?: boolean\n\n #spine?: PixiSpine\n\n constructor(options: SpineNodeOptions) {\n super(options)\n this.#atlas = options.atlas\n this.#texture = options.texture\n this.#rawSkeletonData = options.rawSkeletonData\n this.#skel = options.skel\n this.#json = options.json\n this.#skins = options.skins\n this.#animation = options.animation\n this.#loop = options.loop\n this.#load()\n }\n\n #buildSkeletonData(\n atlasText: string,\n texture: Texture | undefined,\n textures: Record<string, Texture> | undefined,\n skeletonBinary: Uint8Array | undefined,\n textSkeletonData: string | undefined\n ) {\n if (!atlasText) return undefined\n if (!texture && !textures) return undefined\n if (!this.rawSkeletonData && !skeletonBinary && !textSkeletonData) return undefined\n\n // Create TextureAtlas and bind pages to provided textures\n const atlas = new TextureAtlas(atlasText)\n atlas.pages.forEach((page) => {\n if (texture) {\n page.setTexture(SpineTexture.from(texture.source))\n } else if (textures) {\n const t = textures[page.name]\n if (!t) throw new Error(`Missing texture for atlas page: ${page.name}`)\n page.setTexture(SpineTexture.from(t.source))\n }\n })\n\n const atlasLoader = new AtlasAttachmentLoader(atlas)\n\n // Parse skeleton data depending on available source\n if (this.rawSkeletonData) {\n const jsonLoader = new SkeletonJson(atlasLoader)\n return jsonLoader.readSkeletonData(this.rawSkeletonData)\n }\n if (skeletonBinary) {\n const binLoader = new SkeletonBinary(atlasLoader)\n return binLoader.readSkeletonData(skeletonBinary)\n }\n if (textSkeletonData) {\n const jsonLoader = new SkeletonJson(atlasLoader)\n return jsonLoader.readSkeletonData(textSkeletonData)\n }\n return undefined\n }\n\n #getCachedSkeletonData() {\n try {\n if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined\n if (!textLoader.checkCached(this.#atlas)) return undefined\n\n const atlasText = textLoader.getCached(this.#atlas)!\n\n let texture: Texture | undefined\n let textures: Record<string, Texture> | undefined\n\n if (typeof this.#texture === 'string') {\n if (!textureLoader.checkCached(this.#texture)) return undefined\n texture = textureLoader.getCached(this.#texture)!\n } else if (this.#texture) {\n textures = {}\n for (const [key, path] of Object.entries(this.#texture)) {\n if (!textureLoader.checkCached(path)) return undefined\n textures[key] = textureLoader.getCached(path)!\n }\n } else {\n return undefined\n }\n\n let skeletonBinary: Uint8Array | undefined\n let textSkeletonData: string | undefined\n\n if (!this.#rawSkeletonData) {\n if (this.#skel) {\n if (!binaryLoader.checkCached(this.#skel)) return undefined\n skeletonBinary = binaryLoader.getCached(this.#skel)!\n } else if (this.#json) {\n if (!textLoader.checkCached(this.#json)) return undefined\n textSkeletonData = textLoader.getCached(this.#json)!\n }\n }\n\n return this.#buildSkeletonData(\n atlasText,\n texture,\n textures,\n skeletonBinary,\n textSkeletonData,\n )\n } catch (e) {\n console.error('Failed to build skeleton data from cache:', e)\n return undefined\n }\n }\n\n async #loadSkeletonData() {\n if (!this.#rawSkeletonData && !this.#skel && !this.#json) return undefined\n\n const promises: Promise<any>[] = []\n\n let atlasText: string | undefined\n let skeletonBinary: Uint8Array | undefined\n let textSkeletonData: string | undefined\n let texture: Texture | undefined\n let textures: Record<string, Texture> | undefined\n\n // Load atlas (text)\n if (!textLoader.checkCached(this.#atlas)) console.info(`Atlas not preloaded. Loading now: ${this.#atlas}`)\n promises.push((async () => (atlasText = await textLoader.load(this.#atlas)))())\n\n // Load skeleton (raw / binary / json)\n if (this.#rawSkeletonData) {\n // already provided\n } else if (this.#skel) {\n if (!binaryLoader.checkCached(this.#skel)) console.info(`Skeleton not preloaded. Loading now: ${this.#skel}`)\n promises.push((async () => (skeletonBinary = await binaryLoader.load(this.#skel!)))())\n } else if (this.#json) {\n if (!textLoader.checkCached(this.#json)) console.info(`Skeleton not preloaded. Loading now: ${this.#json}`)\n promises.push((async () => (textSkeletonData = await textLoader.load(this.#json!)))())\n } else {\n console.error('Either skel or json must be provided')\n return undefined\n }\n\n // Load textures (single or multiple)\n if (typeof this.#texture === 'string') {\n if (!textureLoader.checkCached(this.#texture)) console.info(`Texture not preloaded. Loading now: ${this.#texture}`)\n promises.push((async () => (texture = await textureLoader.load(this.#texture as string)))())\n } else if (this.#texture) {\n textures = {}\n for (const [key, path] of Object.entries(this.#texture)) {\n if (!textureLoader.checkCached(path)) console.info(`Texture not preloaded. Loading now: ${path}`)\n promises.push((async () => {\n const t = await textureLoader.load(path)\n if (t) textures![key] = t\n })())\n }\n }\n\n await Promise.all(promises)\n\n if (!atlasText) return undefined\n if (!texture && !(textures && Object.keys(textures).length)) return undefined\n\n return this.#buildSkeletonData(\n atlasText,\n texture,\n textures,\n skeletonBinary,\n textSkeletonData,\n )\n }\n\n async #load() {\n let skeletonData = this.#getCachedSkeletonData()\n if (!skeletonData) {\n skeletonData = await this.#loadSkeletonData()\n }\n\n this.#spine?.destroy()\n this.#spine = undefined\n\n if (skeletonData) {\n const s = new PixiSpine(skeletonData)\n s.state.addListener({\n complete: (e) => (this as any).emit('animationend', e.animation?.name ?? '')\n })\n this.#spine = s\n this.#updateAnimation()\n this.#updateSkins()\n this._pixiContainer.addChild(s)\n }\n }\n\n #updateSkins() {\n const s = this.#spine?.skeleton\n if (s && this.#skins) {\n const newSkin = new Skin('combined-skin')\n for (const skinName of this.#skins) {\n const skin = s.data.findSkin(skinName)\n if (skin) newSkin.addSkin(skin)\n }\n s.setSkin(newSkin)\n s.setSlotsToSetupPose()\n }\n }\n\n #updateAnimation() {\n const s = this.#spine\n if (s && this.#animation) {\n s.state.setAnimation(0, this.#animation, this.#loop ?? true)\n s.state.apply(s.skeleton)\n }\n }\n\n set atlas(atlas) {\n if (this.#atlas !== atlas) {\n this.#atlas = atlas\n this.#load()\n }\n }\n\n get atlas() { return this.#atlas }\n\n set texture(texture) {\n if (this.#texture !== texture) {\n this.#texture = texture\n this.#load()\n }\n }\n\n get texture() { return this.#texture }\n\n set rawSkeletonData(rawSkeletonData) {\n if (this.#rawSkeletonData !== rawSkeletonData) {\n this.#rawSkeletonData = rawSkeletonData\n this.#load()\n }\n }\n\n get rawSkeletonData() { return this.#rawSkeletonData }\n\n set skel(skel) {\n if (this.#skel !== skel) {\n this.#skel = skel\n this.#load()\n }\n }\n\n get skel() { return this.#skel }\n\n set json(json) {\n if (this.#json !== json) {\n this.#json = json\n this.#load()\n }\n }\n\n get json() { return this.#json }\n\n set skins(skins) {\n if (this.#skins !== skins) {\n this.#skins = skins\n this.#updateSkins()\n }\n }\n\n get skins() { return this.#skins }\n\n set animation(animation) {\n if (this.#animation !== animation) {\n this.#animation = animation\n this.#updateAnimation()\n }\n }\n\n get animation() { return this.#animation }\n\n set loop(loop) {\n if (this.#loop !== loop) {\n this.#loop = loop\n this.#updateAnimation()\n }\n }\n\n get loop() { return this.#loop }\n\n remove() {\n if (typeof this.#texture === 'string') {\n textureLoader.release(this.#texture)\n } else if (this.#texture) {\n for (const path of Object.values(this.#texture)) {\n textureLoader.release(path)\n }\n }\n super.remove()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sprite.js","sourceRoot":"","sources":["../../../src/node/ext/sprite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAA;AAMnE,MAAM,OAAO,UAA0C,SAAQ,UAAa;IAC1E,IAAI,CAAQ;IACZ,OAAO,CAAa;IAEpB,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAChE,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAExB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;YACnE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAErB,MAAM;QACb,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Sprite as PixiSprite } from 'pixi.js'\nimport { textureLoader } from '../../asset/loaders/texture'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type SpriteNodeOptions = {\n src: string\n} & GameObjectOptions\n\nexport class SpriteNode<E extends EventMap = EventMap> extends GameObject<E> {\n #src: string\n #sprite?: PixiSprite\n\n constructor(options: SpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#load()\n }\n\n async #load() {\n let texture\n if (textureLoader.checkCached(this.#src)) {\n texture = textureLoader.getCached(this.#src)\n } else {\n console.info(`Texture not preloaded. Loading now: ${this.#src}`)\n texture = await textureLoader.load(this.#src)\n }\n\n this.#sprite?.destroy()\n this.#sprite = undefined\n\n if (texture) {\n const s = new PixiSprite({ texture, anchor: 0.5, zIndex: -999999 })\n this._pixiContainer.addChild(s)\n this.#sprite = s\n }\n }\n\n set src(src) {\n if (this.#src !== src) {\n textureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n override remove() {\n textureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
1
+ {"version":3,"file":"sprite.js","sourceRoot":"","sources":["../../../src/node/ext/sprite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAA;AAMnE,MAAM,OAAO,UAAoC,SAAQ,UAAa;IACpE,IAAI,CAAQ;IACZ,OAAO,CAAa;IAEpB,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,CAAA;QACX,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAChE,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAExB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;YACnE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,GAAG;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAA,CAAC,CAAC;IAErB,MAAM;QACb,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { Sprite as PixiSprite } from 'pixi.js'\nimport { textureLoader } from '../../asset/loaders/texture'\nimport { GameObject, GameObjectOptions } from '../core/game-object'\n\nexport type SpriteNodeOptions = {\n src: string\n} & GameObjectOptions\n\nexport class SpriteNode<E extends EventMap = {}> extends GameObject<E> {\n #src: string\n #sprite?: PixiSprite\n\n constructor(options: SpriteNodeOptions) {\n super(options)\n this.#src = options.src\n this.#load()\n }\n\n async #load() {\n let texture\n if (textureLoader.checkCached(this.#src)) {\n texture = textureLoader.getCached(this.#src)\n } else {\n console.info(`Texture not preloaded. Loading now: ${this.#src}`)\n texture = await textureLoader.load(this.#src)\n }\n\n this.#sprite?.destroy()\n this.#sprite = undefined\n\n if (texture) {\n const s = new PixiSprite({ texture, anchor: 0.5, zIndex: -999999 })\n this._pixiContainer.addChild(s)\n this.#sprite = s\n }\n }\n\n set src(src) {\n if (this.#src !== src) {\n textureLoader.release(this.#src)\n this.#src = src\n this.#load()\n }\n }\n\n get src() { return this.#src }\n\n override remove() {\n textureLoader.release(this.#src)\n super.remove()\n }\n}\n"]}
@@ -8,6 +8,7 @@ export class PhysicsObject extends RenderableNode {
8
8
  #localTransform = new LocalTransform();
9
9
  #matterBody;
10
10
  #useYSort = false;
11
+ #collisionsEnabled = true;
11
12
  constructor(options) {
12
13
  super(new PixiContainer({ sortableChildren: true }));
13
14
  const r = options.rigidbody;
@@ -43,7 +44,8 @@ export class PhysicsObject extends RenderableNode {
43
44
  : parent.constructor?.name ?? typeof parent;
44
45
  throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`);
45
46
  }
46
- parent.addBody(this.#matterBody);
47
+ if (this.#collisionsEnabled)
48
+ parent.addBody(this.#matterBody);
47
49
  super.parent = parent;
48
50
  }
49
51
  get parent() {
@@ -86,7 +88,12 @@ export class PhysicsObject extends RenderableNode {
86
88
  set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v); }
87
89
  get isStatic() { return this.#matterBody.isStatic; }
88
90
  disableCollisions() {
91
+ this.#collisionsEnabled = false;
89
92
  this.#removeFromWorld();
90
93
  }
94
+ enableCollisions() {
95
+ this.#collisionsEnabled = true;
96
+ this.parent?.addBody(this.#matterBody);
97
+ }
91
98
  }
92
99
  //# sourceMappingURL=physics-object.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"physics-object.js","sourceRoot":"","sources":["../../../src/node/physics/physics-object.ts"],"names":[],"mappings":"AACA,OAAO,MAAsC,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AAEpD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAa,aAAa,EAAE,MAAM,eAAe,CAAA;AAgBxD,MAAM,OAAO,aAA6C,SAAQ,cAAgC;IAChG,eAAe,GAAG,IAAI,cAAc,EAAE,CAAA;IACtC,WAAW,CAAa;IAExB,SAAS,GAAG,KAAK,CAAA;IAEjB,YAAY,OAA6B;QACvC,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAEpD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAA;QAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;QACxB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;QAExB,MAAM,WAAW,GAA+B;YAC9C,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;YAC5B,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE;YAClE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;SACpC,CAAA;QAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;YAC9B,WAAW,CAAC,eAAe,GAAG,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAClF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACtE,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAA;QAChF,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAC3C,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAA;IAC5C,CAAC;IAED,IAAuB,MAAM,CAAC,MAAsC;QAClE,IAAI,CAAC,CAAC,MAAM,YAAY,YAAY,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS;gBACjC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,OAAO,MAAM,CAAA;YAC7C,MAAM,IAAI,KAAK,CAAC,sDAAsD,MAAM,EAAE,CAAC,CAAA;QACjF,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAuB,MAAM;QAC3B,OAAO,KAAK,CAAC,MAAM,CAAA;IACrB,CAAC;IAEQ,qBAAqB;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAA;QAE3B,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAA;QAC9B,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,IAAI,CAAC,SAAS;YAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7C,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAA;QAEtB,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;QAC/B,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpB,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAA;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;QACzE,CAAC;QAED,KAAK,CAAC,qBAAqB,EAAE,CAAA;IAC/B,CAAC;IAED,gBAAgB;QACb,IAAI,CAAC,MAAuB,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC7D,CAAC;IAEQ,MAAM;QACb,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACvB,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;IAED,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC;IAChG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC,CAAC;IAE9C,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC;IAChG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC,CAAC;IAE9C,IAAI,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;IAC7D,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA,CAAC,CAAC;IAEhD,IAAI,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC;IACxG,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC,CAAC;IAEtD,IAAI,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC;IACxG,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;IAC9D,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAA,CAAC,CAAC;IAEnD,iBAAiB;QACf,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport Matter, { IChamferableBodyDefinition } from 'matter-js'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { GameNode } from '../core/game-node'\nimport { isRenderableNode, RenderableNode } from '../core/renderable'\nimport { LocalTransform } from '../core/transform'\nimport { PhysicsWorld } from './physics-world'\nimport { Rigidbody, RigidbodyType } from './rigidbodies'\n\nexport type PhysicsObjectOptions = {\n rigidbody: Rigidbody\n\n x?: number\n y?: number\n rotation?: number\n fixedRotation?: boolean\n velocityX?: number\n velocityY?: number\n isStatic?: boolean\n\n useYSort?: boolean\n}\n\nexport class PhysicsObject<E extends EventMap = EventMap> extends RenderableNode<PixiContainer, E> {\n #localTransform = new LocalTransform()\n #matterBody: Matter.Body\n\n #useYSort = false\n\n constructor(options: PhysicsObjectOptions) {\n super(new PixiContainer({ sortableChildren: true }))\n\n const r = options.rigidbody\n const x = options.x ?? 0\n const y = options.y ?? 0\n\n const bodyOptions: IChamferableBodyDefinition = {\n angle: options.rotation ?? 0,\n velocity: { x: options.velocityX ?? 0, y: options.velocityY ?? 0 },\n isStatic: options.isStatic ?? false\n }\n\n if (options.fixedRotation) {\n bodyOptions.inertia = Infinity\n bodyOptions.angularVelocity = 0\n }\n\n if (r.type === RigidbodyType.Rectangle) {\n this.#matterBody = Matter.Bodies.rectangle(x, y, r.width, r.height, bodyOptions)\n } else if (r.type === RigidbodyType.Circle) {\n this.#matterBody = Matter.Bodies.circle(x, y, r.radius, bodyOptions)\n } else if (r.type === RigidbodyType.Polygon) {\n this.#matterBody = Matter.Bodies.fromVertices(x, y, [r.vertices], bodyOptions)\n } else {\n throw new Error('Invalid rigidbody type')\n }\n\n this.#useYSort = options.useYSort ?? false\n }\n\n protected override set parent(parent: GameNode<EventMap> | undefined) {\n if (!(parent instanceof PhysicsWorld)) {\n const actual = parent === undefined\n ? 'undefined'\n : parent.constructor?.name ?? typeof parent\n throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`)\n }\n parent.addBody(this.#matterBody)\n super.parent = parent\n }\n\n protected override get parent() {\n return super.parent\n }\n\n override _updateWorldTransform() {\n const mb = this.#matterBody\n\n const pc = this._pixiContainer\n pc.position.set(mb.position.x, mb.position.y)\n if (this.#useYSort) pc.zIndex = mb.position.y\n pc.rotation = mb.angle\n\n const lt = this.#localTransform\n lt.x = mb.position.x\n lt.y = mb.position.y\n lt.rotation = mb.angle\n\n const parent = this.parent\n if (parent && isRenderableNode(parent)) {\n this.worldTransform.update(parent.worldTransform, this.#localTransform)\n }\n\n super._updateWorldTransform()\n }\n\n #removeFromWorld() {\n (this.parent as PhysicsWorld)?.removeBody(this.#matterBody)\n }\n\n override remove() {\n this.#removeFromWorld()\n super.remove()\n }\n\n set x(v) { Matter.Body.setPosition(this.#matterBody, { x: v, y: this.#matterBody.position.y }) }\n get x() { return this.#matterBody.position.x }\n\n set y(v) { Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: v }) }\n get y() { return this.#matterBody.position.y }\n\n set rotation(v) { Matter.Body.setAngle(this.#matterBody, v) }\n get rotation() { return this.#matterBody.angle }\n\n set velocityX(v) { Matter.Body.setVelocity(this.#matterBody, { x: v, y: this.#matterBody.velocity.y }) }\n get velocityX() { return this.#matterBody.velocity.x }\n\n set velocityY(v) { Matter.Body.setVelocity(this.#matterBody, { x: this.#matterBody.velocity.x, y: v }) }\n get velocityY() { return this.#matterBody.velocity.y }\n\n set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v) }\n get isStatic() { return this.#matterBody.isStatic }\n\n disableCollisions() {\n this.#removeFromWorld()\n }\n}\n"]}
1
+ {"version":3,"file":"physics-object.js","sourceRoot":"","sources":["../../../src/node/physics/physics-object.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport Matter, { IChamferableBodyDefinition } from 'matter-js'\nimport { Container as PixiContainer } from 'pixi.js'\nimport { GameNode } from '../core/game-node'\nimport { isRenderableNode, RenderableNode } from '../core/renderable'\nimport { LocalTransform } from '../core/transform'\nimport { PhysicsWorld } from './physics-world'\nimport { Rigidbody, RigidbodyType } from './rigidbodies'\n\nexport type PhysicsObjectOptions = {\n rigidbody: Rigidbody\n\n x?: number\n y?: number\n rotation?: number\n fixedRotation?: boolean\n velocityX?: number\n velocityY?: number\n isStatic?: boolean\n\n useYSort?: boolean\n}\n\nexport class PhysicsObject<E extends EventMap = {}> extends RenderableNode<PixiContainer, E> {\n #localTransform = new LocalTransform()\n #matterBody: Matter.Body\n\n #useYSort = false\n #collisionsEnabled = true\n\n constructor(options: PhysicsObjectOptions) {\n super(new PixiContainer({ sortableChildren: true }))\n\n const r = options.rigidbody\n const x = options.x ?? 0\n const y = options.y ?? 0\n\n const bodyOptions: IChamferableBodyDefinition = {\n angle: options.rotation ?? 0,\n velocity: { x: options.velocityX ?? 0, y: options.velocityY ?? 0 },\n isStatic: options.isStatic ?? false\n }\n\n if (options.fixedRotation) {\n bodyOptions.inertia = Infinity\n bodyOptions.angularVelocity = 0\n }\n\n if (r.type === RigidbodyType.Rectangle) {\n this.#matterBody = Matter.Bodies.rectangle(x, y, r.width, r.height, bodyOptions)\n } else if (r.type === RigidbodyType.Circle) {\n this.#matterBody = Matter.Bodies.circle(x, y, r.radius, bodyOptions)\n } else if (r.type === RigidbodyType.Polygon) {\n this.#matterBody = Matter.Bodies.fromVertices(x, y, [r.vertices], bodyOptions)\n } else {\n throw new Error('Invalid rigidbody type')\n }\n\n this.#useYSort = options.useYSort ?? false\n }\n\n protected override set parent(parent: GameNode<EventMap> | undefined) {\n if (!(parent instanceof PhysicsWorld)) {\n const actual = parent === undefined\n ? 'undefined'\n : parent.constructor?.name ?? typeof parent\n throw new Error(`PhysicsObject parent must be PhysicsWorld, but got ${actual}`)\n }\n if (this.#collisionsEnabled) parent.addBody(this.#matterBody)\n super.parent = parent\n }\n\n protected override get parent() {\n return super.parent\n }\n\n override _updateWorldTransform() {\n const mb = this.#matterBody\n\n const pc = this._pixiContainer\n pc.position.set(mb.position.x, mb.position.y)\n if (this.#useYSort) pc.zIndex = mb.position.y\n pc.rotation = mb.angle\n\n const lt = this.#localTransform\n lt.x = mb.position.x\n lt.y = mb.position.y\n lt.rotation = mb.angle\n\n const parent = this.parent\n if (parent && isRenderableNode(parent)) {\n this.worldTransform.update(parent.worldTransform, this.#localTransform)\n }\n\n super._updateWorldTransform()\n }\n\n #removeFromWorld() {\n (this.parent as PhysicsWorld)?.removeBody(this.#matterBody)\n }\n\n override remove() {\n this.#removeFromWorld()\n super.remove()\n }\n\n set x(v) { Matter.Body.setPosition(this.#matterBody, { x: v, y: this.#matterBody.position.y }) }\n get x() { return this.#matterBody.position.x }\n\n set y(v) { Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: v }) }\n get y() { return this.#matterBody.position.y }\n\n set rotation(v) { Matter.Body.setAngle(this.#matterBody, v) }\n get rotation() { return this.#matterBody.angle }\n\n set velocityX(v) { Matter.Body.setVelocity(this.#matterBody, { x: v, y: this.#matterBody.velocity.y }) }\n get velocityX() { return this.#matterBody.velocity.x }\n\n set velocityY(v) { Matter.Body.setVelocity(this.#matterBody, { x: this.#matterBody.velocity.x, y: v }) }\n get velocityY() { return this.#matterBody.velocity.y }\n\n set isStatic(v) { Matter.Body.setStatic(this.#matterBody, v) }\n get isStatic() { return this.#matterBody.isStatic }\n\n disableCollisions() {\n this.#collisionsEnabled = false\n this.#removeFromWorld()\n }\n\n enableCollisions() {\n this.#collisionsEnabled = true;\n (this.parent as PhysicsWorld)?.addBody(this.#matterBody)\n }\n}\n"]}