- Weltgenerierung: FBM-Terrain, 3 Biome (Plains/Wald/Wüste), Höhlen, Wasser, Bäume - Blöcke: Grass, Dirt, Stein, Sand, Holz, Blätter, Wasser (+Bedrock) - Interaktion: DDA-Voxel-Raycast, Abbauen (LMB) & Setzen (RMB), Hotbar 1-6 - Spieler: First-Person, Gravitation, AABB-Kollision, Springen, Fly-Mode (F) - Engine: Chunk-Streaming (16x16x64), Face-Culling, opaker+transparenter Pass - Stack: Three.js + simplex-noise via CDN, prozedurale Texturen, kein Build-Step Co-Authored-By: Claude <noreply@anthropic.com>
94 lines
2.4 KiB
JavaScript
94 lines
2.4 KiB
JavaScript
// Globale Konstanten und Block-/Biome-Definitionen
|
|
|
|
// --- Welt-Dimensionen ---
|
|
export const CHUNK_SIZE = 16; // X und Z Ausdehnung eines Chunks
|
|
export const CHUNK_HEIGHT = 64; // Y Ausdehnung eines Chunks
|
|
export const SEA_LEVEL = 26;
|
|
export const WORLD_SEED = 1337;
|
|
|
|
// --- Block-Typen ---
|
|
export const BLOCK = {
|
|
AIR: 0,
|
|
GRASS: 1,
|
|
DIRT: 2,
|
|
STONE: 3,
|
|
SAND: 4,
|
|
WOOD: 5,
|
|
LEAVES: 6,
|
|
WATER: 7,
|
|
BEDROCK: 8,
|
|
};
|
|
|
|
// Welche Bloecke fuer den Spieler nicht solide sind (keine Kollision, durchschaubar)
|
|
export function isTransparent(id) {
|
|
return id === BLOCK.AIR || id === BLOCK.WATER;
|
|
}
|
|
export function isSolid(id) {
|
|
return id !== BLOCK.AIR && id !== BLOCK.WATER;
|
|
}
|
|
// Wasser als einziger (halb-)transparenter Renderblock
|
|
export function isRenderTransparent(id) {
|
|
return id === BLOCK.WATER;
|
|
}
|
|
|
|
// --- Biome ---
|
|
export const BIOME = { PLAINS: 0, FOREST: 1, DESERT: 2 };
|
|
|
|
// --- Texturatlas ---
|
|
export const ATLAS_COLS = 16; // Tiles pro Reihe
|
|
export const TILE_PX = 16; // Pixel pro Tile
|
|
export const ATLAS_PX = ATLAS_COLS * TILE_PX; // 256
|
|
|
|
// Tile-Indizes im Atlas (Reihe 0)
|
|
export const TILE = {
|
|
GRASS_TOP: 0,
|
|
GRASS_SIDE: 1,
|
|
DIRT: 2,
|
|
STONE: 3,
|
|
SAND: 4,
|
|
WOOD_TOP: 5,
|
|
WOOD_SIDE: 6,
|
|
LEAVES: 7,
|
|
WATER: 8,
|
|
};
|
|
|
|
// Liefert (col,row) im Atlas fuer einen Block + Seite ('top'|'bottom'|'side')
|
|
export function tileFor(block, side) {
|
|
let idx;
|
|
switch (block) {
|
|
case BLOCK.GRASS:
|
|
idx = side === 'top' ? TILE.GRASS_TOP : side === 'bottom' ? TILE.DIRT : TILE.GRASS_SIDE;
|
|
break;
|
|
case BLOCK.DIRT: idx = TILE.DIRT; break;
|
|
case BLOCK.STONE: idx = TILE.STONE; break;
|
|
case BLOCK.SAND: idx = TILE.SAND; break;
|
|
case BLOCK.WOOD:
|
|
idx = (side === 'top' || side === 'bottom') ? TILE.WOOD_TOP : TILE.WOOD_SIDE;
|
|
break;
|
|
case BLOCK.LEAVES: idx = TILE.LEAVES; break;
|
|
case BLOCK.WATER: idx = TILE.WATER; break;
|
|
default: idx = TILE.STONE;
|
|
}
|
|
return { col: idx % ATLAS_COLS, row: Math.floor(idx / ATLAS_COLS) };
|
|
}
|
|
|
|
// Bloecke, die per Hotbar gesetzt werden koennen
|
|
export const HOTBAR = [
|
|
BLOCK.GRASS,
|
|
BLOCK.DIRT,
|
|
BLOCK.STONE,
|
|
BLOCK.SAND,
|
|
BLOCK.WOOD,
|
|
BLOCK.LEAVES,
|
|
];
|
|
|
|
// Anzeige-Farben pro Block fuer die Hotbar-Symbole
|
|
export const BLOCK_COLOR = {
|
|
[BLOCK.GRASS]: '#6ab04c',
|
|
[BLOCK.DIRT]: '#8b5a2b',
|
|
[BLOCK.STONE]: '#8a8a8a',
|
|
[BLOCK.SAND]: '#e6d8a8',
|
|
[BLOCK.WOOD]: '#6e4f2a',
|
|
[BLOCK.LEAVES]:'#3f8a2f',
|
|
};
|