Create spritesheets for your game development and animation projects with our completely free, open-source spritesheet generator.
This powerful online tool lets you upload individual sprite images and automatically arrange them into optimized sprite sheets with customizable layouts - perfect for indie developers, animators, and studios of any size.
+
How it works:
+
diff --git a/src/assets/tut2.mp4 b/src/assets/tut2.mp4
new file mode 100644
index 0000000..60f0cac
Binary files /dev/null and b/src/assets/tut2.mp4 differ
diff --git a/src/components/SpritesheetSplitter.vue b/src/components/SpritesheetSplitter.vue
index 29c8505..3e842bd 100644
--- a/src/components/SpritesheetSplitter.vue
+++ b/src/components/SpritesheetSplitter.vue
@@ -610,15 +610,23 @@
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
- // Initialize worker lazily
+ // Initialize worker lazily using Vite worker syntax
if (!irregularWorker.value) {
- irregularWorker.value = new Worker('/src/workers/irregularSpriteDetection.worker.ts', { type: 'module' });
+ try {
+ irregularWorker.value = new Worker(new URL('../workers/irregularSpriteDetection.worker.ts', import.meta.url), { type: 'module' });
+ } catch (error) {
+ console.error('Failed to create worker:', error);
+ // Fallback to auto detection if worker fails
+ await autoDetectSprites(img);
+ return;
+ }
}
return new Promise((resolve, reject) => {
const worker = irregularWorker.value!;
const handleMessage = async (e: MessageEvent) => {
+ clearTimeout(timeout);
worker.removeEventListener('message', handleMessage);
worker.removeEventListener('error', handleError);
@@ -632,21 +640,40 @@
}
};
- const handleError = (error: ErrorEvent) => {
+ // Set timeout for worker processing
+ const timeout = setTimeout(() => {
worker.removeEventListener('message', handleMessage);
worker.removeEventListener('error', handleError);
- reject(error);
+ console.warn('Worker timeout, falling back to auto detection');
+ // Fallback to auto detection
+ autoDetectSprites(img).then(resolve).catch(reject);
+ }, 30000); // 30 second timeout
+
+ const handleError = (error: ErrorEvent) => {
+ clearTimeout(timeout);
+ worker.removeEventListener('message', handleMessage);
+ worker.removeEventListener('error', handleError);
+ console.error('Worker error, falling back to auto detection:', error);
+ // Fallback to auto detection
+ autoDetectSprites(img).then(resolve).catch(reject);
};
worker.addEventListener('message', handleMessage);
worker.addEventListener('error', handleError);
- worker.postMessage({
- type: 'detectIrregularSprites',
- imageData,
- sensitivity: sensitivity.value,
- maxSize: 2048, // Limit processing size for performance
- });
+ try {
+ worker.postMessage({
+ type: 'detectIrregularSprites',
+ imageData,
+ sensitivity: sensitivity.value,
+ maxSize: 2048, // Limit processing size for performance
+ });
+ } catch (error) {
+ clearTimeout(timeout);
+ console.error('Failed to post message to worker:', error);
+ // Fallback to auto detection
+ autoDetectSprites(img).then(resolve).catch(reject);
+ }
});
}