109 lines
4.1 KiB
JavaScript
109 lines
4.1 KiB
JavaScript
// === 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(); |