// === File: sector-frontend/scripts/generate-spritesheets.js === import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import texturePacker from 'free-tex-packer-core'; // ES-Modul Workaround für __dirname const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // ---------------------------------------------------------------------- // Pfad-Konfiguration // ---------------------------------------------------------------------- // Der Hauptordner, in dem wir Unterordner für die verschiedenen Kategorien anlegen. const RAW_ASSETS_DIR = path.resolve(__dirname, '../src/raw-assets'); // Zielordner für die fertigen Atlanten, die dann in der App geladen werden. const OUTPUT_DIR = path.resolve(__dirname, '../src/assets'); /** * Durchsucht den RAW_ASSETS_DIR nach Unterordnern und generiert * für jeden gefundenen Ordner ein separates Sprite-Sheet. */ async function buildAllSpriteSheets() { console.log(`[Packer] Prüfe Hauptverzeichnis: ${RAW_ASSETS_DIR}`); // Hauptordner erstellen, falls er nicht existiert if (!fs.existsSync(RAW_ASSETS_DIR)) { fs.mkdirSync(RAW_ASSETS_DIR, { recursive: true }); console.log('[Packer] Quellordner existierte nicht und wurde erstellt. Bitte Unterordner (z.B. "icons") anlegen und Bilder einfügen.'); return; } // Lese alle Einträge im Hauptordner aus const entries = fs.readdirSync(RAW_ASSETS_DIR, { withFileTypes: true }); // Filtere nur die Verzeichnisse (Unterordner) heraus const directories = entries.filter(entry => entry.isDirectory()).map(dir => dir.name); if (directories.length === 0) { console.log('[Packer] Keine Unterordner in raw-assets gefunden. Bitte lege Ordner wie "icons" oder "frames" an.'); return; } // Zielordner erstellen, falls nicht vorhanden if (!fs.existsSync(OUTPUT_DIR)) { fs.mkdirSync(OUTPUT_DIR, { recursive: true }); } // Schleife durch alle gefundenen Unterordner for (const folderName of directories) { const currentDirPath = path.join(RAW_ASSETS_DIR, folderName); const files = fs.readdirSync(currentDirPath); const images = []; // Suche nach PNG-Dateien im aktuellen Unterordner for (const file of files) { if (file.endsWith('.png')) { const filePath = path.join(currentDirPath, file); images.push({ path: file, contents: fs.readFileSync(filePath) }); } } if (images.length === 0) { console.log(`[Packer] Überspringe Ordner '${folderName}' (keine PNG-Dateien gefunden).`); continue; // Zum nächsten Ordner springen } // Konfiguration für DIESEN spezifischen Atlas const options = { textureName: folderName, // Der Name des Ordners wird zum Namen der generierten Dateien width: 4096, height: 4096, padding: 2, allowRotation: false, exporter: 'Pixi', removeFileExtension: true }; console.log(`[Packer] Verpacke ${images.length} Bilder aus dem Ordner '${folderName}'...`); // Packer-Aufruf in ein Promise wickeln, um asynchrones Verarbeiten sauber abzuarbeiten await new Promise((resolve, reject) => { texturePacker(images, options, (packedFiles, error) => { if (error) { console.error(`[Packer] Fehler beim Erstellen des Atlases für '${folderName}':`, error); reject(error); return; } // Generierte Dateien speichern (.png und .json) for (const item of packedFiles) { const outPath = path.join(OUTPUT_DIR, item.name); fs.writeFileSync(outPath, item.buffer); console.log(`[Packer] Gespeichert: ${outPath}`); } resolve(); }); }); } console.log('[Packer] Alle Sprite-Sheets wurden erfolgreich generiert!'); } // Skript ausführen buildAllSpriteSheets();