Если C++ для тебя родной, то почему ты не можешь переписать алгоритм с Java на C++?.. Алгоритмы тебе и так подсказали, и ты сам где-то что-то нашёл, так почему не можешь реализовать всё "в металле"? Если возникают ошибки, когда пытаешься сделать что-то - пиши конкретно, кто-нибудь да объяснит смысл ошибки, поправит... А то так получается вот что: "я ничего не понял, сделайте всё за меня, только мне нужно именно на C++".
скажем так... Алгоритмы знаю, но движок-то достойный подобрать не могу... А если и подберу - мне нужен временный наставник
x-and1988, очень любопытно. Кстати я помню твою игру. Ты серьезно мог бы помочь? =) Был бы очень признателен! Я буду дома ближе к вечеру. Контактные данные оставь в ЛС пожалуйста
Добавлено (29.08.2012, 17:12) --------------------------------------------- java джавой, но С++ роднее... Кто-то такую весч на С++ поможет реализовать?
Добрый день... Я вот игру пишу... Кто-то может нарисовать блок земли, блок земли с травой и блок камня с размерами 32х32? Подниму репутацию. Буду очень благодарен
Какое отношение имеет это к генерации? При разрушении изменяй число в массиве на 0 и всё. Это, конечно, если ты будешь использовать массивы.
Ну как бы я... Ээээ... Клоню к тому, что каждый блок имеет свой id, чтоли... То есть если разрушить блок земли - разрушится только ОН, а не ВСЕ...
Quote (TimKruz)
А давай ты попробуешь сам тут логически расписать то, что уже понял и до чего сам додумался. Тут ведь разные алгоритмы могут быть, нельзя принимать что-то одно как универсальное решение. Главное сделай свою функцию, выдающую случайные числа, а то стандартная тут не пойдёт. Она непредсказуема.
Пока мои познания ограничиваются тем, что я буду иметь двумерный массив (map[x][y])... Например map[0][0] = 1; - блок земли, а map[0][1] = 0; - воздух (пустота)... Ещё я понял что генерация мира будет проходить в цикле. Там будут свои ограничения и правила... И будет использоваться функция рандома (например компьютер будет высчитывать: ставить блок выше или ниже?). Подумываю над тем, чтобы компьютер сначала делал верхний слой (горки и т.п.), затем все, что ниже, заливал землёй. Потом на определенном уровне (он колебаться будет... Ну, представим, что от 30 до 40) будет ставиться блоки камня (земли больше не будет, генератор значение "1" вытеснит на "2") (опять же с рандомным шансом в 80%, 20% - всякие руды (разные). Последний этап генерации - генерирование пещер (удаление внизу блоков и образование "данжев")
Но вот... Хотелось бы от А до Я расписать... Причём от простого к сложному. Так, как надо действовать
Добавлено (26.08.2012, 01:40) --------------------------------------------- всё ещё жду... Завтра буду переводить для себя вот это:
Quote (Нотч^^)
Terrain generation, Part 1 I’ve been promising to write a technical post on Minecraft for a while, but never really got around to doing so. I’m on a tiny airplane now, though, with nowhere to run, so here we go!
One of the most complex parts of Minecraft is the terrain generation. When I changed the game over from being just single zones of a map to an infinite map, the terrain generation got a whole lot more complicated, as terrain needs to get generated on the fly as the player explores, and it has to be the same no matter what direction the player approaches it from.
1) How infinite is it?
First of all, let me clarify some things about the “infinite” maps: They’re not infinite, but there’s no hard limit either. It’ll just get buggier and buggier the further out you are. Terrain is generated, saved and loaded, and (kind of) rendered in chunks of 16*16*128 blocks. These chunks have an offset value that is a 32 bit integer roughly in the range negative two billion to positive two billion. If you go outside that range (about 25% of the distance from where you are now to the sun), loading and saving chunks will start overwriting old chunks. At a 16/th of that distance, things that use integers for block positions, such as using items and pathfinding, will start overflowing and acting weird.
Those are the two “hard” limits.
Most other things, like the terrain generation seeds and entity locations use 64 bit doubles for locations, and they do much subtler things. For example, at extreme distances, the player may move slower than near the center of the world, due to rounding errors (the position has a huge mantissa, the movement delta has a tiny, so it gets cut off faster). The terrain generator can also start generating weird structures, such as huge blocks of solid material, but I haven’t seen this lately nor examined exactly what behavior causes it to happen. One major problem at long distances is that the physics starts bugging out, so the player can randomly fall into ground blocks or get stuck while walking along a wall.
Many of these problems can be solved by changing the math into a local model centered around the player so the numbers all have vaguely the same magnitude. For rendering, Minecraft already uses local coordinates within the block and offset the block position relative to the player to give the impression of the player moving. This is mostly due to OpengGL using 32 bit floats for positions, but also because the rounding errors are extremely visible when displayed on a screen.
We’re probably not going to fix these bugs until it becomes common for players to experience them while playing legitimately. My gut feeling is that nobody ever has so far, and nobody will. Walking that far will take a very long time. Besides, the bugs add mystery and charisma to the Far Lands.
2) Isn’t that terrain shape pretty awesome?
In the very earliest version of Minecraft, I used a 2D Perlin noise heightmap to set the shape of the world. Or, rather, I used quite a few of them. One for overall elevation, one for terrain roughness, and one for local detail. For each column of blocks, the height was (elevation + (roughness*detail))*64+64. Both elevation and roughness were smooth, large scale noises, and detail was a more intricate one. This method had the great advantage of being very fast as there’s just 16*16*(noiseNum) samples per chunk to generate, but the disadvantage of being rather dull. Specifically, there’s no way for this method to generate any overhangs.
So I switched the system over into a similar system based off 3D Perlin noise. Instead of sampling the “ground height”, I treated the noise value as the “density”, where anything lower than 0 would be air, and anything higher than or equal to 0 would be ground. To make sure the bottom layer is solid and the top isn’t, I just add the height (offset by the water level) to the sampled result.
Unfortunately, I immediately ran into both performance issues and playability issues. Performance issues because of the huge amount of sampling needed to be done, and playability issues because there were no flat areas or smooth hills. The solution to both problems turned out to be just sampling at a lower resolution (scaled 8x along the horizontals, 4x along the vertical) and doing a linear interpolation. Suddenly, the game had flat areas, smooth hills, and also most single floating blocks were gone.
The exact formula I use is a bit involved (and secret!), but it evolved slowly over time as I worked on the game. It still uses the 2D elevation and noisyness maps, though.
STILL TO COME, ON TERRAIN GENERATION:
Biomes! Caves and Large Features Trees, Lakes, and Small Features The nether!
2) Как достигается генерация такого естественного ландшафта?
В очень ранней версии Minecraft’а я использовал карту высот 2D шумов Перлина , чтобы придать миру форму. Ох, точнее я использовал множество из них. Один для общего подъёма, один для придания неровностей и один для мелких деталей. Для каждого столба из блоков высота вычислялась по формуле (подъём + (неровность*мелкие детали))*64+64. Все подъёмы и неровности были гладкими, на слишком большие добавлялся «шум», и детали были более запутаннее, чем сейчас. Этот метод имеет большое преимущество в плане скорости и в нём 16*16*(количество шумов) сэмплов для генерации в каждом чанке, но проблема была в том, что этот способ скорее был туп. Особенно тупизна видна в том, что нельзя сгенерировать нависающие склоны и арки.
Итак я предпочёл эту систему похожей, сделанной на 3-D шумах Перлина. Вместо проверки по высоте, я установил значение шума на «густоту» и теперь всё, что ниже 0 (нуля) будет воздухом, а всё, что на том же уровне или выше будет землёй. Чтобы убедиться, что дно плоское и без дыр, а верх не плоский я просто добавил высоту (исключая места под водой) в список сэмплов для генерации.
Но, к сожалению, я тут же столкнулся с проблемами производительности и игровой механики. Производительность падала из-за того, что нужно было обработать огромное количество сэмплов, а проблемы с игровой механикой были в том, что не было равнин и пологих холмов. Решением стало переключение сэмплов в более низкое разрешение (8х по горизонтали и 4х по вертикали) и использование линейной интерполяции . Внезапно игра стала генерировать равнины, пологие холмы и большинство единичных летающих блоков пропали.
Текущая формула, которую я использую довольно запутана (и секретна!), но она постепенно эволюционирует (когда я работаю над игрой). И да, она ещё использует 2D карту высот и карты шумов.
xX
Добавлено (26.08.2012, 01:50) --------------------------------------------- Кажется шум Перлина мне нужен... Читаю статью, пока всё в тумане. Но там тоже генерация случайных чисел идёт
Сообщение отредактировал Saitei - Воскресенье, 26 Августа 2012, 01:07
karuy, да не в каком. Я открыл "подготовку к ВУЗам". Но там не подготовка, а просто сборник задач) Ну и споткнулся, блин)) Вообще, кажется. такие задачи решают в 10 классе Vinchensoo, хорошо, и за наглядные формулы спасиб
karuy, а откуда получилось 1+cosX=a? Вот именно с этого момента и ниже я как-то не догоняю..)
Вот с Fade мудрили-мудрили, а споткнулись на мелочи (здесь не его вина (т.к. он вообще программирует на Java, а я - на С++)). У нас не получалось сделать так, чтобы в классе создавались новые экземпляры блоков (членов). Синтаксис ругался. Точно уже не помню, но, кажется, конкретно с этим проблема всплыла. Ну а я пытался выучить джава - много подхватил, НО мне там очень неудобно работать (eclipse 64-bit удивительным образом критовал, а 32-bit ужасно глючит). Итак, давайте всё логически распишем? От начала до конца, пунктами? Очень пригодилось бы. Код TimKruz посмотрел. Спасибо, немного открылись глаза. Но хотелось бы сейчас поэтапно расписать всю эту генерацию (в игре будут разрушаться блоки)
Пробегаешь во всей карте, и расставляешь блоки по определенным правилам (максимальная высота, относительно соседних блоков, вид блока и т.д.) Или изначально строишь возможные свободные пути перемещения, а остальное пространство заполняешь блоками. Это как пример, есть и другие способы, конечно.