Идеи, необходимые для перевода предварительного просмотра шума Перлина в изометрический тайловый мирC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Идеи, необходимые для перевода предварительного просмотра шума Перлина в изометрический тайловый мир

Сообщение Anonymous »

Я работаю над игрой, в которой мы генерируем изометрический тайловый мир на основе шума Перлина. Шум Перлина используется для создания изображения предварительного просмотра, где различные типы местности и ресурсы (например, вода, трава, горы, уголь и золото) представлены определенными цветами. Мне нужна помощь в создании метода, который сканирует изображение предварительного просмотра и преобразует цвета в соответствующие изометрические плитки для формирования игрового мира.
Текущая настройка:
  • Генерация шума Перлина: в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»