@kurot/spine-4.3 0.2.3

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,203 @@
1
+ import { EventEmitter } from './EventEmitter.js';
2
+ /**
3
+ * Manages a queue of animations on a single Spine track.
4
+ *
5
+ * Animations are played sequentially. Each entry can specify a loop count
6
+ * and lifecycle callbacks. Promise-based helpers allow `await`-ing events.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const track = hero.start(0);
11
+ * track.add('idle', 0); // loop forever
12
+ * track.add('attack', 1); // play once, then continue queue
13
+ * await track.waitPlayEnd();
14
+ * ```
15
+ */
16
+ export class Track extends EventEmitter {
17
+ // ── Instance fields ───────────────────────────────────────────────────────
18
+ trackID;
19
+ skelAnimation;
20
+ trackEntry;
21
+ _animations = [];
22
+ _disposed = false;
23
+ _loop = 0;
24
+ _stateListener;
25
+ // ── Constructor ───────────────────────────────────────────────────────────
26
+ constructor(skelAnimation, trackID) {
27
+ super();
28
+ this.trackID = trackID;
29
+ this.skelAnimation = skelAnimation;
30
+ this._stateListener = {
31
+ complete: () => this._onComplete(),
32
+ interrupt: () => this._onInterrupt(),
33
+ event: (_, event) => this._onCustomEvent(event),
34
+ start: undefined,
35
+ end: undefined,
36
+ dispose: undefined,
37
+ };
38
+ }
39
+ // ── Public methods ────────────────────────────────────────────────────────
40
+ /**
41
+ * Add an animation to the queue.
42
+ * @param name Animation name as defined in the Spine editor.
43
+ * @param loop Number of times to play. 0 = loop forever.
44
+ * @param listener Optional lifecycle callbacks for this animation.
45
+ */
46
+ add(name, loop = 1, listener) {
47
+ if (!this._disposed && this._animations) {
48
+ this._animations.push({ name, loop, listener });
49
+ if (this._animations.length === 1) {
50
+ this._playNext();
51
+ }
52
+ }
53
+ return this;
54
+ }
55
+ /**
56
+ * Jump the track entry to its last frame.
57
+ */
58
+ setToLastFrame() {
59
+ const entry = this.trackEntry;
60
+ if (entry) {
61
+ entry['animationStart'] = entry['animationLast'] = entry['animationEnd'];
62
+ }
63
+ }
64
+ // ── Promise helpers ───────────────────────────────────────────────────────
65
+ /**
66
+ * Resolves when the current animation's first loop begins.
67
+ */
68
+ waitPlayStart() {
69
+ return new Promise(resolve => this.once(0 /* SpineEvent.PlayStart */, resolve));
70
+ }
71
+ /**
72
+ * Resolves when the current animation finishes all its loops.
73
+ */
74
+ waitPlayEnd() {
75
+ return new Promise(resolve => this.once(1 /* SpineEvent.PlayEnd */, resolve));
76
+ }
77
+ /**
78
+ * Resolves at the start of each loop iteration.
79
+ */
80
+ waitLoopStart() {
81
+ return new Promise(resolve => this.once(2 /* SpineEvent.LoopStart */, resolve));
82
+ }
83
+ /**
84
+ * Resolves at the end of each loop iteration.
85
+ */
86
+ waitLoopEnd() {
87
+ return new Promise(resolve => this.once(3 /* SpineEvent.LoopEnd */, resolve));
88
+ }
89
+ /**
90
+ * Resolves when the track is interrupted by another animation.
91
+ */
92
+ waitInterrupt() {
93
+ return new Promise(resolve => this.once(4 /* SpineEvent.Interrupt */, resolve));
94
+ }
95
+ /**
96
+ * Resolves when the entire animation queue is exhausted.
97
+ */
98
+ waitTrackEnd() {
99
+ return new Promise(resolve => this.once(6 /* SpineEvent.TrackEnd */, resolve));
100
+ }
101
+ /**
102
+ * Resolves on the next Spine frame event.
103
+ */
104
+ waitEvent() {
105
+ return new Promise(resolve => this.once(5 /* SpineEvent.Custom */, resolve));
106
+ }
107
+ /**
108
+ * Resolves when a Spine frame event with the given name fires.
109
+ */
110
+ waitNamedEvent(name) {
111
+ return new Promise(resolve => {
112
+ const callback = (event) => {
113
+ const e = event;
114
+ if (e?.data?.name === name) {
115
+ this.off(5 /* SpineEvent.Custom */, callback);
116
+ resolve(event);
117
+ }
118
+ };
119
+ this.on(5 /* SpineEvent.Custom */, callback);
120
+ });
121
+ }
122
+ // ── Private methods ───────────────────────────────────────────────────────
123
+ _playNext() {
124
+ if (this._disposed || this._animations.length === 0)
125
+ return;
126
+ const { name, listener } = this._animations[0];
127
+ if (listener) {
128
+ if (listener.playStart)
129
+ this.on(0 /* SpineEvent.PlayStart */, listener.playStart, listener);
130
+ if (listener.playEnd)
131
+ this.on(1 /* SpineEvent.PlayEnd */, listener.playEnd, listener);
132
+ if (listener.loopStart)
133
+ this.on(2 /* SpineEvent.LoopStart */, listener.loopStart, listener);
134
+ if (listener.loopEnd)
135
+ this.on(3 /* SpineEvent.LoopEnd */, listener.loopEnd, listener);
136
+ if (listener.interrupt)
137
+ this.on(4 /* SpineEvent.Interrupt */, listener.interrupt, listener);
138
+ if (listener.custom)
139
+ this.on(5 /* SpineEvent.Custom */, listener.custom, listener);
140
+ }
141
+ this._loop = 0;
142
+ this._setAnimation(name, false);
143
+ this.emit(0 /* SpineEvent.PlayStart */);
144
+ this.emit(2 /* SpineEvent.LoopStart */);
145
+ }
146
+ _setAnimation(name, loop) {
147
+ const entry = this.trackEntry;
148
+ if (entry) {
149
+ entry['listener'] = undefined;
150
+ }
151
+ this.trackEntry = this.skelAnimation.state.setAnimation(this.trackID, name, loop);
152
+ const newEntry = this.trackEntry;
153
+ newEntry['listener'] = this._stateListener;
154
+ this.skelAnimation.renderer.update(0);
155
+ }
156
+ _onComplete() {
157
+ if (this._disposed)
158
+ return;
159
+ const animation = this._animations[0];
160
+ this.emit(3 /* SpineEvent.LoopEnd */);
161
+ if (++this._loop !== animation.loop) {
162
+ this._setAnimation(animation.name, false);
163
+ this.emit(2 /* SpineEvent.LoopStart */);
164
+ }
165
+ else {
166
+ const { listener } = animation;
167
+ this.emit(1 /* SpineEvent.PlayEnd */);
168
+ this._animations.shift();
169
+ if (listener) {
170
+ this.off(0 /* SpineEvent.PlayStart */, listener.playStart);
171
+ this.off(1 /* SpineEvent.PlayEnd */, listener.playEnd);
172
+ this.off(2 /* SpineEvent.LoopStart */, listener.loopStart);
173
+ this.off(3 /* SpineEvent.LoopEnd */, listener.loopEnd);
174
+ this.off(4 /* SpineEvent.Interrupt */, listener.interrupt);
175
+ this.off(5 /* SpineEvent.Custom */, listener.custom);
176
+ }
177
+ if (this._animations.length > 0) {
178
+ this._playNext();
179
+ }
180
+ else {
181
+ const entry = this.trackEntry;
182
+ if (entry)
183
+ entry['listener'] = undefined;
184
+ this.trackEntry = undefined;
185
+ this._disposed = true;
186
+ this.emit(6 /* SpineEvent.TrackEnd */);
187
+ }
188
+ }
189
+ }
190
+ _onInterrupt() {
191
+ if (this._disposed)
192
+ return;
193
+ this._disposed = true;
194
+ this._animations.length = 0;
195
+ this.emit(4 /* SpineEvent.Interrupt */);
196
+ }
197
+ _onCustomEvent(event) {
198
+ if (!this._disposed) {
199
+ this.emit(5 /* SpineEvent.Custom */, event);
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=Track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Track.js","sourceRoot":"","sources":["../../src/kurot/Track.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@kurot/spine-4.3",
3
+ "version": "0.2.3",
4
+ "description": "Spine 4.3 runtime for the Kurot engine",
5
+ "author": "",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist/**/*"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc --build",
22
+ "dev": "tsc --watch",
23
+ "example": "vite --config vite.config.ts",
24
+ "clean": "rm -rf dist",
25
+ "prepublishOnly": "npm run clean && npm run build"
26
+ },
27
+ "dependencies": {
28
+ "@esotericsoftware/spine-core": "~4.3.0"
29
+ },
30
+ "peerDependencies": {
31
+ "@kurot/core": "^1.0.12"
32
+ },
33
+ "devDependencies": {
34
+ "@kurot/core": "^1.0.12",
35
+ "@types/node": "^22.0.0",
36
+ "typescript": "^5.6.0",
37
+ "vite": "^8.0.8"
38
+ },
39
+ "keywords": [
40
+ "kurot",
41
+ "spine",
42
+ "h5-game",
43
+ "typescript"
44
+ ],
45
+ "packageManager": "pnpm@10.33.0",
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/kurot-engine/kurot.git",
49
+ "directory": "packages/spine-4.3"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ }
54
+ }