Skip to content

Instantly share code, notes, and snippets.

@blopa
Created June 20, 2021 12:30
Show Gist options
  • Save blopa/9374729f151c8e13cd1b98a45c728cdd to your computer and use it in GitHub Desktop.
Save blopa/9374729f151c8e13cd1b98a45c728cdd to your computer and use it in GitHub Desktop.
Generate Atlas Sprites for Phaser using Node script
/* eslint-disable import/no-extraneous-dependencies */
const { packAsync } = require('free-tex-packer-core');
const path = require('path');
const { readFileSync, readdirSync, writeFileSync } = require('fs');
const SOURCE_SPRITES_PATH = path.resolve(__dirname, 'original-files', 'sprites');
const SPRITES_PATH = path.resolve(__dirname, 'assets', 'sprites');
// TODO make it possible to generate only one new asset with `node generate-atlas-files.js assetName`
async function generateAtlasFiles(assetName = null) {
const spritesFolders = await readdirSync(SOURCE_SPRITES_PATH);
// eslint-disable-next-line no-restricted-syntax
for (const spritesFolder of spritesFolders) {
// eslint-disable-next-line no-await-in-loop
const spritesFiles = await readdirSync(path.resolve(__dirname, SOURCE_SPRITES_PATH, spritesFolder));
const images = [];
spritesFiles.forEach((spritesFile) => {
images.push({
path: spritesFile,
contents: readFileSync(
path.resolve(__dirname, SOURCE_SPRITES_PATH, spritesFolder, spritesFile)
),
});
});
// eslint-disable-next-line no-await-in-loop
await packImages(images, spritesFolder);
}
}
async function packImages(images, spriteName) {
try {
const files = await packAsync(images, { allowRotation: false });
// eslint-disable-next-line no-restricted-syntax
for (const item of files) {
const fileExt = item.name.split('.').pop();
// eslint-disable-next-line no-await-in-loop
await writeFileSync(
path.resolve(__dirname, SPRITES_PATH, `${spriteName}.${fileExt}`),
item.buffer
);
}
} catch (error) {
console.log(error);
}
}
generateAtlasFiles();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment