@vitykovskiy/canvas-sprite-animations 0.1.2 → 0.1.4
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/README.md +38 -0
- package/dist/core/asset-loader.d.ts +2 -1
- package/dist/core/asset-loader.d.ts.map +1 -1
- package/dist/core/asset-loader.js +10 -1
- package/dist/core/asset-loader.js.map +1 -1
- package/dist/core/frame-sequence.d.ts +3 -0
- package/dist/core/frame-sequence.d.ts.map +1 -0
- package/dist/core/frame-sequence.js +55 -0
- package/dist/core/frame-sequence.js.map +1 -0
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/sprite-sheet.d.ts.map +1 -1
- package/dist/core/sprite-sheet.js +7 -0
- package/dist/core/sprite-sheet.js.map +1 -1
- package/dist/renderers/create-canvas-sprite-renderer.d.ts.map +1 -1
- package/dist/renderers/create-canvas-sprite-renderer.js +3 -3
- package/dist/renderers/create-canvas-sprite-renderer.js.map +1 -1
- package/dist/types.d.ts +26 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -13,13 +13,17 @@ npm install @vitykovskiy/canvas-sprite-animations
|
|
|
13
13
|
- GitHub: https://github.com/Vitykovskiy/sprite-animations
|
|
14
14
|
- Playground: https://vitykovskiy.github.io/sprite-animations/
|
|
15
15
|
|
|
16
|
+
The hosted playground is a Vue 3 app built on top of the same framework-agnostic runtime API exposed by the package.
|
|
17
|
+
|
|
16
18
|
## Usage
|
|
17
19
|
|
|
18
20
|
```ts
|
|
19
21
|
import {
|
|
20
22
|
createAnimationPlayer,
|
|
21
23
|
createCanvasSpriteRenderer,
|
|
24
|
+
createFrameSequence,
|
|
22
25
|
createSpriteSheet,
|
|
26
|
+
loadFrameSequence,
|
|
23
27
|
loadSpriteSheetImage,
|
|
24
28
|
} from "@vitykovskiy/canvas-sprite-animations";
|
|
25
29
|
|
|
@@ -46,6 +50,33 @@ const player = createAnimationPlayer({
|
|
|
46
50
|
const renderer = createCanvasSpriteRenderer();
|
|
47
51
|
```
|
|
48
52
|
|
|
53
|
+
```ts
|
|
54
|
+
import {
|
|
55
|
+
createAnimationPlayer,
|
|
56
|
+
createCanvasSpriteRenderer,
|
|
57
|
+
createFrameSequence,
|
|
58
|
+
loadFrameSequence,
|
|
59
|
+
} from "@vitykovskiy/canvas-sprite-animations";
|
|
60
|
+
|
|
61
|
+
const loadedFrames = await loadFrameSequence([
|
|
62
|
+
"/assets/run-01.png",
|
|
63
|
+
"/assets/run-02.png",
|
|
64
|
+
"/assets/run-03.png",
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
const frameSequence = createFrameSequence({
|
|
68
|
+
frames: loadedFrames.map((frame) => frame.image),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const player = createAnimationPlayer({
|
|
72
|
+
totalFrames: frameSequence.getFrameCount(),
|
|
73
|
+
fps: 12,
|
|
74
|
+
loop: true,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const renderer = createCanvasSpriteRenderer();
|
|
78
|
+
```
|
|
79
|
+
|
|
49
80
|
## Entry Points
|
|
50
81
|
|
|
51
82
|
- `@vitykovskiy/canvas-sprite-animations`
|
|
@@ -58,9 +89,15 @@ const renderer = createCanvasSpriteRenderer();
|
|
|
58
89
|
- `loadSpriteSheetImage(...)`
|
|
59
90
|
Loads a sprite sheet from a URL, `HTMLImageElement`, or `ImageBitmap`.
|
|
60
91
|
|
|
92
|
+
- `loadFrameSequence(...)`
|
|
93
|
+
Loads a frame sequence from an array of URLs, `HTMLImageElement`, or `ImageBitmap`.
|
|
94
|
+
|
|
61
95
|
- `createSpriteSheet(...)`
|
|
62
96
|
Creates a regular-grid sprite sheet model.
|
|
63
97
|
|
|
98
|
+
- `createFrameSequence(...)`
|
|
99
|
+
Creates a frame-sequence model from separate images.
|
|
100
|
+
|
|
64
101
|
- `createAnimationPlayer(...)`
|
|
65
102
|
Controls playback state and frame timing.
|
|
66
103
|
|
|
@@ -78,6 +115,7 @@ const renderer = createCanvasSpriteRenderer();
|
|
|
78
115
|
Current MVP scope:
|
|
79
116
|
|
|
80
117
|
- regular grid sprite sheets
|
|
118
|
+
- frame sequences from separate images
|
|
81
119
|
- canvas rendering
|
|
82
120
|
- runtime playback with `fps` and/or `duration`
|
|
83
121
|
- predictable positioning and scaling
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { LoadedSpriteSheetImage, LoadSpriteSheetImageOptions, SpriteSheetImageSource } from "../types.js";
|
|
1
|
+
import type { FrameImageSource, LoadedFrameImage, LoadFrameSequenceOptions, LoadedSpriteSheetImage, LoadSpriteSheetImageOptions, SpriteSheetImageSource } from "../types.js";
|
|
2
2
|
export declare function loadSpriteSheetImage(source: SpriteSheetImageSource, options?: LoadSpriteSheetImageOptions): Promise<LoadedSpriteSheetImage>;
|
|
3
|
+
export declare function loadFrameSequence(sources: readonly FrameImageSource[], options?: LoadFrameSequenceOptions): Promise<LoadedFrameImage[]>;
|
|
3
4
|
//# sourceMappingURL=asset-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-loader.d.ts","sourceRoot":"","sources":["../../src/core/asset-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"asset-loader.d.ts","sourceRoot":"","sources":["../../src/core/asset-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,sBAAsB,CAAC,CAEjC;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAQ7B"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
export async function loadSpriteSheetImage(source, options = {}) {
|
|
2
|
+
return loadImageAsset(source, options);
|
|
3
|
+
}
|
|
4
|
+
export async function loadFrameSequence(sources, options = {}) {
|
|
5
|
+
if (!Array.isArray(sources) || sources.length === 0) {
|
|
6
|
+
throw new Error("sources must contain at least one frame image.");
|
|
7
|
+
}
|
|
8
|
+
return Promise.all(sources.map((source) => loadImageAsset(source, options)));
|
|
9
|
+
}
|
|
10
|
+
async function loadImageAsset(source, options) {
|
|
2
11
|
if (typeof source === "string") {
|
|
3
12
|
return loadImageFromUrl(source, options);
|
|
4
13
|
}
|
|
@@ -40,7 +49,7 @@ function waitForImageElement(image) {
|
|
|
40
49
|
};
|
|
41
50
|
const handleError = () => {
|
|
42
51
|
cleanup();
|
|
43
|
-
reject(new Error("Failed to load
|
|
52
|
+
reject(new Error("Failed to load image."));
|
|
44
53
|
};
|
|
45
54
|
const cleanup = () => {
|
|
46
55
|
image.removeEventListener("load", handleLoad);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-loader.js","sourceRoot":"","sources":["../../src/core/asset-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asset-loader.js","sourceRoot":"","sources":["../../src/core/asset-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-sequence.d.ts","sourceRoot":"","sources":["../../src/core/frame-sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AAErB,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAY9E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function createFrameSequence(config) {
|
|
2
|
+
const frames = normalizeFrames(config.frames);
|
|
3
|
+
return {
|
|
4
|
+
frames,
|
|
5
|
+
getFrameCount() {
|
|
6
|
+
return frames.length;
|
|
7
|
+
},
|
|
8
|
+
getFrame(frameIndex) {
|
|
9
|
+
return resolveFrame(frames, frameIndex);
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function normalizeFrames(frames) {
|
|
14
|
+
if (!Array.isArray(frames) || frames.length === 0) {
|
|
15
|
+
throw new Error("frames must contain at least one image.");
|
|
16
|
+
}
|
|
17
|
+
return frames;
|
|
18
|
+
}
|
|
19
|
+
function resolveFrame(frames, frameIndex) {
|
|
20
|
+
if (!Number.isInteger(frameIndex) || frameIndex < 0) {
|
|
21
|
+
throw new Error("frameIndex must be a non-negative integer.");
|
|
22
|
+
}
|
|
23
|
+
if (frameIndex >= frames.length) {
|
|
24
|
+
throw new Error("frameIndex is outside the configured frame sequence range.");
|
|
25
|
+
}
|
|
26
|
+
const image = frames[frameIndex];
|
|
27
|
+
if (!image) {
|
|
28
|
+
throw new Error("frameIndex is outside the configured frame sequence range.");
|
|
29
|
+
}
|
|
30
|
+
const dimensions = getImageDimensions(image);
|
|
31
|
+
return {
|
|
32
|
+
image,
|
|
33
|
+
x: 0,
|
|
34
|
+
y: 0,
|
|
35
|
+
width: dimensions.width,
|
|
36
|
+
height: dimensions.height,
|
|
37
|
+
index: frameIndex,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function getImageDimensions(image) {
|
|
41
|
+
if ("naturalWidth" in image && "naturalHeight" in image) {
|
|
42
|
+
return {
|
|
43
|
+
width: image.naturalWidth,
|
|
44
|
+
height: image.naturalHeight,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if ("width" in image && "height" in image) {
|
|
48
|
+
return {
|
|
49
|
+
width: image.width,
|
|
50
|
+
height: image.height,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
throw new Error("Frame image must expose width and height.");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=frame-sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-sequence.js","sourceRoot":"","sources":["../../src/core/frame-sequence.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9C,OAAO;QACL,MAAM;QACN,aAAa;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,QAAQ,CAAC,UAAU;YACjB,OAAO,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAA4B;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CACnB,MAAqC,EACrC,UAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,KAAK;QACL,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,KAAK,EAAE,UAAU;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAyB;IACnD,IAAI,cAAc,IAAI,KAAK,IAAI,eAAe,IAAI,KAAK,EAAE,CAAC;QACxD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,YAAY;YACzB,MAAM,EAAE,KAAK,CAAC,aAAa;SAC5B,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC1C,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createSpriteSheet } from "./sprite-sheet.js";
|
|
2
|
+
export { createFrameSequence } from "./frame-sequence.js";
|
|
2
3
|
export { createAnimationPlayer } from "./animation-player.js";
|
|
3
|
-
export { loadSpriteSheetImage } from "./asset-loader.js";
|
|
4
|
+
export { loadFrameSequence, loadSpriteSheetImage } from "./asset-loader.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createSpriteSheet } from "./sprite-sheet.js";
|
|
2
|
+
export { createFrameSequence } from "./frame-sequence.js";
|
|
2
3
|
export { createAnimationPlayer } from "./animation-player.js";
|
|
3
|
-
export { loadSpriteSheetImage } from "./asset-loader.js";
|
|
4
|
+
export { loadFrameSequence, loadSpriteSheetImage } from "./asset-loader.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprite-sheet.d.ts","sourceRoot":"","sources":["../../src/core/sprite-sheet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sprite-sheet.d.ts","sourceRoot":"","sources":["../../src/core/sprite-sheet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EACX,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAqBxE"}
|
|
@@ -9,6 +9,13 @@ export function createSpriteSheet(config) {
|
|
|
9
9
|
getFrameRect(frameIndex) {
|
|
10
10
|
return getFrameRect(normalizedGrid, frameIndex);
|
|
11
11
|
},
|
|
12
|
+
getFrame(frameIndex) {
|
|
13
|
+
const frame = getFrameRect(normalizedGrid, frameIndex);
|
|
14
|
+
return {
|
|
15
|
+
...frame,
|
|
16
|
+
image: config.image,
|
|
17
|
+
};
|
|
18
|
+
},
|
|
12
19
|
};
|
|
13
20
|
}
|
|
14
21
|
function normalizeGrid(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprite-sheet.js","sourceRoot":"","sources":["../../src/core/sprite-sheet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sprite-sheet.js","sourceRoot":"","sources":["../../src/core/sprite-sheet.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,cAAc;QACpB,aAAa;YACX,OAAO,cAAc,CAAC,WAAW,CAAC;QACpC,CAAC;QACD,YAAY,CAAC,UAAU;YACrB,OAAO,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QACD,QAAQ,CAAC,UAAU;YACjB,MAAM,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAEvD,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAyB;IAC9C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAE/D,IAAI,UAAU,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,GAAG,IAAI,CAAC;IAE9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,WAAW,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO;QACL,UAAU;QACV,WAAW;QACX,OAAO;QACP,IAAI;QACJ,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,IAAyC,EACzC,UAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvD,OAAO;QACL,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,UAAU;QAChC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,WAAW;QAC9B,KAAK,EAAE,IAAI,CAAC,UAAU;QACtB,MAAM,EAAE,IAAI,CAAC,WAAW;QACxB,KAAK,EAAE,UAAU;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-canvas-sprite-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/create-canvas-sprite-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"create-canvas-sprite-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/create-canvas-sprite-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAErB,wBAAgB,0BAA0B,IAAI,oBAAoB,CA0BjE"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export function createCanvasSpriteRenderer() {
|
|
2
2
|
return {
|
|
3
|
-
draw(context,
|
|
4
|
-
const frame =
|
|
3
|
+
draw(context, source, options) {
|
|
4
|
+
const frame = source.getFrame(options.frameIndex);
|
|
5
5
|
const scale = options.scale ?? 1;
|
|
6
6
|
const destinationWidth = options.destinationWidth ?? frame.width * scale;
|
|
7
7
|
const destinationHeight = options.destinationHeight ?? frame.height * scale;
|
|
8
|
-
context.drawImage(
|
|
8
|
+
context.drawImage(frame.image, frame.x, frame.y, frame.width, frame.height, options.position.x, options.position.y, destinationWidth, destinationHeight);
|
|
9
9
|
},
|
|
10
10
|
};
|
|
11
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-canvas-sprite-renderer.js","sourceRoot":"","sources":["../../src/renderers/create-canvas-sprite-renderer.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,IAAI,CACF,OAAiC,EACjC,
|
|
1
|
+
{"version":3,"file":"create-canvas-sprite-renderer.js","sourceRoot":"","sources":["../../src/renderers/create-canvas-sprite-renderer.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,IAAI,CACF,OAAiC,EACjC,MAA4B,EAC5B,OAA0B;YAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YACjC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACzE,MAAM,iBAAiB,GACrB,OAAO,CAAC,iBAAiB,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpD,OAAO,CAAC,SAAS,CACf,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,EACZ,OAAO,CAAC,QAAQ,CAAC,CAAC,EAClB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAClB,gBAAgB,EAChB,iBAAiB,CAClB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export interface SpriteSheetGrid {
|
|
|
6
6
|
totalFrames?: number;
|
|
7
7
|
}
|
|
8
8
|
export type SpriteSheetImageSource = string | HTMLImageElement | ImageBitmap;
|
|
9
|
+
export type FrameImageSource = SpriteSheetImageSource;
|
|
10
|
+
export type FrameSequenceImage = HTMLImageElement | ImageBitmap | HTMLCanvasElement | OffscreenCanvas;
|
|
9
11
|
export interface LoadSpriteSheetImageOptions {
|
|
10
12
|
crossOrigin?: string;
|
|
11
13
|
}
|
|
@@ -14,6 +16,11 @@ export interface LoadedSpriteSheetImage {
|
|
|
14
16
|
width: number;
|
|
15
17
|
height: number;
|
|
16
18
|
}
|
|
19
|
+
export interface LoadedFrameImage {
|
|
20
|
+
image: HTMLImageElement | ImageBitmap;
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
}
|
|
17
24
|
export interface SpriteSheetConfig {
|
|
18
25
|
image: CanvasImageSource;
|
|
19
26
|
grid: SpriteSheetGrid;
|
|
@@ -25,11 +32,29 @@ export interface FrameRect {
|
|
|
25
32
|
height: number;
|
|
26
33
|
index: number;
|
|
27
34
|
}
|
|
35
|
+
export interface DrawableFrame extends FrameRect {
|
|
36
|
+
image: CanvasImageSource;
|
|
37
|
+
}
|
|
28
38
|
export interface SpriteSheet {
|
|
29
39
|
readonly image: CanvasImageSource;
|
|
30
40
|
readonly grid: Required<SpriteSheetGrid>;
|
|
31
41
|
getFrameCount(): number;
|
|
32
42
|
getFrameRect(frameIndex: number): FrameRect;
|
|
43
|
+
getFrame(frameIndex: number): DrawableFrame;
|
|
44
|
+
}
|
|
45
|
+
export interface FrameSequenceConfig {
|
|
46
|
+
frames: FrameSequenceImage[];
|
|
47
|
+
}
|
|
48
|
+
export interface FrameSequence {
|
|
49
|
+
readonly frames: readonly FrameSequenceImage[];
|
|
50
|
+
getFrameCount(): number;
|
|
51
|
+
getFrame(frameIndex: number): DrawableFrame;
|
|
52
|
+
}
|
|
53
|
+
export interface LoadFrameSequenceOptions extends LoadSpriteSheetImageOptions {
|
|
54
|
+
}
|
|
55
|
+
export interface AnimationFrameSource {
|
|
56
|
+
getFrameCount(): number;
|
|
57
|
+
getFrame(frameIndex: number): DrawableFrame;
|
|
33
58
|
}
|
|
34
59
|
export interface AnimationTimingConfig {
|
|
35
60
|
fps?: number;
|
|
@@ -68,6 +93,6 @@ export interface DrawSpriteOptions {
|
|
|
68
93
|
destinationHeight?: number;
|
|
69
94
|
}
|
|
70
95
|
export interface CanvasSpriteRenderer {
|
|
71
|
-
draw(context: CanvasRenderingContext2D,
|
|
96
|
+
draw(context: CanvasRenderingContext2D, source: AnimationFrameSource, options: DrawSpriteOptions): void;
|
|
72
97
|
}
|
|
73
98
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,gBAAgB,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitykovskiy/canvas-sprite-animations",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Framework-agnostic sprite animation library for HTML canvas.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"clean": "node -e \"import('node:fs/promises').then(fs => fs.rm('dist', { recursive: true, force: true }))\"",
|
|
35
|
-
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
35
|
+
"typecheck": "vue-tsc --noEmit -p tsconfig.json",
|
|
36
36
|
"build": "npm run clean && tsc -p tsconfig.build.json",
|
|
37
37
|
"build:types": "tsc -p tsconfig.build.json",
|
|
38
38
|
"test": "npm run build && node --test tests/**/*.test.mjs",
|
|
@@ -61,7 +61,10 @@
|
|
|
61
61
|
"node": ">=22.0.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
+
"@vitejs/plugin-vue": "^6.0.1",
|
|
64
65
|
"typescript": "^5.8.3",
|
|
65
|
-
"vite": "^7.1.5"
|
|
66
|
+
"vite": "^7.1.5",
|
|
67
|
+
"vue": "^3.5.13",
|
|
68
|
+
"vue-tsc": "^3.0.7"
|
|
66
69
|
}
|
|
67
70
|
}
|