custom-pixi-particles 7.4.0 → 7.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.
Files changed (44) hide show
  1. package/README.md +1000 -20
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/behaviour/SubEmitterBehaviour.d.ts +0 -0
  6. package/dist/lib/behaviour/SubEmitterBehaviour.js +1 -0
  7. package/dist/lib/behaviour/SubEmitterBehaviour.js.map +1 -0
  8. package/dist/lib/effects/DissolveEffect.d.ts +28 -0
  9. package/dist/lib/effects/DissolveEffect.js +204 -0
  10. package/dist/lib/effects/DissolveEffect.js.map +1 -0
  11. package/dist/lib/effects/GhostEffect.d.ts +32 -0
  12. package/dist/lib/effects/GhostEffect.js +123 -0
  13. package/dist/lib/effects/GhostEffect.js.map +1 -0
  14. package/dist/lib/effects/GlitchEffect.d.ts +25 -0
  15. package/dist/lib/effects/GlitchEffect.js +144 -0
  16. package/dist/lib/effects/GlitchEffect.js.map +1 -0
  17. package/dist/lib/effects/MagneticAssemblyEffect.d.ts +27 -0
  18. package/dist/lib/effects/MagneticAssemblyEffect.js +194 -0
  19. package/dist/lib/effects/MagneticAssemblyEffect.js.map +1 -0
  20. package/dist/lib/effects/MeltEffect.d.ts +27 -0
  21. package/dist/lib/effects/MeltEffect.js +188 -0
  22. package/dist/lib/effects/MeltEffect.js.map +1 -0
  23. package/dist/lib/effects/ShatterEffect.d.ts +40 -0
  24. package/dist/lib/effects/ShatterEffect.js +236 -0
  25. package/dist/lib/effects/ShatterEffect.js.map +1 -0
  26. package/dist/lib/effects/index.d.ts +12 -0
  27. package/dist/lib/effects/index.js +13 -0
  28. package/dist/lib/effects/index.js.map +1 -0
  29. package/dist/lib/emission/RandomEmission.js +3 -3
  30. package/dist/lib/emission/RandomEmission.js.map +1 -1
  31. package/dist/lib/emission/StandardEmission.js +10 -4
  32. package/dist/lib/emission/StandardEmission.js.map +1 -1
  33. package/dist/lib/emission/UniformEmission.js +10 -1
  34. package/dist/lib/emission/UniformEmission.js.map +1 -1
  35. package/dist/lib/emitter/Emitter.js +7 -1
  36. package/dist/lib/emitter/Emitter.js.map +1 -1
  37. package/dist/lib/index.d.ts +2 -0
  38. package/dist/lib/index.js +2 -0
  39. package/dist/lib/index.js.map +1 -1
  40. package/dist/lib/pixi/Renderer.js +17 -13
  41. package/dist/lib/pixi/Renderer.js.map +1 -1
  42. package/dist/lib/pixi/TestRenderer.js +17 -13
  43. package/dist/lib/pixi/TestRenderer.js.map +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ import { ParticleContainer, Sprite } from 'pixi.js';
