fix: biome demo

Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
方而静 2025-08-01 21:37:23 +08:00
parent 720d1a1c69
commit 6be8869568
Signed by: szTom
GPG Key ID: 072D999D60C6473C
4 changed files with 35 additions and 30 deletions

View File

@ -38,11 +38,10 @@ void generate_bmp(const istd::TileMap &tilemap, const std::string &filename) {
// Generate tiles // Generate tiles
for (int chunk_y = 0; chunk_y < chunks_per_side; ++chunk_y) { for (int chunk_y = 0; chunk_y < chunks_per_side; ++chunk_y) {
for (int chunk_x = 0; chunk_x < chunks_per_side; ++chunk_x) { for (int chunk_x = 0; chunk_x < chunks_per_side; ++chunk_x) {
const auto &chunk = tilemap.get_chunk(chunk_x, chunk_y);
for (int tile_y = 0; tile_y < tiles_per_chunk; ++tile_y) { for (int tile_y = 0; tile_y < tiles_per_chunk; ++tile_y) {
for (int tile_x = 0; tile_x < tiles_per_chunk; ++tile_x) { for (int tile_x = 0; tile_x < tiles_per_chunk; ++tile_x) {
const auto &tile = chunk.tiles[tile_x][tile_y]; istd::TilePos pos(chunk_x, chunk_y, tile_x, tile_y);
const auto &tile = tilemap.get_tile(pos);
int global_x = chunk_x * tiles_per_chunk + tile_x; int global_x = chunk_x * tiles_per_chunk + tile_x;
int global_y = chunk_y * tiles_per_chunk + tile_y; int global_y = chunk_y * tiles_per_chunk + tile_y;
@ -134,7 +133,7 @@ void print_statistics(const istd::TileMap &tilemap) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// Parse command line arguments // Parse command line arguments
if (argc < 3 || argc > 4) { if (argc > 4) {
std::cerr << "Usage: " << argv[0] std::cerr << "Usage: " << argv[0]
<< " <seed> <output_file.bmp> [chunks_per_side]\n"; << " <seed> <output_file.bmp> [chunks_per_side]\n";
std::cerr << " seed - Random seed for generation\n"; std::cerr << " seed - Random seed for generation\n";
@ -145,8 +144,9 @@ int main(int argc, char *argv[]) {
return 1; return 1;
} }
std::uint64_t seed = std::strtoull(argv[1], nullptr, 10); std::uint64_t seed
std::string output_filename = argv[2]; = argc >= 2 ? std::strtoull(argv[1], nullptr, 10) : 541234;
std::string output_filename = argc >= 3 ? argv[2] : "output.bmp";
int chunks_per_side = 4; // Default value int chunks_per_side = 4; // Default value
// Parse optional chunks_per_side parameter // Parse optional chunks_per_side parameter
@ -158,7 +158,7 @@ int main(int argc, char *argv[]) {
} }
if (chunks_per_side > 20) { if (chunks_per_side > 20) {
std::cerr << "Warning: Large chunk counts may produce very large " std::cerr << "Warning: Large chunk counts may produce very large "
"images\n"; "images\n";
} }
} }
@ -178,9 +178,6 @@ int main(int argc, char *argv[]) {
// Configure generation parameters // Configure generation parameters
istd::GenerationConfig config; istd::GenerationConfig config;
config.seed = seed; config.seed = seed;
config.temperature_scale = 0.005;
config.humidity_scale = 0.007;
config.base_scale = 0.08;
// Generate the map // Generate the map
std::cout << "Generating terrain..." << std::endl; std::cout << "Generating terrain..." << std::endl;
@ -194,4 +191,4 @@ int main(int argc, char *argv[]) {
print_statistics(tilemap); print_statistics(tilemap);
return 0; return 0;
} }

View File

@ -62,11 +62,9 @@ struct SubChunkPos {
}; };
// Get the starting tile coordinates for a sub-chunk // Get the starting tile coordinates for a sub-chunk
constexpr std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start( std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start(
const SubChunkPos &pos const SubChunkPos &pos
) { );
return {pos.sub_x * 16, pos.sub_y * 16};
}
} // namespace istd } // namespace istd

View File

@ -1,4 +1,5 @@
#include "biome.h" #include "biome.h"
#include "chunk.h"
#include <algorithm> #include <algorithm>
#include <array> #include <array>
#include <cmath> #include <cmath>
@ -115,4 +116,11 @@ BiomeType determine_biome(double temperature, double humidity) {
return static_cast<BiomeType>(index); return static_cast<BiomeType>(index);
} }
std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start(
const SubChunkPos &pos
) {
// Convert sub-chunk position to tile start coordinates
return {pos.sub_x * Chunk::subchunk_size, pos.sub_y * Chunk::subchunk_size};
}
} // namespace istd } // namespace istd

View File

@ -37,15 +37,18 @@ void TerrainGenerator::generate_biomes(TileMap &tilemap) {
for (std::uint8_t chunk_x = 0; chunk_x < map_size; ++chunk_x) { for (std::uint8_t chunk_x = 0; chunk_x < map_size; ++chunk_x) {
Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y); Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y);
for (std::uint8_t sub_y = 0; sub_y < 4; ++sub_y) { for (std::uint8_t sub_y = 0; sub_y < Chunk::subchunk_count;
for (std::uint8_t sub_x = 0; sub_x < 4; ++sub_x) { ++sub_y) {
for (std::uint8_t sub_x = 0; sub_x < Chunk::subchunk_count;
++sub_x) {
// Calculate global position for this sub-chunk's center // Calculate global position for this sub-chunk's center
double global_x = static_cast<double>( auto [start_x, start_y]
chunk_x * Chunk::size + sub_x * 16 + 8 = subchunk_to_tile_start(SubChunkPos(sub_x, sub_y));
); double global_x = chunk_x * Chunk::size + start_x
double global_y = static_cast<double>( + Chunk::subchunk_size / 2;
chunk_y * Chunk::size + sub_y * 16 + 8
); double global_y = chunk_y * Chunk::size + start_y
+ Chunk::subchunk_size / 2;
// Get climate values // Get climate values
auto [temperature, humidity] auto [temperature, humidity]
@ -85,14 +88,13 @@ void TerrainGenerator::generate_subchunk(
auto [start_x, start_y] = subchunk_to_tile_start(sub_pos); auto [start_x, start_y] = subchunk_to_tile_start(sub_pos);
// Generate terrain for each tile in the 16x16 sub-chunk // Generate terrain for each tile in the 16x16 sub-chunk
for (std::uint8_t local_y = start_y; local_y < start_y + 16; ++local_y) { for (std::uint8_t local_y = start_y;
for (std::uint8_t local_x = start_x; local_x < start_x + 16; local_y < start_y + Chunk::subchunk_size; ++local_y) {
++local_x) { for (std::uint8_t local_x = start_x;
local_x < start_x + Chunk::subchunk_size; ++local_x) {
// Calculate global coordinates // Calculate global coordinates
double global_x double global_x = chunk_x * Chunk::size + local_x;
= static_cast<double>(chunk_x * Chunk::size + local_x); double global_y = chunk_y * Chunk::size + local_y;
double global_y
= static_cast<double>(chunk_y * Chunk::size + local_y);
// Generate base terrain noise value using uniform distribution // Generate base terrain noise value using uniform distribution
double base_noise_value double base_noise_value