kiwiengine 0.5.20 → 0.6.0

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.
@@ -0,0 +1,10 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(find:*)",
5
+ "Bash(npm run build:*)",
6
+ "Bash(npm run)",
7
+ "Bash(npx tsc --noEmit)"
8
+ ]
9
+ }
10
+ }
@@ -3,6 +3,7 @@ export class GameNode extends EventEmitter {
3
3
  #parent;
4
4
  children = [];
5
5
  paused = false;
6
+ timeScale = 1;
6
7
  set parent(parent) {
7
8
  this.#parent = parent;
8
9
  }
@@ -53,11 +54,12 @@ export class GameNode extends EventEmitter {
53
54
  update(dt) {
54
55
  if (this.paused)
55
56
  return;
57
+ const scaledDt = dt * this.timeScale;
56
58
  for (const child of this.children) {
57
59
  if (!child.paused)
58
- child.update(dt);
60
+ child.update(scaledDt);
59
61
  }
60
- this.emit('update', dt);
62
+ this.emit('update', scaledDt);
61
63
  }
62
64
  }
63
65
  //# sourceMappingURL=game-node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-node.js","sourceRoot":"","sources":["../../../src/node/core/game-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAY,MAAM,wBAAwB,CAAA;AAE/D,MAAM,OAAgB,QAA6B,SAAQ,YAEzD;IACA,OAAO,CAAqB;IAClB,QAAQ,GAAyB,EAAE,CAAC;IAC9C,MAAM,GAAG,KAAK,CAAA;IAEd,IAAc,MAAM,CAAC,MAAsC;QACzD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,GAAG,CAAC,GAAG,QAA8B;QACnC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAE7B,cAAc;YACd,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBACjD,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC;YAED,YAAY;YACZ,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAEQ,MAAM;QACb,KAAK,CAAC,MAAM,EAAE,CAAA;QAEd,WAAW;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAC1B,CAAC;QAED,WAAW;QACX,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAA;YACxB,KAAK,CAAC,MAAM,EAAE,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAES,MAAM,CAAC,EAAU;QACzB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QAEvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrC,CAAC;QAEA,IAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAClC,CAAC;CACF","sourcesContent":["import { EventEmitter, EventMap } from '@webtaku/event-emitter'\n\nexport abstract class GameNode<E extends EventMap> extends EventEmitter<E & {\n update: (dt: number) => void\n}> {\n #parent?: GameNode<EventMap>\n protected children: GameNode<EventMap>[] = [];\n paused = false\n\n protected set parent(parent: GameNode<EventMap> | undefined) {\n this.#parent = parent\n }\n\n protected get parent() {\n return this.#parent\n }\n\n add(...children: GameNode<EventMap>[]) {\n for (const child of children) {\n\n // 기존 부모로부터 제거\n if (child.#parent) {\n const idx = child.#parent.children.indexOf(child)\n if (idx !== -1) child.#parent.children.splice(idx, 1)\n }\n\n // 새로운 부모 설정\n child.parent = this\n this.children.push(child)\n }\n }\n\n override remove() {\n super.remove()\n\n // 부모로부터 제거\n if (this.#parent) {\n const idx = this.#parent.children.indexOf(this)\n if (idx !== -1) this.#parent.children.splice(idx, 1)\n this.#parent = undefined\n }\n\n // 자식 노드 제거\n for (const child of this.children) {\n child.parent = undefined\n child.remove()\n }\n this.children.length = 0\n }\n\n pause() {\n this.paused = true\n for (const child of this.children) {\n child.pause()\n }\n }\n\n resume() {\n this.paused = false\n for (const child of this.children) {\n child.resume()\n }\n }\n\n protected update(dt: number) {\n if (this.paused) return\n\n for (const child of this.children) {\n if (!child.paused) child.update(dt)\n }\n\n (this as any).emit('update', dt)\n }\n}\n"]}
1
+ {"version":3,"file":"game-node.js","sourceRoot":"","sources":["../../../src/node/core/game-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAY,MAAM,wBAAwB,CAAA;AAE/D,MAAM,OAAgB,QAAkC,SAAQ,YAE9D;IACA,OAAO,CAAqB;IAClB,QAAQ,GAAyB,EAAE,CAAC;IAC9C,MAAM,GAAG,KAAK,CAAA;IACd,SAAS,GAAG,CAAC,CAAA;IAEb,IAAc,MAAM,CAAC,MAAsC;QACzD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,GAAG,CAAC,GAAG,QAA8B;QACnC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAE7B,cAAc;YACd,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBACjD,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC;YAED,YAAY;YACZ,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAEQ,MAAM;QACb,KAAK,CAAC,MAAM,EAAE,CAAA;QAEd,WAAW;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAC1B,CAAC;QAED,WAAW;QACX,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAA;YACxB,KAAK,CAAC,MAAM,EAAE,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAES,MAAM,CAAC,EAAU;QACzB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QAEvB,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;QAEpC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC3C,CAAC;QAEA,IAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;CACF","sourcesContent":["import { EventEmitter, EventMap } from '@webtaku/event-emitter'\n\nexport abstract class GameNode<E extends EventMap = {}> extends EventEmitter<E & {\n update: (dt: number) => void\n}> {\n #parent?: GameNode<EventMap>\n protected children: GameNode<EventMap>[] = [];\n paused = false\n timeScale = 1\n\n protected set parent(parent: GameNode<EventMap> | undefined) {\n this.#parent = parent\n }\n\n protected get parent() {\n return this.#parent\n }\n\n add(...children: GameNode<EventMap>[]) {\n for (const child of children) {\n\n // 기존 부모로부터 제거\n if (child.#parent) {\n const idx = child.#parent.children.indexOf(child)\n if (idx !== -1) child.#parent.children.splice(idx, 1)\n }\n\n // 새로운 부모 설정\n child.parent = this\n this.children.push(child)\n }\n }\n\n override remove() {\n super.remove()\n\n // 부모로부터 제거\n if (this.#parent) {\n const idx = this.#parent.children.indexOf(this)\n if (idx !== -1) this.#parent.children.splice(idx, 1)\n this.#parent = undefined\n }\n\n // 자식 노드 제거\n for (const child of this.children) {\n child.parent = undefined\n child.remove()\n }\n this.children.length = 0\n }\n\n pause() {\n this.paused = true\n for (const child of this.children) {\n child.pause()\n }\n }\n\n resume() {\n this.paused = false\n for (const child of this.children) {\n child.resume()\n }\n }\n\n protected update(dt: number) {\n if (this.paused) return\n\n const scaledDt = dt * this.timeScale\n\n for (const child of this.children) {\n if (!child.paused) child.update(scaledDt)\n }\n\n (this as any).emit('update', scaledDt)\n }\n}\n"]}
@@ -8,6 +8,7 @@ export class AnimatedSpriteNode extends GameObject {
8
8
  #atlasId;
9
9
  #sheet;
10
10
  #sprite;
11
+ #baseFps = 60;
11
12
  constructor(options) {
12
13
  super(options);
13
14
  this.#src = options.src;
@@ -40,7 +41,8 @@ export class AnimatedSpriteNode extends GameObject {
40
41
  s.anchor.set(0.5, 0.5);
41
42
  s.zIndex = -999999;
42
43
  s.loop = a.loop;
43
- s.animationSpeed = a.fps / 60;
44
+ this.#baseFps = a.fps;
45
+ s.animationSpeed = (a.fps / 60) * this.timeScale;
44
46
  s.play();
45
47
  s.onLoop = () => this.emit('animationend', this.#animation);
46
48
  s.onComplete = () => this.emit('animationend', this.#animation);
@@ -70,6 +72,12 @@ export class AnimatedSpriteNode extends GameObject {
70
72
  }
71
73
  }
72
74
  get animation() { return this.#animation; }
75
+ update(dt) {
76
+ super.update(dt);
77
+ if (this.#sprite) {
78
+ this.#sprite.animationSpeed = (this.#baseFps / 60) * this.timeScale;
79
+ }
80
+ }
73
81
  remove() {
74
82
  spritesheetLoader.release(this.#atlasId);
75
83
  super.remove();
@@ -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 = {}> 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 override 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 #baseFps = 60\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 this.#baseFps = a.fps\n s.animationSpeed = (a.fps / 60) * this.timeScale\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 protected override update(dt: number) {\n super.update(dt)\n if (this.#sprite) {\n this.#sprite.animationSpeed = (this.#baseFps / 60) * this.timeScale\n }\n }\n\n override remove() {\n spritesheetLoader.release(this.#atlasId)\n super.remove()\n }\n}\n"]}
@@ -172,6 +172,7 @@ export class SpineNode extends GameObject {
172
172
  this.#spine = undefined;
173
173
  if (skeletonData) {
174
174
  const s = new PixiSpine(skeletonData);
175
+ s.autoUpdate = false;
175
176
  s.state.addListener({
176
177
  complete: (e) => this.emit('animationend', e.animation?.name ?? '')
177
178
  });
@@ -257,6 +258,12 @@ export class SpineNode extends GameObject {
257
258
  }
258
259
  }
259
260
  get loop() { return this.#loop; }
261
+ update(dt) {
262
+ super.update(dt);
263
+ if (this.#spine) {
264
+ this.#spine.update(dt);
265
+ }
266
+ }
260
267
  remove() {
261
268
  if (typeof this.#texture === 'string') {
262
269
  textureLoader.release(this.#texture);
@@ -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 = {}> 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 override 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.autoUpdate = false\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 protected override update(dt: number) {\n super.update(dt)\n if (this.#spine) {\n this.#spine.update(dt)\n }\n }\n\n override 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"]}
@@ -13,6 +13,7 @@ export class Renderer extends RenderableNode {
13
13
  #ticker = new Ticker((dt) => this.#render(dt));
14
14
  camera = new Camera();
15
15
  fpsDisplay;
16
+ timeScale = 1;
16
17
  #fixedWidth;
17
18
  #fixedHeight;
18
19
  logicalWidth;
@@ -131,7 +132,8 @@ export class Renderer extends RenderableNode {
131
132
  this._isSizeDirty = true;
132
133
  }
133
134
  #render(dt) {
134
- this.update(dt); // 로직 업데이트
135
+ const scaledDt = dt * this.timeScale;
136
+ this.update(scaledDt);
135
137
  this._updateWorldTransform();
136
138
  this._resetWorldTransformDirty();
137
139
  this.#pixiRenderer?.render(this._pixiContainer);
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/renderer/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { AutoDetectOptions, autoDetectRenderer, ColorSource, Container as PixiContainer, Renderer as PixiRenderer } from 'pixi.js'\nimport { debugMode } from '../debug'\nimport { setStyle } from '../dom/dom-utils'\nimport { RenderableNode } from '../node/core/renderable'\nimport { Camera } from './camera'\nimport { RendererContainerManager } from './container-manager'\nimport { FpsDisplay } from './fps-display'\nimport { Layer } from './layer'\nimport { Ticker } from './ticker'\n\nexport type RendererOptions = {\n fixedWidth?: number\n fixedHeight?: number\n logicalWidth?: number\n logicalHeight?: number\n backgroundColor?: ColorSource\n backgroundAlpha?: number\n layers?: { name: string; drawOrder: number }[]\n}\n\nexport class Renderer extends RenderableNode<PixiContainer, {\n resize: (width: number, height: number) => void\n}> {\n #containerManager: RendererContainerManager\n #ticker = new Ticker((dt) => this.#render(dt))\n camera = new Camera()\n fpsDisplay?: FpsDisplay\n\n #fixedWidth?: number\n #fixedHeight?: number\n logicalWidth?: number\n logicalHeight?: number\n #backgroundColor?: ColorSource\n #backgroundAlpha?: number\n\n #pixiRenderer?: PixiRenderer\n #layers: { [name: string]: Layer } = {}\n _isSizeDirty = false\n\n canvasWidth = 0\n canvasHeight = 0\n canvasLeft = 0\n canvasTop = 0\n viewportScale = 1\n centerX = 0\n centerY = 0\n\n constructor(public container: HTMLElement, options?: RendererOptions) {\n super(new PixiContainer({ sortableChildren: true }))\n this.renderer = this\n\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n\n this.#containerManager = new RendererContainerManager(container)\n this.#containerManager.on('resize', (width, height) => this.#updateSize(width, height))\n\n this.camera.on('positionChanged', () => this.#updatePosition())\n this.camera.on('scaleChanged', () => this.#updatePosition())\n\n if (options) {\n if (options.fixedWidth !== undefined) this.#fixedWidth = options.fixedWidth\n if (options.fixedHeight !== undefined) this.#fixedHeight = options.fixedHeight\n if (options.logicalWidth !== undefined) this.logicalWidth = options.logicalWidth\n if (options.logicalHeight !== undefined) this.logicalHeight = options.logicalHeight\n if (options.backgroundColor !== undefined) this.#backgroundColor = options.backgroundColor\n if (options.backgroundAlpha !== undefined) this.#backgroundAlpha = options.backgroundAlpha\n\n if (options.layers) {\n for (const layerOption of options.layers) {\n const layer = new Layer(layerOption.drawOrder)\n this._pixiContainer.addChild(layer._pixiContainer)\n this.#layers[layerOption.name] = layer\n }\n }\n }\n\n if (debugMode) {\n this.fpsDisplay = new FpsDisplay(container)\n }\n\n this.init()\n }\n\n private async init() {\n const options: Partial<AutoDetectOptions> = {\n eventMode: 'none',\n resolution: window.devicePixelRatio,\n }\n\n if (this.#fixedWidth) options.width = this.#fixedWidth\n if (this.#fixedHeight) options.height = this.#fixedHeight\n if (this.logicalWidth) options.width = this.logicalWidth\n if (this.logicalHeight) options.height = this.logicalHeight\n if (this.#backgroundColor !== undefined) options.backgroundColor = this.#backgroundColor\n if (this.#backgroundAlpha !== undefined) options.backgroundAlpha = this.#backgroundAlpha\n\n const pr = await autoDetectRenderer(options)\n\n setStyle(pr.canvas, {\n position: 'absolute',\n touchAction: 'auto',\n })\n this.container.appendChild(pr.canvas)\n\n this.#pixiRenderer = pr\n\n const cr = this.container.getBoundingClientRect()\n this.#updateSize(cr.width, cr.height)\n }\n\n #updatePosition() {\n const S = this.camera.scale\n this._pixiContainer.scale = S\n this._pixiContainer.position.set(\n this.centerX - this.camera.x * S,\n this.centerY - this.camera.y * S\n )\n }\n\n #updateSize(containerWidth: number, containerHeight: number) {\n if (this.#fixedWidth) containerWidth = this.#fixedWidth\n if (this.#fixedHeight) containerHeight = this.#fixedHeight\n\n const canvasWidth = this.logicalWidth ?? containerWidth\n const canvasHeight = this.logicalHeight ?? containerHeight\n this.canvasWidth = canvasWidth\n this.canvasHeight = canvasHeight\n\n this.centerX = canvasWidth / 2\n this.centerY = canvasHeight / 2\n this.#updatePosition()\n\n const S = Math.min(containerWidth / canvasWidth, containerHeight / canvasHeight)\n this.viewportScale = S\n\n const displayWidth = canvasWidth * S\n const displayHeight = canvasHeight * S\n\n const canvasLeft = (containerWidth - displayWidth) / 2\n const canvasTop = (containerHeight - displayHeight) / 2\n this.canvasLeft = canvasLeft\n this.canvasTop = canvasTop\n\n if (this.#pixiRenderer) {\n this.#pixiRenderer.resize(canvasWidth, canvasHeight)\n\n setStyle(this.#pixiRenderer.canvas, {\n width: `${displayWidth}px`,\n height: `${displayHeight}px`,\n left: `${canvasLeft}px`,\n top: `${canvasTop}px`,\n })\n\n this.emit('resize', canvasWidth, canvasHeight)\n }\n\n this._isSizeDirty = true\n }\n\n #render(dt: number) {\n this.update(dt) // 로직 업데이트\n this._updateWorldTransform()\n this._resetWorldTransformDirty()\n this.#pixiRenderer?.render(this._pixiContainer)\n this.fpsDisplay?.update()\n\n this._isSizeDirty = false\n }\n\n _addToLayer(node: RenderableNode<PixiContainer, EventMap>, layerName: string) {\n const layer = this.#layers[layerName]\n if (!layer) throw new Error(`Layer ${layerName} does not exist.`)\n layer._pixiContainer.addChild(node._pixiContainer)\n }\n\n override remove() {\n this.#containerManager.remove()\n this.#ticker.remove()\n this.#pixiRenderer?.destroy()\n this.fpsDisplay?.remove()\n super.remove()\n }\n\n screenToWorld(screenX: number, screenY: number) {\n const x = (screenX - this.canvasLeft) / this.viewportScale - this.canvasWidth / 2\n const y = (screenY - this.canvasTop) / this.viewportScale - this.canvasHeight / 2\n return { x, y }\n }\n}\n"]}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/renderer/renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAe,SAAS,IAAI,aAAa,EAA4B,MAAM,SAAS,CAAA;AAClI,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAYjC,MAAM,OAAO,QAAS,SAAQ,cAE5B;IA0BmB;IAzBnB,iBAAiB,CAA0B;IAC3C,OAAO,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9C,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IACrB,UAAU,CAAa;IACvB,SAAS,GAAG,CAAC,CAAA;IAEb,WAAW,CAAS;IACpB,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,aAAa,CAAS;IACtB,gBAAgB,CAAc;IAC9B,gBAAgB,CAAS;IAEzB,aAAa,CAAe;IAC5B,OAAO,GAA8B,EAAE,CAAA;IACvC,YAAY,GAAG,KAAK,CAAA;IAEpB,WAAW,GAAG,CAAC,CAAA;IACf,YAAY,GAAG,CAAC,CAAA;IAChB,UAAU,GAAG,CAAC,CAAA;IACd,SAAS,GAAG,CAAC,CAAA;IACb,aAAa,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,CAAC,CAAA;IAEX,YAAmB,SAAsB,EAAE,OAAyB;QAClE,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QADnC,cAAS,GAAT,SAAS,CAAa;QAEvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QAEpB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAEhC,IAAI,CAAC,iBAAiB,GAAG,IAAI,wBAAwB,CAAC,SAAS,CAAC,CAAA;QAChE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QAEvF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;QAE5D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAA;YAC3E,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAA;YAC9E,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;YAChF,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;gBAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;YACnF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;gBAAE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAA;YAC1F,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;gBAAE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAA;YAE1F,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;oBAC9C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;oBAClD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,OAAO,GAA+B;YAC1C,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,MAAM,CAAC,gBAAgB;SACpC,CAAA;QAED,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAA;QACtD,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAA;QACzD,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;QACxD,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAA;QAC3D,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAA;QACxF,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAA;QAExF,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAE5C,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;YAClB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,MAAM;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;QAErC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QAEvB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAA;QACjD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAED,eAAe;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CACjC,CAAA;IACH,CAAC;IAED,WAAW,CAAC,cAAsB,EAAE,eAAuB;QACzD,IAAI,IAAI,CAAC,WAAW;YAAE,cAAc,GAAG,IAAI,CAAC,WAAW,CAAA;QACvD,IAAI,IAAI,CAAC,YAAY;YAAE,eAAe,GAAG,IAAI,CAAC,YAAY,CAAA;QAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc,CAAA;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,eAAe,CAAA;QAC1D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAEhC,IAAI,CAAC,OAAO,GAAG,WAAW,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,YAAY,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,WAAW,EAAE,eAAe,GAAG,YAAY,CAAC,CAAA;QAChF,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QAEtB,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,CAAA;QACpC,MAAM,aAAa,GAAG,YAAY,GAAG,CAAC,CAAA;QAEtC,MAAM,UAAU,GAAG,CAAC,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QACtD,MAAM,SAAS,GAAG,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QACvD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAE1B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;YAEpD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;gBAClC,KAAK,EAAE,GAAG,YAAY,IAAI;gBAC1B,MAAM,EAAE,GAAG,aAAa,IAAI;gBAC5B,IAAI,EAAE,GAAG,UAAU,IAAI;gBACvB,GAAG,EAAE,GAAG,SAAS,IAAI;aACtB,CAAC,CAAA;YAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;QAChD,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACrB,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAC5B,IAAI,CAAC,yBAAyB,EAAE,CAAA;QAChC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC/C,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAA;QAEzB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;IAC3B,CAAC;IAED,WAAW,CAAC,IAA6C,EAAE,SAAiB;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,kBAAkB,CAAC,CAAA;QACjE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACpD,CAAC;IAEQ,MAAM;QACb,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAA;QAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;QACrB,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAA;QAC7B,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAA;QACzB,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;IAED,aAAa,CAAC,OAAe,EAAE,OAAe;QAC5C,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;QACjF,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QACjF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;IACjB,CAAC;CACF","sourcesContent":["import { EventMap } from '@webtaku/event-emitter'\nimport { AutoDetectOptions, autoDetectRenderer, ColorSource, Container as PixiContainer, Renderer as PixiRenderer } from 'pixi.js'\nimport { debugMode } from '../debug'\nimport { setStyle } from '../dom/dom-utils'\nimport { RenderableNode } from '../node/core/renderable'\nimport { Camera } from './camera'\nimport { RendererContainerManager } from './container-manager'\nimport { FpsDisplay } from './fps-display'\nimport { Layer } from './layer'\nimport { Ticker } from './ticker'\n\nexport type RendererOptions = {\n fixedWidth?: number\n fixedHeight?: number\n logicalWidth?: number\n logicalHeight?: number\n backgroundColor?: ColorSource\n backgroundAlpha?: number\n layers?: { name: string; drawOrder: number }[]\n}\n\nexport class Renderer extends RenderableNode<PixiContainer, {\n resize: (width: number, height: number) => void\n}> {\n #containerManager: RendererContainerManager\n #ticker = new Ticker((dt) => this.#render(dt))\n camera = new Camera()\n fpsDisplay?: FpsDisplay\n timeScale = 1\n\n #fixedWidth?: number\n #fixedHeight?: number\n logicalWidth?: number\n logicalHeight?: number\n #backgroundColor?: ColorSource\n #backgroundAlpha?: number\n\n #pixiRenderer?: PixiRenderer\n #layers: { [name: string]: Layer } = {}\n _isSizeDirty = false\n\n canvasWidth = 0\n canvasHeight = 0\n canvasLeft = 0\n canvasTop = 0\n viewportScale = 1\n centerX = 0\n centerY = 0\n\n constructor(public container: HTMLElement, options?: RendererOptions) {\n super(new PixiContainer({ sortableChildren: true }))\n this.renderer = this\n\n this.worldTransform.x.v = 0\n this.worldTransform.y.v = 0\n this.worldTransform.resetDirty()\n\n this.#containerManager = new RendererContainerManager(container)\n this.#containerManager.on('resize', (width, height) => this.#updateSize(width, height))\n\n this.camera.on('positionChanged', () => this.#updatePosition())\n this.camera.on('scaleChanged', () => this.#updatePosition())\n\n if (options) {\n if (options.fixedWidth !== undefined) this.#fixedWidth = options.fixedWidth\n if (options.fixedHeight !== undefined) this.#fixedHeight = options.fixedHeight\n if (options.logicalWidth !== undefined) this.logicalWidth = options.logicalWidth\n if (options.logicalHeight !== undefined) this.logicalHeight = options.logicalHeight\n if (options.backgroundColor !== undefined) this.#backgroundColor = options.backgroundColor\n if (options.backgroundAlpha !== undefined) this.#backgroundAlpha = options.backgroundAlpha\n\n if (options.layers) {\n for (const layerOption of options.layers) {\n const layer = new Layer(layerOption.drawOrder)\n this._pixiContainer.addChild(layer._pixiContainer)\n this.#layers[layerOption.name] = layer\n }\n }\n }\n\n if (debugMode) {\n this.fpsDisplay = new FpsDisplay(container)\n }\n\n this.init()\n }\n\n private async init() {\n const options: Partial<AutoDetectOptions> = {\n eventMode: 'none',\n resolution: window.devicePixelRatio,\n }\n\n if (this.#fixedWidth) options.width = this.#fixedWidth\n if (this.#fixedHeight) options.height = this.#fixedHeight\n if (this.logicalWidth) options.width = this.logicalWidth\n if (this.logicalHeight) options.height = this.logicalHeight\n if (this.#backgroundColor !== undefined) options.backgroundColor = this.#backgroundColor\n if (this.#backgroundAlpha !== undefined) options.backgroundAlpha = this.#backgroundAlpha\n\n const pr = await autoDetectRenderer(options)\n\n setStyle(pr.canvas, {\n position: 'absolute',\n touchAction: 'auto',\n })\n this.container.appendChild(pr.canvas)\n\n this.#pixiRenderer = pr\n\n const cr = this.container.getBoundingClientRect()\n this.#updateSize(cr.width, cr.height)\n }\n\n #updatePosition() {\n const S = this.camera.scale\n this._pixiContainer.scale = S\n this._pixiContainer.position.set(\n this.centerX - this.camera.x * S,\n this.centerY - this.camera.y * S\n )\n }\n\n #updateSize(containerWidth: number, containerHeight: number) {\n if (this.#fixedWidth) containerWidth = this.#fixedWidth\n if (this.#fixedHeight) containerHeight = this.#fixedHeight\n\n const canvasWidth = this.logicalWidth ?? containerWidth\n const canvasHeight = this.logicalHeight ?? containerHeight\n this.canvasWidth = canvasWidth\n this.canvasHeight = canvasHeight\n\n this.centerX = canvasWidth / 2\n this.centerY = canvasHeight / 2\n this.#updatePosition()\n\n const S = Math.min(containerWidth / canvasWidth, containerHeight / canvasHeight)\n this.viewportScale = S\n\n const displayWidth = canvasWidth * S\n const displayHeight = canvasHeight * S\n\n const canvasLeft = (containerWidth - displayWidth) / 2\n const canvasTop = (containerHeight - displayHeight) / 2\n this.canvasLeft = canvasLeft\n this.canvasTop = canvasTop\n\n if (this.#pixiRenderer) {\n this.#pixiRenderer.resize(canvasWidth, canvasHeight)\n\n setStyle(this.#pixiRenderer.canvas, {\n width: `${displayWidth}px`,\n height: `${displayHeight}px`,\n left: `${canvasLeft}px`,\n top: `${canvasTop}px`,\n })\n\n this.emit('resize', canvasWidth, canvasHeight)\n }\n\n this._isSizeDirty = true\n }\n\n #render(dt: number) {\n const scaledDt = dt * this.timeScale\n this.update(scaledDt)\n this._updateWorldTransform()\n this._resetWorldTransformDirty()\n this.#pixiRenderer?.render(this._pixiContainer)\n this.fpsDisplay?.update()\n\n this._isSizeDirty = false\n }\n\n _addToLayer(node: RenderableNode<PixiContainer, EventMap>, layerName: string) {\n const layer = this.#layers[layerName]\n if (!layer) throw new Error(`Layer ${layerName} does not exist.`)\n layer._pixiContainer.addChild(node._pixiContainer)\n }\n\n override remove() {\n this.#containerManager.remove()\n this.#ticker.remove()\n this.#pixiRenderer?.destroy()\n this.fpsDisplay?.remove()\n super.remove()\n }\n\n screenToWorld(screenX: number, screenY: number) {\n const x = (screenX - this.canvasLeft) / this.viewportScale - this.canvasWidth / 2\n const y = (screenY - this.canvasTop) / this.viewportScale - this.canvasHeight / 2\n return { x, y }\n }\n}\n"]}
@@ -1,10 +1,11 @@
1
1
  import { EventEmitter, EventMap } from '@webtaku/event-emitter';
2
- export declare abstract class GameNode<E extends EventMap> extends EventEmitter<E & {
2
+ export declare abstract class GameNode<E extends EventMap = {}> extends EventEmitter<E & {
3
3
  update: (dt: number) => void;
4
4
  }> {
5
5
  #private;
6
6
  protected children: GameNode<EventMap>[];
7
7
  paused: boolean;
8
+ timeScale: number;
8
9
  protected set parent(parent: GameNode<EventMap> | undefined);
9
10
  protected get parent(): GameNode<EventMap> | undefined;
10
11
  add(...children: GameNode<EventMap>[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"game-node.d.ts","sourceRoot":"","sources":["../../../../src/node/core/game-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAE/D,8BAAsB,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAE,SAAQ,YAAY,CAAC,CAAC,GAAG;IAC1E,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B,CAAC;;IAEA,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAM;IAC9C,MAAM,UAAQ;IAEd,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,EAE1D;IAED,SAAS,KAAK,MAAM,IAJS,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAM1D;IAED,GAAG,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAe5B,MAAM;IAkBf,KAAK;IAOL,MAAM;IAON,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM;CAS5B"}
1
+ {"version":3,"file":"game-node.d.ts","sourceRoot":"","sources":["../../../../src/node/core/game-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAE/D,8BAAsB,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,EAAE,CAAE,SAAQ,YAAY,CAAC,CAAC,GAAG;IAC/E,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B,CAAC;;IAEA,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAM;IAC9C,MAAM,UAAQ;IACd,SAAS,SAAI;IAEb,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,EAE1D;IAED,SAAS,KAAK,MAAM,IAJS,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAM1D;IAED,GAAG,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAe5B,MAAM;IAkBf,KAAK;IAOL,MAAM;IAON,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM;CAW5B"}
@@ -17,6 +17,7 @@ export declare class AnimatedSpriteNode<E extends EventMap = {}> extends GameObj
17
17
  get atlas(): Atlas;
18
18
  set animation(animation: string);
19
19
  get animation(): string;
20
+ protected update(dt: number): void;
20
21
  remove(): void;
21
22
  }
22
23
  //# sourceMappingURL=animated-sprite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"animated-sprite.d.ts","sourceRoot":"","sources":["../../../../src/node/ext/animated-sprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAGjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEnE,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,iBAAiB,CAAA;AAErB,qBAAa,kBAAkB,CAAC,CAAC,SAAS,QAAQ,GAAG,EAAE,CAAE,SAAQ,UAAU,CAAC,CAAC,GAAG;IAC9E,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAC;;gBASY,OAAO,EAAE,yBAAyB;IA+C9C,IAAI,GAAG,CAAC,GAAG,QAAA,EAMV;IAED,IAAI,GAAG,WAAuB;IAE9B,IAAI,KAAK,CAAC,KAAK,OAAA,EAMd;IAED,IAAI,KAAK,UAAyB;IAElC,IAAI,SAAS,CAAC,SAAS,QAAA,EAKtB;IAED,IAAI,SAAS,WAA6B;IAEjC,MAAM;CAIhB"}
1
+ {"version":3,"file":"animated-sprite.d.ts","sourceRoot":"","sources":["../../../../src/node/ext/animated-sprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAGjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEnE,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,iBAAiB,CAAA;AAErB,qBAAa,kBAAkB,CAAC,CAAC,SAAS,QAAQ,GAAG,EAAE,CAAE,SAAQ,UAAU,CAAC,CAAC,GAAG;IAC9E,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAC;;gBAUY,OAAO,EAAE,yBAAyB;IAgD9C,IAAI,GAAG,CAAC,GAAG,QAAA,EAMV;IAED,IAAI,GAAG,WAAuB;IAE9B,IAAI,KAAK,CAAC,KAAK,OAAA,EAMd;IAED,IAAI,KAAK,UAAyB;IAElC,IAAI,SAAS,CAAC,SAAS,QAAA,EAKtB;IAED,IAAI,SAAS,WAA6B;cAEvB,MAAM,CAAC,EAAE,EAAE,MAAM;IAO3B,MAAM;CAIhB"}
@@ -31,6 +31,7 @@ export declare class SpineNode<E extends EventMap = {}> extends GameObject<E & {
31
31
  get animation(): string | undefined;
32
32
  set loop(loop: boolean | undefined);
33
33
  get loop(): boolean | undefined;
34
+ protected update(dt: number): void;
34
35
  remove(): void;
35
36
  }
36
37
  //# sourceMappingURL=spine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spine.d.ts","sourceRoot":"","sources":["../../../../src/node/ext/spine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKjD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAExC,eAAe,CAAC,EAAE,GAAG,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,GAAG,iBAAiB,CAAA;AAErB,qBAAa,SAAS,CAAC,CAAC,SAAS,QAAQ,GAAG,EAAE,CAAE,SAAQ,UAAU,CAAC,CAAC,GAAG;IACrE,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAC;;gBAcY,OAAO,EAAE,gBAAgB;IA2MrC,IAAI,KAAK,CAAC,KAAK,QAAA,EAKd;IAED,IAAI,KAAK,WAAyB;IAElC,IAAI,OAAO,CAAC,OAAO,iCAAA,EAKlB;IAED,IAAI,OAAO,oCAA2B;IAEtC,IAAI,eAAe,CAAC,eAAe,KAAA,EAKlC;IAED,IAAI,eAAe,QAAmC;IAEtD,IAAI,IAAI,CAAC,IAAI,oBAAA,EAKZ;IAED,IAAI,IAAI,uBAAwB;IAEhC,IAAI,IAAI,CAAC,IAAI,oBAAA,EAKZ;IAED,IAAI,IAAI,uBAAwB;IAEhC,IAAI,KAAK,CAAC,KAAK,sBAAA,EAKd;IAED,IAAI,KAAK,yBAAyB;IAElC,IAAI,SAAS,CAAC,SAAS,oBAAA,EAKtB;IAED,IAAI,SAAS,uBAA6B;IAE1C,IAAI,IAAI,CAAC,IAAI,qBAAA,EAKZ;IAED,IAAI,IAAI,wBAAwB;IAEvB,MAAM;CAUhB"}
1
+ {"version":3,"file":"spine.d.ts","sourceRoot":"","sources":["../../../../src/node/ext/spine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKjD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAExC,eAAe,CAAC,EAAE,GAAG,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,GAAG,iBAAiB,CAAA;AAErB,qBAAa,SAAS,CAAC,CAAC,SAAS,QAAQ,GAAG,EAAE,CAAE,SAAQ,UAAU,CAAC,CAAC,GAAG;IACrE,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAC;;gBAcY,OAAO,EAAE,gBAAgB;IA4MrC,IAAI,KAAK,CAAC,KAAK,QAAA,EAKd;IAED,IAAI,KAAK,WAAyB;IAElC,IAAI,OAAO,CAAC,OAAO,iCAAA,EAKlB;IAED,IAAI,OAAO,oCAA2B;IAEtC,IAAI,eAAe,CAAC,eAAe,KAAA,EAKlC;IAED,IAAI,eAAe,QAAmC;IAEtD,IAAI,IAAI,CAAC,IAAI,oBAAA,EAKZ;IAED,IAAI,IAAI,uBAAwB;IAEhC,IAAI,IAAI,CAAC,IAAI,oBAAA,EAKZ;IAED,IAAI,IAAI,uBAAwB;IAEhC,IAAI,KAAK,CAAC,KAAK,sBAAA,EAKd;IAED,IAAI,KAAK,yBAAyB;IAElC,IAAI,SAAS,CAAC,SAAS,oBAAA,EAKtB;IAED,IAAI,SAAS,uBAA6B;IAE1C,IAAI,IAAI,CAAC,IAAI,qBAAA,EAKZ;IAED,IAAI,IAAI,wBAAwB;cAEb,MAAM,CAAC,EAAE,EAAE,MAAM;IAO3B,MAAM;CAUhB"}
@@ -22,6 +22,7 @@ export declare class Renderer extends RenderableNode<PixiContainer, {
22
22
  container: HTMLElement;
23
23
  camera: Camera;
24
24
  fpsDisplay?: FpsDisplay;
25
+ timeScale: number;
25
26
  logicalWidth?: number;
26
27
  logicalHeight?: number;
27
28
  _isSizeDirty: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/renderer/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAyC,WAAW,EAAE,SAAS,IAAI,aAAa,EAA4B,MAAM,SAAS,CAAA;AAGlI,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI1C,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,WAAW,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC/C,CAAA;AAED,qBAAa,QAAS,SAAQ,cAAc,CAAC,aAAa,EAAE;IAC1D,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAChD,CAAC;;IAyBmB,SAAS,EAAE,WAAW;IAtBzC,MAAM,SAAe;IACrB,UAAU,CAAC,EAAE,UAAU,CAAA;IAIvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IAMtB,YAAY,UAAQ;IAEpB,WAAW,SAAI;IACf,YAAY,SAAI;IAChB,UAAU,SAAI;IACd,SAAS,SAAI;IACb,aAAa,SAAI;IACjB,OAAO,SAAI;IACX,OAAO,SAAI;gBAEQ,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,eAAe;YAsCtD,IAAI;IAsFlB,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM;IAMnE,MAAM;IAQf,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;CAK/C"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/renderer/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAyC,WAAW,EAAE,SAAS,IAAI,aAAa,EAA4B,MAAM,SAAS,CAAA;AAGlI,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI1C,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,WAAW,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC/C,CAAA;AAED,qBAAa,QAAS,SAAQ,cAAc,CAAC,aAAa,EAAE;IAC1D,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAChD,CAAC;;IA0BmB,SAAS,EAAE,WAAW;IAvBzC,MAAM,SAAe;IACrB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,SAAI;IAIb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IAMtB,YAAY,UAAQ;IAEpB,WAAW,SAAI;IACf,YAAY,SAAI;IAChB,UAAU,SAAI;IACd,SAAS,SAAI;IACb,aAAa,SAAI;IACjB,OAAO,SAAI;IACX,OAAO,SAAI;gBAEQ,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,eAAe;YAsCtD,IAAI;IAuFlB,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM;IAMnE,MAAM;IAQf,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;CAK/C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kiwiengine",
3
- "version": "0.5.20",
3
+ "version": "0.6.0",
4
4
  "types": "./lib/types/index.d.ts",
5
5
  "main": "./lib/index.js",
6
6
  "dependencies": {
@@ -1,11 +1,12 @@
1
1
  import { EventEmitter, EventMap } from '@webtaku/event-emitter'
2
2
 
3
- export abstract class GameNode<E extends EventMap> extends EventEmitter<E & {
3
+ export abstract class GameNode<E extends EventMap = {}> extends EventEmitter<E & {
4
4
  update: (dt: number) => void
5
5
  }> {
6
6
  #parent?: GameNode<EventMap>
7
7
  protected children: GameNode<EventMap>[] = [];
8
8
  paused = false
9
+ timeScale = 1
9
10
 
10
11
  protected set parent(parent: GameNode<EventMap> | undefined) {
11
12
  this.#parent = parent
@@ -65,10 +66,12 @@ export abstract class GameNode<E extends EventMap> extends EventEmitter<E & {
65
66
  protected update(dt: number) {
66
67
  if (this.paused) return
67
68
 
69
+ const scaledDt = dt * this.timeScale
70
+
68
71
  for (const child of this.children) {
69
- if (!child.paused) child.update(dt)
72
+ if (!child.paused) child.update(scaledDt)
70
73
  }
71
74
 
72
- (this as any).emit('update', dt)
75
+ (this as any).emit('update', scaledDt)
73
76
  }
74
77
  }
@@ -20,6 +20,7 @@ export class AnimatedSpriteNode<E extends EventMap = {}> extends GameObject<E &
20
20
  #atlasId!: string
21
21
  #sheet?: Spritesheet
22
22
  #sprite?: PixiAnimatedSprite
23
+ #baseFps = 60
23
24
 
24
25
  constructor(options: AnimatedSpriteNodeOptions) {
25
26
  super(options)
@@ -59,7 +60,8 @@ export class AnimatedSpriteNode<E extends EventMap = {}> extends GameObject<E &
59
60
  s.anchor.set(0.5, 0.5)
60
61
  s.zIndex = -999999
61
62
  s.loop = a.loop
62
- s.animationSpeed = a.fps / 60
63
+ this.#baseFps = a.fps
64
+ s.animationSpeed = (a.fps / 60) * this.timeScale
63
65
  s.play()
64
66
  s.onLoop = () => (this as any).emit('animationend', this.#animation)
65
67
  s.onComplete = () => (this as any).emit('animationend', this.#animation)
@@ -97,6 +99,13 @@ export class AnimatedSpriteNode<E extends EventMap = {}> extends GameObject<E &
97
99
 
98
100
  get animation() { return this.#animation }
99
101
 
102
+ protected override update(dt: number) {
103
+ super.update(dt)
104
+ if (this.#sprite) {
105
+ this.#sprite.animationSpeed = (this.#baseFps / 60) * this.timeScale
106
+ }
107
+ }
108
+
100
109
  override remove() {
101
110
  spritesheetLoader.release(this.#atlasId)
102
111
  super.remove()
@@ -207,6 +207,7 @@ export class SpineNode<E extends EventMap = {}> extends GameObject<E & {
207
207
 
208
208
  if (skeletonData) {
209
209
  const s = new PixiSpine(skeletonData)
210
+ s.autoUpdate = false
210
211
  s.state.addListener({
211
212
  complete: (e) => (this as any).emit('animationend', e.animation?.name ?? '')
212
213
  })
@@ -310,6 +311,13 @@ export class SpineNode<E extends EventMap = {}> extends GameObject<E & {
310
311
 
311
312
  get loop() { return this.#loop }
312
313
 
314
+ protected override update(dt: number) {
315
+ super.update(dt)
316
+ if (this.#spine) {
317
+ this.#spine.update(dt)
318
+ }
319
+ }
320
+
313
321
  override remove() {
314
322
  if (typeof this.#texture === 'string') {
315
323
  textureLoader.release(this.#texture)
@@ -26,6 +26,7 @@ export class Renderer extends RenderableNode<PixiContainer, {
26
26
  #ticker = new Ticker((dt) => this.#render(dt))
27
27
  camera = new Camera()
28
28
  fpsDisplay?: FpsDisplay
29
+ timeScale = 1
29
30
 
30
31
  #fixedWidth?: number
31
32
  #fixedHeight?: number
@@ -161,7 +162,8 @@ export class Renderer extends RenderableNode<PixiContainer, {
161
162
  }
162
163
 
163
164
  #render(dt: number) {
164
- this.update(dt) // 로직 업데이트
165
+ const scaledDt = dt * this.timeScale
166
+ this.update(scaledDt)
165
167
  this._updateWorldTransform()
166
168
  this._resetWorldTransformDirty()
167
169
  this.#pixiRenderer?.render(this._pixiContainer)