2
+ export type AssemblyMode = 'random-scatter' | 'from-center' | 'off-screen' | 'vortex';
3
+ export interface IMagneticAssemblyOptions {
4
+ gridCols?: number;
5
+ gridRows?: number;
6
+ duration?: number;
7
+ easing?: string;
8
+ scatterRange?: number;
9
+ stagger?: number;
10
+ mode?: AssemblyMode;
11
+ startAlpha?: number;
12
+ }
13
+ export default class MagneticAssemblyEffect extends ParticleContainer {
14
+ private sourceSprite;
15
+ private fragments;
16
+ private isProcessing;
17
+ private options;
18
+ private currentTime;
19
+ private assemblyResolve?;
20
+ constructor(sourceSprite: Sprite, options?: IMagneticAssemblyOptions);
21
+ private prepare;
22
+ assemble(): Promise<void>;
23
+ private update;
24
+ private applyEasing;
25
+ private finish;
26
+ static assemble(sprite: Sprite, options?: IMagneticAssemblyOptions): Promise<void>;
27
+ }
@@ -0,0 +1,194 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { ParticleContainer, Rectangle, Sprite, Texture, Ticker } from 'pixi.js';
11
+ import ParticlePool from '../ParticlePool';
12
+ import Random from '../util/Random';
13
+ export default class MagneticAssemblyEffect extends ParticleContainer {
14
+ constructor(sourceSprite, options = {}) {
15
+ var _a, _b, _c, _d, _e, _f, _g, _h;
16
+ const cols = (_a = options.gridCols) !== null && _a !== void 0 ? _a : 10;
17
+ const rows = (_b = options.gridRows) !== null && _b !== void 0 ? _b : 10;
18
+ super(cols * rows, {
19
+ vertices: true,
20
+ position: true,
21
+ uvs: true,
22
+ alpha: true,
23
+ rotation: true,
24
+ });
25
+ this.sourceSprite = sourceSprite;
26
+ this.fragments = [];
27
+ this.isProcessing = false;
28
+ this.currentTime = 0;
29
+ this.options = {
30
+ gridCols: cols,
31
+ gridRows: rows,
32
+ duration: (_c = options.duration) !== null && _c !== void 0 ? _c : 2.0,
33
+ easing: (_d = options.easing) !== null && _d !== void 0 ? _d : 'back.out',
34
+ scatterRange: (_e = options.scatterRange) !== null && _e !== void 0 ? _e : 500,
35
+ stagger: (_f = options.stagger) !== null && _f !== void 0 ? _f : 0.5,
36
+ mode: (_g = options.mode) !== null && _g !== void 0 ? _g : 'random-scatter',
37
+ startAlpha: (_h = options.startAlpha) !== null && _h !== void 0 ? _h : 0,
38
+ };
39
+ // Match source sprite transform
40
+ this.x = sourceSprite.x;
41
+ this.y = sourceSprite.y;
42
+ this.rotation = sourceSprite.rotation;
43
+ }
44
+ prepare() {
45
+ const texture = this.sourceSprite.texture;
46
+ if (!texture || !texture.valid)
47
+ return;
48
+ const { gridCols, gridRows, scatterRange, mode, stagger } = this.options;
49
+ const texFrame = texture.frame;
50
+ const stepW = texFrame.width / gridCols;
51
+ const stepH = texFrame.height / gridRows;
52
+ const scale = this.sourceSprite.scale.x;
53
+ const anchorX = this.sourceSprite.anchor.x;
54
+ const anchorY = this.sourceSprite.anchor.y;
55
+ for (let row = 0; row < gridRows; row++) {
56
+ for (let col = 0; col < gridCols; col++) {
57
+ const x1 = Math.floor(col * stepW);
58
+ const y1 = Math.floor(row * stepH);
59
+ // Create sub-texture
60
+ const fragRect = new Rectangle(texFrame.x + x1, texFrame.y + y1, stepW, stepH);
61
+ const fragTex = new Texture(texture.baseTexture, fragRect);
62
+ const sprite = new Sprite(fragTex);
63
+ sprite.anchor.set(0.5);
64
+ sprite.scale.set(scale);
65
+ sprite.alpha = this.options.startAlpha;
66
+ // Destination: The original spot in the sprite
67
+ const dx = (x1 - texFrame.width * anchorX + stepW / 2) * scale;
68
+ const dy = (y1 - texFrame.height * anchorY + stepH / 2) * scale;
69
+ // Starting point logic
70
+ // tslint:disable-next-line:one-variable-per-declaration
71
+ let sx = 0, sy = 0;
72
+ switch (mode) {
73
+ case 'from-center':
74
+ sx = 0;
75
+ sy = 0;
76
+ break;
77
+ case 'off-screen':
78
+ sx = Math.random() > 0.5 ? scatterRange : -scatterRange;
79
+ sy = Random.uniform(-scatterRange, scatterRange);
80
+ break;
81
+ case 'vortex':
82
+ const angle = Math.random() * Math.PI * 2;
83
+ sx = Math.cos(angle) * scatterRange;
84
+ sy = Math.sin(angle) * scatterRange;
85
+ break;
86
+ case 'random-scatter':
87
+ default:
88
+ sx = dx + Random.uniform(-scatterRange, scatterRange);
89
+ sy = dy + Random.uniform(-scatterRange, scatterRange);
90
+ break;
91
+ }
92
+ const p = ParticlePool.global.pop();
93
+ p.reset();
94
+ // Stagger logic: pieces start at different times based on position or random
95
+ const delay = ((row * gridCols + col) / (gridCols * gridRows)) * stagger;
96
+ this.fragments.push({
97
+ sprite,
98
+ particle: p,
99
+ startX: sx,
100
+ startY: sy,
101
+ destX: dx,
102
+ destY: dy,
103
+ delay,
104
+ });
105
+ this.addChild(sprite);
106
+ }
107
+ }
108
+ this.sourceSprite.visible = false;
109
+ }
110
+ assemble() {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ this.prepare();
113
+ this.isProcessing = true;
114
+ return new Promise((resolve) => {
115
+ this.assemblyResolve = resolve;
116
+ Ticker.shared.add(this.update, this);
117
+ });
118
+ });
119
+ }
120
+ update() {
121
+ if (!this.isProcessing)
122
+ return;
123
+ const dt = Ticker.shared.deltaMS / 1000;
124
+ this.currentTime += dt;
125
+ let finished = 0;
126
+ for (let i = 0; i < this.fragments.length; i++) {
127
+ const f = this.fragments[i];
128
+ // Calculate individual progress based on delay
129
+ let p = (this.currentTime - f.delay) / (this.options.duration - f.delay);
130
+ p = Math.max(0, Math.min(1, p));
131
+ if (p > 0) {
132
+ const easedP = this.applyEasing(p, this.options.easing);
133
+ f.sprite.x = f.startX + (f.destX - f.startX) * easedP;
134
+ f.sprite.y = f.startY + (f.destY - f.startY) * easedP;
135
+ f.sprite.alpha = Math.max(this.options.startAlpha, p);
136
+ // Slight rotation adjustment to make it look "magnetic"
137
+ if (this.options.easing.includes('back')) {
138
+ f.sprite.rotation = (1 - easedP) * 0.5;
139
+ }
140
+ }
141
+ else {
142
+ f.sprite.x = f.startX;
143
+ f.sprite.y = f.startY;
144
+ }
145
+ if (p >= 1)
146
+ finished++;
147
+ }
148
+ if (finished === this.fragments.length) {
149
+ this.finish();
150
+ }
151
+ }
152
+ applyEasing(t, type) {
153
+ switch (type) {
154
+ case 'power1.inOut':
155
+ return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;
156
+ case 'bounce.out':
157
+ // tslint:disable-next-line:one-variable-per-declaration
158
+ const n1 = 7.5625, d1 = 2.75;
159
+ if (t < 1 / d1)
160
+ return n1 * t * t;
161
+ else if (t < 2 / d1)
162
+ return n1 * (t -= 1.5 / d1) * t + 0.75;
163
+ else if (t < 2.5 / d1)
164
+ return n1 * (t -= 2.25 / d1) * t + 0.9375;
165
+ else
166
+ return n1 * (t -= 2.625 / d1) * t + 0.984375;
167
+ case 'back.out':
168
+ // tslint:disable-next-line:one-variable-per-declaration
169
+ const c1 = 1.70158, c3 = c1 + 1;
170
+ return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);
171
+ default:
172
+ return t; // linear
173
+ }
174
+ }
175
+ finish() {
176
+ var _a;
177
+ this.isProcessing = false;
178
+ Ticker.shared.remove(this.update, this);
179
+ this.sourceSprite.visible = true; // Restore original
180
+ (_a = this.assemblyResolve) === null || _a === void 0 ? void 0 : _a.call(this);
181
+ }
182
+ static assemble(sprite_1) {
183
+ return __awaiter(this, arguments, void 0, function* (sprite, options = {}) {
184
+ if (!sprite.parent)
185
+ return;
186
+ const effect = new MagneticAssemblyEffect(sprite, options);
187
+ const index = sprite.parent.getChildIndex(sprite);
188
+ sprite.parent.addChildAt(effect, index);
189
+ yield effect.assemble();
190
+ effect.destroy({ children: true });
191
+ });
192
+ }
193
+ }
194
+ //# sourceMappingURL=MagneticAssemblyEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagneticAssemblyEffect.js","sourceRoot":"","sources":["../../../src/lib/effects/MagneticAssemblyEffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Container, Sprite } from 'pixi.js';
2
+ export interface IMeltEffectOptions {
3
+ gridCols?: number;
4
+ gridRows?: number;
5
+ gravity?: number;
6
+ viscosity?: number;
7
+ horizontalSpread?: number;
8
+ duration?: number;
9
+ blurAmount?: number;
10
+ threshold?: number;
11
+ }
12
+ export default class MeltEffect extends Container {
13
+ private sourceSprite;
14
+ private fragments;
15
+ private isProcessing;
16
+ private options;
17
+ private meltResolve?;
18
+ private pContainer;
19
+ private currentTime;
20
+ constructor(sourceSprite: Sprite, options?: IMeltEffectOptions);
21
+ private prepare;
22
+ start(): Promise<void>;
23
+ private update;
24
+ private removeFragment;
25
+ private finish;
26
+ static melt(sprite: Sprite, options?: IMeltEffectOptions): Promise<void>;
27
+ }
@@ -0,0 +1,188 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Container, Filter, ParticleContainer, Rectangle, Sprite, Texture, Ticker } from 'pixi.js';
11
+ import ParticlePool from '../ParticlePool';
12
+ import Random from '../util/Random';
13
+ // Simple blur shader (box blur)
14
+ const blurFrag = `
15
+ precision mediump float;
16
+ varying vec2 vTextureCoord;
17
+ uniform sampler2D uSampler;
18
+ uniform float uBlur;
19
+
20
+ void main(void) {
21
+ vec4 sum = vec4(0.0);
22
+ float blurAmount = uBlur * 0.01; // Scale blur amount
23
+
24
+ // Sample 9 pixels in a 3x3 grid
25
+ for(int i = -1; i <= 1; i++) {
26
+ for(int j = -1; j <= 1; j++) {
27
+ vec2 offset = vec2(float(i), float(j)) * blurAmount;
28
+ sum += texture2D(uSampler, vTextureCoord + offset);
29
+ }
30
+ }
31
+
32
+ gl_FragColor = sum / 9.0;
33
+ }
34
+ `;
35
+ // Simple threshold shader to create the "Metaball" effect
36
+ const thresholdFrag = `
37
+ varying vec2 vTextureCoord;
38
+ uniform sampler2D uSampler;
39
+ uniform float threshold;
40
+ void main(void) {
41
+ vec4 color = texture2D(uSampler, vTextureCoord);
42
+ if (color.a > threshold) {
43
+ color.a = 1.0;
44
+ } else {
45
+ color.a = 0.0;
46
+ }
47
+ gl_FragColor = color;
48
+ }
49
+ `;
50
+ export default class MeltEffect extends Container {
51
+ constructor(sourceSprite, options = {}) {
52
+ var _a, _b, _c, _d, _e, _f, _g, _h;
53
+ super();
54
+ this.sourceSprite = sourceSprite;
55
+ this.fragments = [];
56
+ this.isProcessing = false;
57
+ this.currentTime = 0;
58
+ const cols = (_a = options.gridCols) !== null && _a !== void 0 ? _a : 15;
59
+ const rows = (_b = options.gridRows) !== null && _b !== void 0 ? _b : 15;
60
+ this.options = {
61
+ gridCols: cols,
62
+ gridRows: rows,
63
+ gravity: (_c = options.gravity) !== null && _c !== void 0 ? _c : 1200,
64
+ viscosity: (_d = options.viscosity) !== null && _d !== void 0 ? _d : 0.98,
65
+ horizontalSpread: (_e = options.horizontalSpread) !== null && _e !== void 0 ? _e : 50,
66
+ duration: (_f = options.duration) !== null && _f !== void 0 ? _f : 2.5,
67
+ blurAmount: (_g = options.blurAmount) !== null && _g !== void 0 ? _g : 6,
68
+ threshold: (_h = options.threshold) !== null && _h !== void 0 ? _h : 0.5,
69
+ };
70
+ // We use a internal ParticleContainer so we can apply filters to it
71
+ this.pContainer = new ParticleContainer(cols * rows, {
72
+ vertices: true,
73
+ position: true,
74
+ uvs: true,
75
+ alpha: true,
76
+ tint: true,
77
+ });
78
+ this.addChild(this.pContainer);
79
+ this.x = sourceSprite.x;
80
+ this.y = sourceSprite.y;
81
+ this.rotation = sourceSprite.rotation;
82
+ // Apply the Metaball Hook: Blur + Threshold
83
+ const blurFilter = new Filter(undefined, blurFrag, {
84
+ uBlur: this.options.blurAmount,
85
+ });
86
+ const thresholdFilter = new Filter(undefined, thresholdFrag, {
87
+ threshold: this.options.threshold,
88
+ });
89
+ this.pContainer.filters = [blurFilter, thresholdFilter];
90
+ }
91
+ prepare() {
92
+ const texture = this.sourceSprite.texture;
93
+ if (!texture || !texture.valid)
94
+ return;
95
+ const { gridCols, gridRows, horizontalSpread } = this.options;
96
+ const texFrame = texture.frame;
97
+ const stepW = texFrame.width / gridCols;
98
+ const stepH = texFrame.height / gridRows;
99
+ const scale = this.sourceSprite.scale.x;
100
+ const anchorX = this.sourceSprite.anchor.x;
101
+ const anchorY = this.sourceSprite.anchor.y;
102
+ for (let row = 0; row < gridRows; row++) {
103
+ for (let col = 0; col < gridCols; col++) {
104
+ const x1 = Math.floor(col * stepW);
105
+ const y1 = Math.floor(row * stepH);
106
+ const fragRect = new Rectangle(texFrame.x + x1, texFrame.y + y1, stepW, stepH);
107
+ const fragTex = new Texture(texture.baseTexture, fragRect);
108
+ const sprite = new Sprite(fragTex);
109
+ sprite.anchor.set(0.5);
110
+ sprite.scale.set(scale);
111
+ const lx = (x1 - texFrame.width * anchorX + stepW / 2) * scale;
112
+ const ly = (y1 - texFrame.height * anchorY + stepH / 2) * scale;
113
+ const p = ParticlePool.global.pop();
114
+ p.reset();
115
+ p.x = lx;
116
+ p.y = ly;
117
+ // High gravity, low horizontal velocity
118
+ p.velocity.set(Random.uniform(-horizontalSpread, horizontalSpread), Random.uniform(0, 50));
119
+ this.fragments.push({ sprite, particle: p });
120
+ this.pContainer.addChild(sprite);
121
+ }
122
+ }
123
+ this.sourceSprite.visible = false;
124
+ }
125
+ start() {
126
+ return __awaiter(this, void 0, void 0, function* () {
127
+ this.prepare();
128
+ this.isProcessing = true;
129
+ return new Promise((resolve) => {
130
+ this.meltResolve = resolve;
131
+ Ticker.shared.add(this.update, this);
132
+ });
133
+ });
134
+ }
135
+ update() {
136
+ if (!this.isProcessing)
137
+ return;
138
+ const dt = Ticker.shared.deltaMS / 1000;
139
+ this.currentTime += dt;
140
+ for (let i = this.fragments.length - 1; i >= 0; i--) {
141
+ const f = this.fragments[i];
142
+ const p = f.particle;
143
+ // Gravity and Viscosity
144
+ p.velocity.y += this.options.gravity * dt;
145
+ p.velocity.x *= this.options.viscosity;
146
+ p.velocity.y *= this.options.viscosity;
147
+ p.x += p.velocity.x * dt;
148
+ p.y += p.velocity.y * dt;
149
+ f.sprite.x = p.x;
150
+ f.sprite.y = p.y;
151
+ // Gradually shrink fragments so the liquid "dries up"
152
+ const lifeRatio = 1 - this.currentTime / this.options.duration;
153
+ f.sprite.scale.set(this.sourceSprite.scale.x * lifeRatio);
154
+ if (lifeRatio <= 0) {
155
+ this.removeFragment(i);
156
+ }
157
+ }
158
+ if (this.fragments.length === 0) {
159
+ this.finish();
160
+ }
161
+ }
162
+ removeFragment(index) {
163
+ const f = this.fragments[index];
164
+ if (f.particle)
165
+ ParticlePool.global.push(f.particle);
166
+ this.pContainer.removeChild(f.sprite);
167
+ f.sprite.destroy();
168
+ this.fragments.splice(index, 1);
169
+ }
170
+ finish() {
171
+ var _a;
172
+ this.isProcessing = false;
173
+ Ticker.shared.remove(this.update, this);
174
+ (_a = this.meltResolve) === null || _a === void 0 ? void 0 : _a.call(this);
175
+ }
176
+ static melt(sprite_1) {
177
+ return __awaiter(this, arguments, void 0, function* (sprite, options = {}) {
178
+ if (!sprite.parent)
179
+ return;
180
+ const effect = new MeltEffect(sprite, options);
181
+ const index = sprite.parent.getChildIndex(sprite);
182
+ sprite.parent.addChildAt(effect, index);
183
+ yield effect.start();
184
+ effect.destroy({ children: true });
185
+ });
186
+ }
187
+ }
188
+ //# sourceMappingURL=MeltEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeltEffect.js","sourceRoot":"","sources":["../../../src/lib/effects/MeltEffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { ParticleContainer, Sprite } from 'pixi.js';
2
+ export type ShatterMode = 'radial' | 'directional' | 'swirl';
3
+ export interface IShatterEffectOptions {
4
+ gridCols?: number;
5
+ gridRows?: number;
6
+ explosionPower?: number;
7
+ friction?: number;
8
+ gravity?: number;
9
+ turbulence?: number;
10
+ lifetime?: number;
11
+ fadeOutDuration?: number;
12
+ mode?: ShatterMode;
13
+ explosionOrigin?: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ blastDirection?: number;
18
+ swirlStrength?: number;
19
+ randomizeScale?: boolean;
20
+ endTint?: number;
21
+ enableRotation?: boolean;
22
+ rotationStrength?: number;
23
+ }
24
+ export default class ShatterEffect extends ParticleContainer {
25
+ private sourceSprite;
26
+ private fragments;
27
+ private isExploded;
28
+ private options;
29
+ private isCleanedUp;
30
+ private explodeResolve?;
31
+ constructor(sourceSprite: Sprite, options?: IShatterEffectOptions);
32
+ private createFragments;
33
+ Explode(): Promise<void>;
34
+ private update;
35
+ private lerpColor;
36
+ private removeFragment;
37
+ private finish;
38
+ destroy(options?: any): void;
39
+ static shatter(sprite: Sprite, options?: IShatterEffectOptions): Promise<void>;
40
+ }