Files
void-genesis/dev/sector-dev/sector-frontend/scripts/generate-spritesheets.js
T

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();