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
for (int chunk_y = 0; chunk_y < chunks_per_side; ++chunk_y) {
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_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_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[]) {
// Parse command line arguments
if (argc < 3 || argc > 4) {
if (argc > 4) {
std::cerr << "Usage: " << argv[0]
<< " <seed> <output_file.bmp> [chunks_per_side]\n";
std::cerr << " seed - Random seed for generation\n";
@ -145,8 +144,9 @@ int main(int argc, char *argv[]) {
return 1;
}
std::uint64_t seed = std::strtoull(argv[1], nullptr, 10);
std::string output_filename = argv[2];
std::uint64_t seed
= 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
// Parse optional chunks_per_side parameter
@ -178,9 +178,6 @@ int main(int argc, char *argv[]) {
// Configure generation parameters
istd::GenerationConfig config;
config.seed = seed;
config.temperature_scale = 0.005;
config.humidity_scale = 0.007;
config.base_scale = 0.08;
// Generate the map
std::cout << "Generating terrain..." << std::endl;

View File

@ -62,11 +62,9 @@ struct SubChunkPos {
};
// 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
) {
return {pos.sub_x * 16, pos.sub_y * 16};
}
);
} // namespace istd

View File

@ -1,4 +1,5 @@
#include "biome.h"
#include "chunk.h"
#include <algorithm>
#include <array>
#include <cmath>
@ -115,4 +116,11 @@ BiomeType determine_biome(double temperature, double humidity) {
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

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) {
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_x = 0; sub_x < 4; ++sub_x) {
for (std::uint8_t sub_y = 0; sub_y < Chunk::subchunk_count;
++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
double global_x = static_cast<double>(
chunk_x * Chunk::size + sub_x * 16 + 8
);
double global_y = static_cast<double>(
chunk_y * Chunk::size + sub_y * 16 + 8
);
auto [start_x, start_y]
= subchunk_to_tile_start(SubChunkPos(sub_x, sub_y));
double global_x = chunk_x * Chunk::size + start_x
+ Chunk::subchunk_size / 2;
double global_y = chunk_y * Chunk::size + start_y
+ Chunk::subchunk_size / 2;
// Get climate values
auto [temperature, humidity]
@ -85,14 +88,13 @@ void TerrainGenerator::generate_subchunk(
auto [start_x, start_y] = subchunk_to_tile_start(sub_pos);
// 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_x = start_x; local_x < start_x + 16;
++local_x) {
for (std::uint8_t local_y = start_y;
local_y < start_y + Chunk::subchunk_size; ++local_y) {
for (std::uint8_t local_x = start_x;
local_x < start_x + Chunk::subchunk_size; ++local_x) {
// Calculate global coordinates
double global_x
= static_cast<double>(chunk_x * Chunk::size + local_x);
double global_y
= static_cast<double>(chunk_y * Chunk::size + local_y);
double global_x = chunk_x * Chunk::size + local_x;
double global_y = chunk_y * Chunk::size + local_y;
// Generate base terrain noise value using uniform distribution
double base_noise_value