@flighthq/spritesheet 0.3.0-next.906.07cea63 → 0.3.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.
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { SpritesheetAnimationData, SpritesheetData, SpritesheetFrameData, acquireSpritesheetPlayer, cloneSpritesheet, cloneSpritesheetPlayer, createSpritesheet, createSpritesheetAnimation, createSpritesheetAnimationData, createSpritesheetAnimationFromFrameNames, createSpritesheetData, createSpritesheetFrame, createSpritesheetFrameData, createSpritesheetFromData, createSpritesheetFromGrid, createSpritesheetFromTileset, createSpritesheetPlayer, disposeSpritesheetPlayer, getSpritesheetAnimation, getSpritesheetPlayerFrame, getSpritesheetPlayerFrameAt, pauseSpritesheetPlayer, playSpritesheetAnimation, queueSpritesheetAnimation, releaseSpritesheetPlayer, resumeSpritesheetPlayer, seekSpritesheetPlayerToFrame, seekSpritesheetPlayerToTime, stopSpritesheetPlayer, updateSpritesheetPlayer, validateSpritesheet, validateSpritesheetData, } from './contract';
1
+ export { SpritesheetAnimationData, SpritesheetData, SpritesheetFrameData, acquireSpritesheetPlayer, cloneSpritesheet, cloneSpritesheetPlayer, createSpritesheet, createSpritesheetAnimation, createSpritesheetAnimationData, createSpritesheetAnimationFromFrameNames, createSpritesheetData, createSpritesheetFrame, createSpritesheetFrameData, createSpritesheetFromData, createSpritesheetFromGrid, createSpritesheetPlayer, disposeSpritesheetPlayer, getSpritesheetAnimation, getSpritesheetPlayerFrame, getSpritesheetPlayerFrameAt, pauseSpritesheetPlayer, playSpritesheetAnimation, queueSpritesheetAnimation, releaseSpritesheetPlayer, resumeSpritesheetPlayer, seekSpritesheetPlayerToFrame, seekSpritesheetPlayerToTime, stopSpritesheetPlayer, updateSpritesheetPlayer, validateSpritesheet, validateSpritesheetData, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,wCAAwC,EACxC,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,wCAAwC,EACxC,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { acquireSpritesheetPlayer, cloneSpritesheet, cloneSpritesheetPlayer, createSpritesheet, createSpritesheetAnimation, createSpritesheetAnimationData, createSpritesheetAnimationFromFrameNames, createSpritesheetData, createSpritesheetFrame, createSpritesheetFrameData, createSpritesheetFromData, createSpritesheetFromGrid, createSpritesheetFromTileset, createSpritesheetPlayer, disposeSpritesheetPlayer, getSpritesheetAnimation, getSpritesheetPlayerFrame, getSpritesheetPlayerFrameAt, pauseSpritesheetPlayer, playSpritesheetAnimation, queueSpritesheetAnimation, releaseSpritesheetPlayer, resumeSpritesheetPlayer, seekSpritesheetPlayerToFrame, seekSpritesheetPlayerToTime, stopSpritesheetPlayer, updateSpritesheetPlayer, validateSpritesheet, validateSpritesheetData, } from './contract';
1
+ export { acquireSpritesheetPlayer, cloneSpritesheet, cloneSpritesheetPlayer, createSpritesheet, createSpritesheetAnimation, createSpritesheetAnimationData, createSpritesheetAnimationFromFrameNames, createSpritesheetData, createSpritesheetFrame, createSpritesheetFrameData, createSpritesheetFromData, createSpritesheetFromGrid, createSpritesheetPlayer, disposeSpritesheetPlayer, getSpritesheetAnimation, getSpritesheetPlayerFrame, getSpritesheetPlayerFrameAt, pauseSpritesheetPlayer, playSpritesheetAnimation, queueSpritesheetAnimation, releaseSpritesheetPlayer, resumeSpritesheetPlayer, seekSpritesheetPlayerToFrame, seekSpritesheetPlayerToTime, stopSpritesheetPlayer, updateSpritesheetPlayer, validateSpritesheet, validateSpritesheetData, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,wCAAwC,EACxC,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,wCAAwC,EACxC,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { Spritesheet, SpritesheetAnimation } from '@flighthq/types/contract';
2
2
  export declare function createSpritesheetAnimation(obj?: Partial<SpritesheetAnimation>): SpritesheetAnimation;
3
- export declare function createSpritesheetAnimationFromFrameNames(spritesheet: Readonly<Spritesheet>, pattern: string | RegExp, options?: Partial<Pick<SpritesheetAnimation, 'direction' | 'frameDuration' | 'frameDurations' | 'loop' | 'originX' | 'originY'>>): SpritesheetAnimation | null;
3
+ export declare function createSpritesheetAnimationFromFrameNames(spritesheet: Readonly<Spritesheet>, pattern: string | RegExp, options?: Partial<Pick<SpritesheetAnimation, 'direction' | 'frameDuration' | 'frameDurations' | 'originX' | 'originY' | 'repeatCount'>>): SpritesheetAnimation | null;
4
4
  //# sourceMappingURL=spritesheetAnimation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetAnimation.d.ts","sourceRoot":"","sources":["../src/spritesheetAnimation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAElF,wBAAgB,0BAA0B,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAUpG;AAMD,wBAAgB,wCAAwC,CACtD,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,OAAO,CACf,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC,CAC9G,GACA,oBAAoB,GAAG,IAAI,CA0B7B"}
1
+ {"version":3,"file":"spritesheetAnimation.d.ts","sourceRoot":"","sources":["../src/spritesheetAnimation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAElF,wBAAgB,0BAA0B,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAUpG;AAMD,wBAAgB,wCAAwC,CACtD,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,OAAO,CACf,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC,CACrH,GACA,oBAAoB,GAAG,IAAI,CA0B7B"}
@@ -5,9 +5,9 @@ export function createSpritesheetAnimation(obj) {
5
5
  frameDuration: obj?.frameDuration ?? 0,
6
6
  frameDurations: obj?.frameDurations ?? null,
7
7
  frames: obj?.frames ?? [],
8
- loop: obj?.loop ?? false,
9
8
  originX: obj?.originX ?? 0,
10
9
  originY: obj?.originY ?? 0,
10
+ repeatCount: obj?.repeatCount ?? 0,
11
11
  });
12
12
  }
13
13
  // Builds a `SpritesheetAnimation` by selecting frames from a `Spritesheet` whose atlas region names
@@ -40,9 +40,9 @@ export function createSpritesheetAnimationFromFrameNames(spritesheet, pattern, o
40
40
  frameDuration: options?.frameDuration,
41
41
  frameDurations: options?.frameDurations,
42
42
  frames: matchedIndices,
43
- loop: options?.loop,
44
43
  originX: options?.originX,
45
44
  originY: options?.originY,
45
+ repeatCount: options?.repeatCount,
46
46
  });
