Текущая настройка:
- Генерация шума Перлина: в NewGameState мы генерируем изображение предварительного просмотра, используя шум Перлина. Каждому значению шума соответствует цвет, обозначающий местность или ресурсы (например, синий — вода, зеленый — трава, серый — горы и т. д.).
Код: Выделить всё
void NewGameState::generatePerlinNoise() {
// Perlin noise is generated for terrain elevation and resource patches.
const int noiseWidth = 600;
const int noiseHeight = 400;
sf::Uint8* pixels = new sf::Uint8[noiseWidth * noiseHeight * 4];
for (int x = 0; x < noiseWidth; x++) {
for (int y = 0; y < noiseHeight; y++) {
// Calculate Perlin noise value and assign colors based on thresholds
float val = perlin(x * 0.05f, y * 0.05f, seed);
sf::Uint8 r = 0, g = 0, b = 0;
if (val < 0.25f) {
r = 0; g = 0; b = 255; // Water (blue)
} else if (val < 0.55f) {
r = 34; g = 139; b = 34; // Grass (green)
} else if (val < 0.75f) {
r = 169; g = 169; b = 169; // Mountain (grey)
}
// Set pixel data
int index = (y * noiseWidth + x) * 4;
pixels[index] = r;
pixels[index + 1] = g;
pixels[index + 2] = b;
pixels[index + 3] = 255; // Alpha
}
}
perlinTexture.create(noiseWidth, noiseHeight);
perlinTexture.update(pixels);
perlinSprite.setTexture(perlinTexture);
delete[] pixels;
}
- Генерация мира плиток: в настоящее время мир плиток генерируется непосредственно на основе значений шума Перлина в TileRenderer. Я хотел бы заменить это системой, которая сканирует изображение предварительного просмотра и назначает плитки на основе цветов.
Код: Выделить всё
void TileRenderer::generateWorld() {
float frequency = 0.05f;
int seed = rand();
for (int y = 0; y < worldHeight; ++y) {
std::vector row;
for (int x = 0; x < worldWidth; ++x) {
float noiseValue = perlin(x * frequency, y * frequency, seed);
if (noiseValue < 0.25f) {
row.push_back("water");
} else if (noiseValue < 0.55f) {
row.push_back("grass");
} else if (noiseValue < 0.75f) {
row.push_back("mountain");
}
}
worldMap.push_back(row);
}
}
- Рендеринг мира: после назначения плиток игра визуализирует изометрический мир с использованием предварительно загруженных текстур.
Код: Выделить всё
void TileRenderer::render(sf::RenderWindow &window) {
float tileWidth = 132.f;
float tileHeight = 99.f;
for (int y = 0; y < worldHeight; ++y) {
for (int x = 0; x < worldWidth; ++x) {
sf::Sprite sprite;
sprite.setTexture(tileTextures[worldMap[y][x]]);
float posX = (x - y) * (tileWidth / 2.0f);
float posY = (x + y) * (tileHeight / 2.0f);
sprite.setPosition(posX, posY);
window.draw(sprite);
}
}
}
Я пытаюсь преобразовать изображение предварительного просмотра на основе шума Перлина непосредственно в изометрический тайловый мир. Вместо того, чтобы снова использовать значения шума Перлина для генерации мира, я хотел бы отсканировать цвета изображения предварительного просмотра (синий = вода, зеленый = трава и т. д.) и разместить соответствующие плитки.
В чем мне нужна помощь:
- Как отсканировать изображение предварительного просмотра и сопоставить цвета (например, синий для воды) с плитками.
Метод, обеспечивающий перевод 1:1 изображения предварительного просмотра в изометрический мир.
Подробнее здесь: https://stackoverflow.com/questions/791 ... tile-world
Мобильная версия