gen-biome
Version:
Procedural generation of 2D maps with distinct biomes
56 lines (42 loc) • 1.46 kB
text/typescript
import { WorldGenerator } from '../../src';
import type { BiomeData } from './biomes';
import { BIOMES } from './biomes';
import { ui } from './interface';
const ctx = ui.screen.getContext('2d') as CanvasRenderingContext2D;
let savedSeed!: number[];
function generateAndRenderWorld() {
/**
* PREPARE
*/
const generator = new WorldGenerator<BiomeData>({
width: Number(ui.inputs.worldWidth?.value),
height: Number(ui.inputs.worldHeight?.value),
frequencyChange: Number(ui.inputs.frequencyChange?.value),
borderSmoothness: Number(ui.inputs.borderSmoothness?.value),
heightRedistribution: Number(ui.inputs.heightRedistribution?.value),
falloff: Number(ui.inputs.falloff?.value),
heightAveraging: ui.inputs.heightAveraging?.checked,
});
for (const { params, data } of BIOMES) {
generator.addBiome(params, data);
}
/**
* GENERATE
*/
const world = generator.generate({
seed: ui.inputs.resetSeed?.checked ? undefined : savedSeed,
});
savedSeed = world.seed;
/**
* RENDER
*/
const tileSize = Number(ui.inputs.tileSize?.value);
ui.screen.width = world.width * tileSize;
ui.screen.height = world.height * tileSize;
world.each((position, biome) => {
ctx.fillStyle = biome.color;
ctx.fillRect(position.x * tileSize, position.y * tileSize, tileSize, tileSize);
});
}
ui.buttons.generate?.addEventListener('click', generateAndRenderWorld);
generateAndRenderWorld();