47
47
  }
48
48
  //# sourceMappingURL=spritesheetAnimation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetAnimation.js","sourceRoot":"","sources":["../src/spritesheetAnimation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,UAAU,0BAA0B,CAAC,GAAmC;IAC5E,OAAO,YAAY,CAAC;QAClB,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,SAAS;QACtC,aAAa,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;QACtC,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE;QACzB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,KAAK;QACxB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,oGAAoG;AACpG,kGAAkG;AAClG,kGAAkG;AAClG,kFAAkF;AAClF,MAAM,UAAU,wCAAwC,CACtD,WAAkC,EAClC,OAAwB,EACxB,OAEC;IAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,uEAAuE;IACvE,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChH,IAAI,OAAO,EAAE,CAAC;YACZ,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,0BAA0B,CAAC;QAChC,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,cAAc,EAAE,OAAO,EAAE,cAAc;QACvC,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,OAAO,EAAE,OAAO,EAAE,OAAO;KAC1B,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"spritesheetAnimation.js","sourceRoot":"","sources":["../src/spritesheetAnimation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,UAAU,0BAA0B,CAAC,GAAmC;IAC5E,OAAO,YAAY,CAAC;QAClB,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,SAAS;QACtC,aAAa,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;QACtC,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE;QACzB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,oGAAoG;AACpG,kGAAkG;AAClG,kGAAkG;AAClG,kFAAkF;AAClF,MAAM,UAAU,wCAAwC,CACtD,WAAkC,EAClC,OAAwB,EACxB,OAEC;IAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,uEAAuE;IACvE,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChH,IAAI,OAAO,EAAE,CAAC;YACZ,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,0BAA0B,CAAC;QAChC,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,cAAc,EAAE,OAAO,EAAE,cAAc;QACvC,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,WAAW,EAAE,OAAO,EAAE,WAAW;KAClC,CAAC,CAAC;AACL,CAAC"}
@@ -4,10 +4,10 @@ export function createSpritesheetAnimationData(obj) {
4
4
  frameDuration: obj?.frameDuration ?? 100,
5
5
  frameDurations: obj?.frameDurations ?? null,
6
6
  frameNames: obj?.frameNames ?? [],
7
- loop: obj?.loop ?? true,
8
7
  name: obj?.name ?? '',
9
8
  originX: obj?.originX ?? 0,
10
9
  originY: obj?.originY ?? 0,
10
+ repeatCount: obj?.repeatCount ?? -1,
11
11
  };
12
12
  }
13
13
  export function createSpritesheetData(obj) {
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetData.js","sourceRoot":"","sources":["../src/spritesheetData.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,8BAA8B,CAAC,GAAuC;IACpF,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,SAAS;QACtC,aAAa,EAAE,GAAG,EAAE,aAAa,IAAI,GAAG;QACxC,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE;QACjC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;QACvB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;QACrB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA8B;IAClE,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE;QACjC,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE;QACzB,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE;QAC/B,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;QAChC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAmC;IAC5E,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;QACxB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;QACrB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;QAC3B,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;QAC3B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,KAAK;QAC9B,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;QACpC,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACtB,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;QACd,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"spritesheetData.js","sourceRoot":"","sources":["../src/spritesheetData.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,8BAA8B,CAAC,GAAuC;IACpF,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,SAAS;QACtC,aAAa,EAAE,GAAG,EAAE,aAAa,IAAI,GAAG;QACxC,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE;QACjC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;QACrB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA8B;IAClE,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE;QACjC,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE;QACzB,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE;QAC/B,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;QAChC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAmC;IAC5E,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;QACxB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;QACrB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;QAC3B,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;QAC3B,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,KAAK;QAC9B,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;QACpC,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACtB,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;QACd,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;KACf,CAAC;AACJ,CAAC"}
@@ -1,6 +1,5 @@
1
- import type { GridSliceOptions, Spritesheet, TextureAtlas, Tileset } from '@flighthq/types/contract';
1
+ import type { GridSliceOptions, Spritesheet, TextureAtlas } from '@flighthq/types/contract';
2
2
  import type { SpritesheetData } from './spritesheetData';
3
3
  export declare function createSpritesheetFromData(data: Readonly<SpritesheetData>, atlas: Readonly<TextureAtlas>): Spritesheet;
4
4
  export declare function createSpritesheetFromGrid(options: Readonly<GridSliceOptions>): Spritesheet;
5
- export declare function createSpritesheetFromTileset(tileset: Tileset): Spritesheet;
6
5
  //# sourceMappingURL=spritesheetFrom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetFrom.d.ts","sourceRoot":"","sources":["../src/spritesheetFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EAEX,YAAY,EACZ,OAAO,EACR,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOzD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,WAAW,CA8CrH;AAMD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAmC1F;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAI1E"}
1
+ {"version":3,"file":"spritesheetFrom.d.ts","sourceRoot":"","sources":["../src/spritesheetFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAwB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOzD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,WAAW,CA8CrH;AAMD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAI1F"}
@@ -1,4 +1,4 @@
1
- import { createTextureAtlas, createTextureAtlasRegion } from '@flighthq/textureatlas/contract';
1
+ import { createTextureAtlasFromGrid } from '@flighthq/textureatlas/contract';
2
2
  import { createSpritesheet } from './spritesheet';
3
3
  import { createSpritesheetAnimation } from './spritesheetAnimation';
4
4
  import { createSpritesheetFrame } from './spritesheetFrame';
@@ -45,9 +45,9 @@ export function createSpritesheetFromData(data, atlas) {
45
45
  frameDuration: ad.frameDuration,
46
46
  frameDurations: ad.frameDurations,
47
47
  frames: resolvedFrames,
48
- loop: ad.loop,
49
48
  originX: ad.originX,
50
49
  originY: ad.originY,
50
+ repeatCount: ad.repeatCount,
51
51
  });
52
52
  }
53
53
  return createSpritesheet({ animations, atlas, frames });
@@ -57,34 +57,8 @@ export function createSpritesheetFromData(data, atlas) {
57
57
  // Frames are generated row-major (left-to-right, top-to-bottom), each backed by an atlas region named
58
58
  // `${namePrefix}${id}`.
59
59
  export function createSpritesheetFromGrid(options) {
60
- const { columns, rows, imageWidth, imageHeight, marginX = 0, marginY = 0, spacingX = 0, spacingY = 0, namePrefix = 'frame_', } = options;
61
- const frameWidth = options.frameWidth ?? Math.floor((imageWidth - 2 * marginX - spacingX * (columns - 1)) / columns);
62
- const frameHeight = options.frameHeight ?? Math.floor((imageHeight - 2 * marginY - spacingY * (rows - 1)) / rows);
63
- const atlas = createTextureAtlas();
64
- const frames = [];
65
- let id = 0;
66
- for (let row = 0; row < rows; row++) {
67
- for (let col = 0; col < columns; col++) {
68
- const x = marginX + col * (frameWidth + spacingX);
69
- const y = marginY + row * (frameHeight + spacingY);
70
- const region = createTextureAtlasRegion({
71
- height: frameHeight,
72
- id,
73
- name: `${namePrefix}${id}`,
74
- width: frameWidth,
75
- x,
76
- y,
77
- });
78
- atlas.regions.push(region);
79
- frames.push(createSpritesheetFrame({ id }));
80
- id++;
81
- }
82
- }
83
- return createSpritesheet({ atlas, frames });
84
- }
85
- export function createSpritesheetFromTileset(tileset) {
86
- const { atlas } = tileset;
87
- const frames = (atlas?.regions ?? []).map((region) => createSpritesheetFrame({ id: region.id }));
60
+ const atlas = createTextureAtlasFromGrid(options);
61
+ const frames = atlas.regions.map((region) => createSpritesheetFrame({ id: region.id }));
88
62
  return createSpritesheet({ atlas, frames });
89
63
  }
90
64
  //# sourceMappingURL=spritesheetFrom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetFrom.js","sourceRoot":"","sources":["../src/spritesheetFrom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spritesheetFrom.js","sourceRoot":"","sources":["../src/spritesheetFrom.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetPlayer.d.ts","sourceRoot":"","sources":["../src/spritesheetPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEvH,wBAAgB,wBAAwB,IAAI,iBAAiB,CAc5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAY7F;AAED,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAY3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAMxE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,GACjC,gBAAgB,GAAG,IAAI,CAKzB;AAOD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,WAAW,EAAE,MAAM,GAClB,gBAAgB,GAAG,IAAI,CAQzB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEtE;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,IAAI,EAChD,OAAO,UAAO,GACb,IAAI,CAON;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAEpH;AAKD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAWxE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEvE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAQhG;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAKrE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CA4B7F"}
1
+ {"version":3,"file":"spritesheetPlayer.d.ts","sourceRoot":"","sources":["../src/spritesheetPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEvH,wBAAgB,wBAAwB,IAAI,iBAAiB,CAc5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAY7F;AAED,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAY3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAMxE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,GACjC,gBAAgB,GAAG,IAAI,CAKzB;AAOD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,WAAW,EAAE,MAAM,GAClB,gBAAgB,GAAG,IAAI,CAQzB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEtE;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,IAAI,EAChD,OAAO,UAAO,GACb,IAAI,CAON;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAEpH;AAKD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAWxE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEvE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAOhG;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAKrE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CA6B7F"}
@@ -108,9 +108,8 @@ export function seekSpritesheetPlayerToFrame(player, frameIndex) {
108
108
  return;
109
109
  const clamped = Math.max(0, Math.min(frameIndex, animation.frames.length - 1));
110
110
  player.frameIndex = clamped;
111
- // Sync elapsed to the start of the target virtual frame index that maps to this display frame.
112
- // For simplicity, seek to the first virtual index that produces this display frame.
113
- player.elapsed = resolveVirtualIndexStartTime(animation, clamped);
111
+ const virtualIndex = resolveDisplayIndexToFirstVirtualIndex(animation, clamped);
112
+ player.elapsed = resolveVirtualIndexStartTime(animation, virtualIndex);
114
113
  }
115
114
  export function seekSpritesheetPlayerToTime(player, time) {
116
115
  const { animation } = player;
@@ -130,11 +129,12 @@ export function updateSpritesheetPlayer(player, deltaTime) {
130
129
  const { animation } = player;
131
130
  if (animation === null || player.complete || player.paused || animation.frames.length === 0)
132
131
  return false;
133
- const { loop } = animation;
132
+ const { repeatCount } = animation;
134
133
  const totalTime = resolveAnimationTotalTime(animation);
135
134
  const prevLoopCount = Math.floor(player.elapsed / totalTime);
136
135
  player.elapsed += deltaTime * player.speed;
137
- if (!loop && player.elapsed >= totalTime) {
136
+ const playbackTime = repeatCount < 0 ? Infinity : totalTime * (repeatCount + 1);
137
+ if (player.elapsed >= playbackTime) {
138
138
  if (player.queue.length > 0) {
139
139
  const next = player.queue.shift();
140
140
  player.animation = next;
@@ -142,7 +142,7 @@ export function updateSpritesheetPlayer(player, deltaTime) {
142
142
  player.frameIndex = 0;
143
143
  return true;
144
144
  }
145
- player.elapsed = totalTime;
145
+ player.elapsed = playbackTime;
146
146
  // On completion, show the last virtual frame in the direction sequence.
147
147
  const lastVi = resolveVirtualFrameCount(animation) - 1;
148
148
  player.frameIndex = resolveVirtualIndexToDisplayIndex(animation, lastVi);
@@ -157,22 +157,37 @@ export function updateSpritesheetPlayer(player, deltaTime) {
157
157
  player.frameIndex = resolveVirtualIndexToDisplayIndex(animation, vi);
158
158
  return true;
159
159
  }
160
+ // Returns the first virtual index whose direction-aware mapping produces `displayIndex`. Forward and
161
+ // pingpong encounter it on the forward leg; reverse and pingpong_reverse encounter it on the reverse
162
+ // leg. Keeping this inverse beside the forward mapping prevents display and virtual indices from being
163
+ // confused at seek call sites.
164
+ function resolveDisplayIndexToFirstVirtualIndex(animation, displayIndex) {
165
+ switch (animation.direction) {
166
+ case 'forward':
167
+ case 'pingpong':
168
+ return displayIndex;
169
+ case 'reverse':
170
+ case 'pingpong_reverse':
171
+ return animation.frames.length - 1 - displayIndex;
172
+ default:
173
+ return displayIndex;
174
+ }
175
+ }
160
176
  // Returns a cached cumulative-duration array for variable-timing animations.
161
177
  // The array has virtualCount+1 entries: [0, d0, d0+d1, ..., total].
162
178
  function getCumulativeDurations(animation) {
163
179
  const cached = cumulativeDurationsCache.get(animation);
164
180
  if (cached !== undefined)
165
181
  return cached;
166
- const { frames, frameDuration, frameDurations } = animation;
167
- const n = frames.length;
182
+ const { frameDuration, frameDurations } = animation;
168
183
  const virtualCount = resolveVirtualFrameCount(animation);
169
184
  const arr = new Float64Array(virtualCount + 1);
170
185
  let t = 0;
171
186
  for (let vi = 0; vi < virtualCount; vi++) {
172
187
  arr[vi] = t;
173
- // Map virtual index to the forward frame index for the duration lookup.
174
- const fi = vi < n ? vi : 2 * (n - 1) - vi;
175
- t += frameDurations[fi] ?? frameDuration;
188
+ // Durations belong to displayed frames, so use the same direction-aware mapping as playback.
189
+ const displayIndex = resolveVirtualIndexToDisplayIndex(animation, vi);
190
+ t += frameDurations[displayIndex] ?? frameDuration;
176
191
  }
177
192
  arr[virtualCount] = t || 1;
178
193
  cumulativeDurationsCache.set(animation, arr);
@@ -1 +1 @@
1
- {"version":3,"file":"spritesheetPlayer.js","sourceRoot":"","sources":["../src/spritesheetPlayer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spritesheetPlayer.js","sourceRoot":"","sources":["../src/spritesheetPlayer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "name": "@flighthq/spritesheet",
3
- "version": "0.3.0-next.906.07cea63",
3
+ "version": "0.3.0",
4
+ "author": "Joshua Granick and other contributors",
5
+ "license": "MIT",
4
6
  "repository": {
5
7
  "type": "git",
6
8
  "url": "https://github.com/flighthq/flight.git",
@@ -36,11 +38,10 @@
36
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
37
39
  },
38
40
  "dependencies": {
39
- "@flighthq/entity": "0.3.0-next.906.07cea63",
40
- "@flighthq/signals": "0.3.0-next.906.07cea63",
41
- "@flighthq/textureatlas": "0.3.0-next.906.07cea63",
42
- "@flighthq/tileset": "0.3.0-next.906.07cea63",
43
- "@flighthq/types": "0.3.0-next.906.07cea63"
41
+ "@flighthq/entity": "0.3.0",
42
+ "@flighthq/signals": "0.3.0",
43
+ "@flighthq/textureatlas": "0.3.0",
44
+ "@flighthq/types": "0.3.0"
44
45
  },
45
46
  "devDependencies": {
46
47
  "typescript": "^5.3.0"
@@ -17,19 +17,19 @@ describe('createSpritesheetAnimation', () => {
17
17
 
18
18
  expect(anim.frameDuration).toBe(0);
19
19
  expect(anim.frames).toEqual([]);
20
- expect(anim.loop).toBe(false);
21
20
  expect(anim.originX).toBe(0);
22
21
  expect(anim.originY).toBe(0);
22
+ expect(anim.repeatCount).toBe(0);
23
23
  });
24
24
 
25
25
  it('applies partial overrides', () => {
26
- const anim = createSpritesheetAnimation({ frameDuration: 100, loop: true, frames: [0, 1, 2] });
26
+ const anim = createSpritesheetAnimation({ frameDuration: 100, frames: [0, 1, 2], repeatCount: 2 });
27
27
 
28
28
  expect(anim.frameDuration).toBe(100);
29
- expect(anim.loop).toBe(true);
30
29
  expect(anim.frames).toEqual([0, 1, 2]);
31
30
  expect(anim.originX).toBe(0);
32
31
  expect(anim.originY).toBe(0);
32
+ expect(anim.repeatCount).toBe(2);
33
33
  });
34
34
 
35
35
  it('uses a provided frames array directly', () => {
@@ -82,11 +82,11 @@ describe('createSpritesheetAnimationFromFrameNames', () => {
82
82
  const anim = createSpritesheetAnimationFromFrameNames(sheet, 'walk_', {
83
83
  direction: 'pingpong',
84
84
  frameDuration: 80,
85
- loop: true,
85
+ repeatCount: -1,
86
86
  });
87
87
  expect(anim!.direction).toBe('pingpong');
88
88
  expect(anim!.frameDuration).toBe(80);
89
- expect(anim!.loop).toBe(true);
89
+ expect(anim!.repeatCount).toBe(-1);
90
90
  });
91
91
 
92
92
  it('returns null when no frames match the pattern', () => {
@@ -7,10 +7,10 @@ describe('createSpritesheetAnimationData', () => {
7
7
  expect(anim.frameDuration).toBe(100);
8
8
  expect(anim.frameDurations).toBeNull();
9
9
  expect(anim.frameNames).toEqual([]);
10
- expect(anim.loop).toBe(true);
11
10
  expect(anim.name).toBe('');
12
11
  expect(anim.originX).toBe(0);
13
12
  expect(anim.originY).toBe(0);
13
+ expect(anim.repeatCount).toBe(-1);
14
14
  });
15
15
 
16
16
  it('applies provided partial fields', () => {
@@ -18,18 +18,18 @@ describe('createSpritesheetAnimationData', () => {
18
18
  direction: 'pingpong',
19
19
  frameDuration: 80,
20
20
  frameNames: ['a', 'b', 'c'],
21
- loop: false,
22
21
  name: 'walk',
23
22
  originX: 0.5,
24
23
  originY: 1,
24
+ repeatCount: 3,
25
25
  });
26
26
  expect(anim.direction).toBe('pingpong');
27
27
  expect(anim.frameDuration).toBe(80);
28
28
  expect(anim.frameNames).toEqual(['a', 'b', 'c']);
29
- expect(anim.loop).toBe(false);
30
29
  expect(anim.name).toBe('walk');
31
30
  expect(anim.originX).toBe(0.5);
32
31
  expect(anim.originY).toBe(1);
32
+ expect(anim.repeatCount).toBe(3);
33
33
  });
34
34
 
35
35
  it('stores per-frame durations when provided', () => {
@@ -1,15 +1,7 @@
1
1
  import { createTextureAtlas, createTextureAtlasRegion } from '@flighthq/textureatlas/contract';
2
- import { buildTilesetRegions, createTileset } from '@flighthq/tileset/contract';
3
2
 
4
3
  import { createSpritesheetAnimationData, createSpritesheetData, createSpritesheetFrameData } from './spritesheetData';
5
- import { createSpritesheetFromData, createSpritesheetFromGrid, createSpritesheetFromTileset } from './spritesheetFrom';
6
-
7
- function makeTileset(columns: number, rows: number) {
8
- const atlas = createTextureAtlas();
9
- const tileset = createTileset({ atlas, columns, rows, tileWidth: 32, tileHeight: 32 });
10
- buildTilesetRegions(tileset);
11
- return tileset;
12
- }
4
+ import { createSpritesheetFromData, createSpritesheetFromGrid } from './spritesheetFrom';
13
5
 
14
6
  describe('createSpritesheetFromData', () => {
15
7
  it('builds one frame per SpritesheetFrameData entry', () => {
@@ -72,7 +64,7 @@ describe('createSpritesheetFromData', () => {
72
64
  frameDuration: 100,
73
65
  frameDurations: [80, 120],
74
66
  frameNames: ['f0', 'f1'],
75
- loop: true,
67
+ repeatCount: 3,
76
68
  }),
77
69
  ],
78
70
  frames: [createSpritesheetFrameData({ name: 'f0' }), createSpritesheetFrameData({ name: 'f1' })],
@@ -85,7 +77,7 @@ describe('createSpritesheetFromData', () => {
85
77
  expect(walk.direction).toBe('pingpong');
86
78
  expect(walk.frameDurations).toEqual([80, 120]);
87
79
  expect(walk.frames).toEqual([0, 1]);
88
- expect(walk.loop).toBe(true);
80
+ expect(walk.repeatCount).toBe(3);
89
81
  });
90
82
 
91
83
  it('carries pivot and rotated onto runtime frames', () => {
@@ -214,46 +206,6 @@ describe('createSpritesheetFromGrid', () => {
214
206
  imageWidth: 32,
215
207
  imageHeight: 32,
216
208
  });
217
- expect(sheet.atlas!.image).toBeNull();
218
- });
219
- });
220
-
221
- describe('createSpritesheetFromTileset', () => {
222
- it('creates one frame per tile region', () => {
223
- const tileset = makeTileset(3, 2);
224
- const sheet = createSpritesheetFromTileset(tileset);
225
-
226
- expect(sheet.frames).toHaveLength(6);
227
- });
228
-
229
- it('assigns region ids to frames in order', () => {
230
- const tileset = makeTileset(2, 1);
231
- const sheet = createSpritesheetFromTileset(tileset);
232
- const regions = tileset.atlas?.regions ?? [];
233
-
234
- expect(sheet.frames[0].id).toBe(regions[0].id);
235
- expect(sheet.frames[1].id).toBe(regions[1].id);
236
- });
237
-
238
- it('passes the atlas through to the spritesheet', () => {
239
- const tileset = makeTileset(1, 1);
240
- const sheet = createSpritesheetFromTileset(tileset);
241
-
242
- expect(sheet.atlas).toBe(tileset.atlas);
243
- });
244
-
245
- it('produces no frames when atlas is null', () => {
246
- const tileset = createTileset();
247
- const sheet = createSpritesheetFromTileset(tileset);
248
-
249
- expect(sheet.frames).toHaveLength(0);
250
- expect(sheet.atlas).toBeNull();
251
- });
252
-
253
- it('starts with no animations', () => {
254
- const tileset = makeTileset(2, 2);
255
- const sheet = createSpritesheetFromTileset(tileset);
256
-
257
- expect(Object.keys(sheet.animations)).toHaveLength(0);
209
+ expect(sheet.atlas!.texture).toBeNull();
258
210
  });
259
211
  });
@@ -21,8 +21,8 @@ import {
21
21
  updateSpritesheetPlayer,
22
22
  } from './spritesheetPlayer';
23
23
 
24
- function makeAnimation(frameIndices: number[], frameDuration: number, loop = true) {
25
- return createSpritesheetAnimation({ frames: frameIndices, frameDuration, loop });
24
+ function makeAnimation(frameIndices: number[], frameDuration: number, repeatCount = -1) {
25
+ return createSpritesheetAnimation({ frames: frameIndices, frameDuration, repeatCount });
26
26
  }
27
27
 
28
28
  function makeSheet(frameCount: number, atlas = null) {
@@ -362,6 +362,57 @@ describe('seekSpritesheetPlayerToFrame', () => {
362
362
  expect(player.frameIndex).toBe(2);
363
363
  });
364
364
 
365
+ it('converts a reverse display frame to its virtual start and remains stable on update', () => {
366
+ const player = createSpritesheetPlayer();
367
+ const animation = createSpritesheetAnimation({
368
+ direction: 'reverse',
369
+ frameDuration: 100,
370
+ frames: [0, 1, 2, 3],
371
+ repeatCount: -1,
372
+ });
373
+ playSpritesheetAnimation(player, animation);
374
+
375
+ seekSpritesheetPlayerToFrame(player, 1);
376
+ expect(player.elapsed).toBe(200);
377
+ expect(player.frameIndex).toBe(1);
378
+ updateSpritesheetPlayer(player, 0);
379
+ expect(player.frameIndex).toBe(1);
380
+ });
381
+
382
+ it('uses the first pingpong virtual occurrence and remains stable on update', () => {
383
+ const player = createSpritesheetPlayer();
384
+ const animation = createSpritesheetAnimation({
385
+ direction: 'pingpong',
386
+ frameDuration: 100,
387
+ frames: [0, 1, 2, 3],
388
+ repeatCount: -1,
389
+ });
390
+ playSpritesheetAnimation(player, animation);
391
+
392
+ seekSpritesheetPlayerToFrame(player, 2);
393
+ expect(player.elapsed).toBe(200);
394
+ expect(player.frameIndex).toBe(2);
395
+ updateSpritesheetPlayer(player, 0);
396
+ expect(player.frameIndex).toBe(2);
397
+ });
398
+
399
+ it('converts a pingpong-reverse display frame to its first virtual occurrence', () => {
400
+ const player = createSpritesheetPlayer();
401
+ const animation = createSpritesheetAnimation({
402
+ direction: 'pingpong_reverse',
403
+ frameDuration: 100,
404
+ frames: [0, 1, 2, 3],
405
+ repeatCount: -1,
406
+ });
407
+ playSpritesheetAnimation(player, animation);
408
+
409
+ seekSpritesheetPlayerToFrame(player, 2);
410
+ expect(player.elapsed).toBe(100);
411
+ expect(player.frameIndex).toBe(2);
412
+ updateSpritesheetPlayer(player, 0);
413
+ expect(player.frameIndex).toBe(2);
414
+ });
415
+
365
416
  it('clamps negative frame index to 0', () => {
366
417
  const player = createSpritesheetPlayer();
367
418
  playSpritesheetAnimation(player, makeAnimation([0, 1, 2], 100));
@@ -465,27 +516,27 @@ describe('updateSpritesheetPlayer', () => {
465
516
  expect(player.complete).toBe(false);
466
517
  });
467
518
 
468
- it('clamps to last frame and marks complete for non-looping animation', () => {
519
+ it('clamps to last frame and marks complete when repeatCount is zero', () => {
469
520
  const player = createSpritesheetPlayer();
470
- const anim = makeAnimation([0, 1, 2, 3], 100, false);
521
+ const anim = makeAnimation([0, 1, 2, 3], 100, 0);
471
522
  playSpritesheetAnimation(player, anim);
472
523
  updateSpritesheetPlayer(player, 500);
473
524
  expect(player.frameIndex).toBe(3);
474
525
  expect(player.complete).toBe(true);
475
526
  });
476
527
 
477
- it('returns false after non-looping animation completes', () => {
528
+ it('returns false after a zero-repeat animation completes', () => {
478
529
  const player = createSpritesheetPlayer();
479
- const anim = makeAnimation([0, 1], 100, false);
530
+ const anim = makeAnimation([0, 1], 100, 0);
480
531
  playSpritesheetAnimation(player, anim);
481
532
  updateSpritesheetPlayer(player, 300);
482
533
  expect(updateSpritesheetPlayer(player, 100)).toBe(false);
483
534
  });
484
535
 
485
- it('advances to queued animation when non-looping animation completes', () => {
536
+ it('advances to queued animation when its repeat budget is exhausted', () => {
486
537
  const player = createSpritesheetPlayer();
487
- const first = makeAnimation([0, 1], 100, false);
488
- const second = makeAnimation([2, 3], 100, false);
538
+ const first = makeAnimation([0, 1], 100, 0);
539
+ const second = makeAnimation([2, 3], 100, 0);
489
540
  playSpritesheetAnimation(player, first);
490
541
  queueSpritesheetAnimation(player, second);
491
542
  updateSpritesheetPlayer(player, 300);
@@ -497,8 +548,8 @@ describe('updateSpritesheetPlayer', () => {
497
548
 
498
549
  it('does not emit onComplete when advancing to a queued animation', () => {
499
550
  const player = createSpritesheetPlayer();
500
- const first = makeAnimation([0], 100, false);
501
- const second = makeAnimation([1], 100, false);
551
+ const first = makeAnimation([0], 100, 0);
552
+ const second = makeAnimation([1], 100, 0);
502
553
  let fired = 0;
503
554
  connectSignal(player.onComplete, () => fired++);
504
555
  playSpritesheetAnimation(player, first);
@@ -510,9 +561,9 @@ describe('updateSpritesheetPlayer', () => {
510
561
 
511
562
  it('plays through multiple queued animations in order', () => {
512
563
  const player = createSpritesheetPlayer();
513
- const first = makeAnimation([0], 100, false);
514
- const second = makeAnimation([1], 100, false);
515
- const third = makeAnimation([2], 100, false);
564
+ const first = makeAnimation([0], 100, 0);
565
+ const second = makeAnimation([1], 100, 0);
566
+ const third = makeAnimation([2], 100, 0);
516
567
  playSpritesheetAnimation(player, first);
517
568
  queueSpritesheetAnimation(player, second);
518
569
  queueSpritesheetAnimation(player, third);
@@ -524,9 +575,9 @@ describe('updateSpritesheetPlayer', () => {
524
575
  expect(player.complete).toBe(true);
525
576
  });
526
577
 
527
- it('emits onComplete when non-looping animation finishes', () => {
578
+ it('emits onComplete when a zero-repeat animation finishes', () => {
528
579
  const player = createSpritesheetPlayer();
529
- const anim = makeAnimation([0, 1, 2], 100, false);
580
+ const anim = makeAnimation([0, 1, 2], 100, 0);
530
581
  playSpritesheetAnimation(player, anim);
531
582
  let fired = 0;
532
583
  connectSignal(player.onComplete, () => fired++);
@@ -536,9 +587,9 @@ describe('updateSpritesheetPlayer', () => {
536
587
  expect(fired).toBe(1);
537
588
  });
538
589
 
539
- it('does not emit onComplete for looping animation', () => {
590
+ it('does not emit onComplete for an infinitely repeating animation', () => {
540
591
  const player = createSpritesheetPlayer();
541
- const anim = makeAnimation([0, 1, 2], 100, true);
592
+ const anim = makeAnimation([0, 1, 2], 100, -1);
542
593
  playSpritesheetAnimation(player, anim);
543
594
  let fired = 0;
544
595
  connectSignal(player.onComplete, () => fired++);
@@ -546,9 +597,9 @@ describe('updateSpritesheetPlayer', () => {
546
597
  expect(fired).toBe(0);
547
598
  });
548
599
 
549
- it('emits onLoop each time a looping animation cycles', () => {
600
+ it('emits onLoop each time an infinitely repeating animation cycles', () => {
550
601
  const player = createSpritesheetPlayer();
551
- const anim = makeAnimation([0, 1, 2, 3], 100, true);
602
+ const anim = makeAnimation([0, 1, 2, 3], 100, -1);
552
603
  playSpritesheetAnimation(player, anim);
553
604
  let loops = 0;
554
605
  connectSignal(player.onLoop, () => loops++);
@@ -558,9 +609,9 @@ describe('updateSpritesheetPlayer', () => {
558
609
  expect(loops).toBe(2);
559
610
  });
560
611
 
561
- it('does not emit onLoop for non-looping animation', () => {
612
+ it('does not emit onLoop when repeatCount is zero', () => {
562
613
  const player = createSpritesheetPlayer();
563
- const anim = makeAnimation([0, 1, 2, 3], 100, false);
614
+ const anim = makeAnimation([0, 1, 2, 3], 100, 0);
564
615
  playSpritesheetAnimation(player, anim);
565
616
  let loops = 0;
566
617
  connectSignal(player.onLoop, () => loops++);
@@ -568,10 +619,10 @@ describe('updateSpritesheetPlayer', () => {
568
619
  expect(loops).toBe(0);
569
620
  });
570
621
 
571
- it('does not advance queue for looping animation', () => {
622
+ it('does not advance the queue for an infinitely repeating animation', () => {
572
623
  const player = createSpritesheetPlayer();
573
- const looping = makeAnimation([0, 1], 100, true);
574
- const queued = makeAnimation([2, 3], 100, false);
624
+ const looping = makeAnimation([0, 1], 100, -1);
625
+ const queued = makeAnimation([2, 3], 100, 0);
575
626
  playSpritesheetAnimation(player, looping);
576
627
  queueSpritesheetAnimation(player, queued);
577
628
  updateSpritesheetPlayer(player, 500);
@@ -579,6 +630,30 @@ describe('updateSpritesheetPlayer', () => {
579
630
  expect(player.queue).toHaveLength(1);
580
631
  });
581
632
 
633
+ it('plays repeatCount additional cycles before completing', () => {
634
+ const player = createSpritesheetPlayer();
635
+ const animation = makeAnimation([0, 1], 100, 2);
636
+ let completions = 0;
637
+ let loops = 0;
638
+ connectSignal(player.onComplete, () => completions++);
639
+ connectSignal(player.onLoop, () => loops++);
640
+ playSpritesheetAnimation(player, animation);
641
+
642
+ updateSpritesheetPlayer(player, 200);
643
+ expect(player.complete).toBe(false);
644
+ expect(loops).toBe(1);
645
+ updateSpritesheetPlayer(player, 200);
646
+ expect(player.complete).toBe(false);
647
+ expect(loops).toBe(2);
648
+ updateSpritesheetPlayer(player, 200);
649
+
650
+ expect(player.complete).toBe(true);
651
+ expect(player.elapsed).toBe(600);
652
+ expect(player.frameIndex).toBe(1);
653
+ expect(loops).toBe(2);
654
+ expect(completions).toBe(1);
655
+ });
656
+
582
657
  it('does not advance elapsed when paused', () => {
583
658
  const player = createSpritesheetPlayer();
584
659
  const anim = makeAnimation([0, 1, 2], 100);
@@ -615,7 +690,7 @@ describe('updateSpritesheetPlayer', () => {
615
690
  direction: 'reverse',
616
691
  frameDuration: 100,
617
692
  frames: [0, 1, 2, 3],
618
- loop: true,
693
+ repeatCount: -1,
619
694
  });
620
695
  playSpritesheetAnimation(player, anim);
621
696
  updateSpritesheetPlayer(player, 0);
@@ -624,16 +699,33 @@ describe('updateSpritesheetPlayer', () => {
624
699
  expect(player.frameIndex).toBe(2);
625
700
  });
626
701
 
702
+ it('uses the displayed reverse frame duration rather than its mirrored index', () => {
703
+ const player = createSpritesheetPlayer();
704
+ const animation = createSpritesheetAnimation({
705
+ direction: 'reverse',
706
+ frameDuration: 100,
707
+ frameDurations: [50, 100, 200],
708
+ frames: [0, 1, 2],
709
+ repeatCount: -1,
710
+ });
711
+ playSpritesheetAnimation(player, animation);
712
+
713
+ updateSpritesheetPlayer(player, 199);
714
+ expect(player.frameIndex).toBe(2);
715
+ updateSpritesheetPlayer(player, 1);
716
+ expect(player.frameIndex).toBe(1);
717
+ });
718
+
627
719
  it('plays pingpong direction forward then backward', () => {
628
720
  const player = createSpritesheetPlayer();
629
721
  const anim = createSpritesheetAnimation({
630
722
  direction: 'pingpong',
631
723
  frameDuration: 100,
632
724
  frames: [0, 1, 2],
633
- loop: true,
725
+ repeatCount: -1,
634
726
  });
635
727
  playSpritesheetAnimation(player, anim);
636
- // 6 virtual frames (0,1,2,1 wraps) at 100ms each = 600ms loop
728
+ // 4 virtual frames (0,1,2,1 then wraps) at 100ms each = 400ms per cycle.
637
729
  updateSpritesheetPlayer(player, 0);
638
730
  expect(player.frameIndex).toBe(0);
639
731
  updateSpritesheetPlayer(player, 100);
@@ -644,13 +736,30 @@ describe('updateSpritesheetPlayer', () => {
644
736
  expect(player.frameIndex).toBe(1);
645
737
  });
646
738
 
739
+ it('uses direction-aware durations for pingpong-reverse playback', () => {
740
+ const player = createSpritesheetPlayer();
741
+ const animation = createSpritesheetAnimation({
742
+ direction: 'pingpong_reverse',
743
+ frameDuration: 100,
744
+ frameDurations: [50, 100, 200],
745
+ frames: [0, 1, 2],
746
+ repeatCount: -1,
747
+ });
748
+ playSpritesheetAnimation(player, animation);
749
+
750
+ updateSpritesheetPlayer(player, 199);
751
+ expect(player.frameIndex).toBe(2);
752
+ updateSpritesheetPlayer(player, 1);
753
+ expect(player.frameIndex).toBe(1);
754
+ });
755
+
647
756
  it('uses per-frame durations when frameDurations is set', () => {
648
757
  const player = createSpritesheetPlayer();
649
758
  const anim = createSpritesheetAnimation({
650
759
  frameDuration: 100,
651
760
  frameDurations: [50, 200, 150],
652
761
  frames: [0, 1, 2],
653
- loop: true,
762
+ repeatCount: -1,
654
763
  });
655
764
  playSpritesheetAnimation(player, anim);
656
765
  updateSpritesheetPlayer(player, 50);