Я например буду представлять каждый пиксель на глобальной карте как карту X на Y тайлов, но при этом придется где-то хранить инфу обо всех участках карты, а в товем случае для этого понадобится X*Y*256*256 (как минимум байт). у меня карта например 153 на 85 и понадобится примерно 20 Мб чтобы просто хранить информацию о карте одного сейва. А если у игрока будет 20-30 сейвов? Так что я нашел только одно решение, но благо сейчас ресурсы позволяют это сделать.Остался вопрос, как в это вписать перемещения Героя, ведь карта-то для целой планеты, не ножками же он ходить будет. Видимо, корованы...
Мой дом - тюрьма...
Модератор: Jolly Roger
Re: Мой дом - тюрьма...
- AllSeeingI
- Сообщения: 133
- Зарегистрирован: 10 апр 2010, 18:20
Re: Мой дом - тюрьма...
Насчет хранения сейвов - не обязательно для каждой ячейки генерировать карту. Можно сделать 2-3 карты для, скажем, леса, а потом каждой из лесных ячеек приделать ссылку на одну из них... Думаю, никто в здравом уме не станет запоминать, что 2 дня назад в ячейке с координатами 201х47 оставил недобитого гоблина...
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Мой дом - тюрьма...
Вот и не нужна статья, весь алгорит в двух предложениях! =D>AllSeeingI писал(а):Алгоритм собственного сочинения. Думаю, я изобрел велосипед, но все же...Ого, выглядит симпатично, что за алгоритм?
Механика такая: изначально имеем обнуленную, покрытую водой карту. Затем на ней в случайных местах устанавливаются стартовые точки, от которых будут расползаться материки. Потом в цикле земля начинает прирастать. Если точка Н стала сушей в предыдущем шаге, то каждая клетка вокруг нее имеет шанс стать сушей в текущем.
Потом, как я писал выше, осушение - все водные клетки, имеющие меньше 2-х водных соседей, становятся землей. Конечным результатом имеем что-то типа этого:
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
- AllSeeingI
- Сообщения: 133
- Зарегистрирован: 10 апр 2010, 18:20
Re: Мой дом - тюрьма...
Даа, че эти теоретики умеют, только воду льют!
Re: Мой дом - тюрьма...
Есть еще другой вариант, в сейв сохранять информацию только о посещенных участках карты, тогда при высоком уровне смертности, сейвы не будут очень большие, плюс ограничить количество сейвов, например 10-ю слотами, как в старых играх делали (тогда и карту можно всю прегенерировать и сохранить сразу за один заход).
Re: Мой дом - тюрьма...
При генерации локальной карты можно использовать определенный (случайный, но фиксированный) random seed. Сами локальные карты вобще не сохранять, а для каждой ячейки глобальной карты хранить только random seed по которому генерится локальная карта в этой клетке. Собственно при каждом заходе генерировать карту локальную карту заново, используя указанный random seed.
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Мой дом - тюрьма...
тогда ещё было бы неплохо использовать собственный алгоритм псевдослучайных чисел, а не полагаться на системный.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Мой дом - тюрьма...
Они есть же, например: http://www.math.sci.hiroshima-u.ac.jp/~ ... T/emt.htmlтогда ещё было бы неплохо использовать собственный алгоритм псевдослучайных чисел, а не полагаться на системный.
Не думаю, что это совсем правильно. Представь, ты только что зачистил уровень, собрал весь лут, получил квесты и т.д. перешел на следующий, и сразу же вернулся обратно. С заданного seed у тебя опять сгенерируется уровень, предметы, монстры и квесты, причем теже самые что были только-что. Сохранять данные все равно надо, о пройденных уровнях по-крайней мере.При генерации локальной карты можно использовать определенный (случайный, но фиксированный) random seed. Сами локальные карты вобще не сохранять, а для каждой ячейки глобальной карты хранить только random seed по которому генерится локальная карта в этой клетке. Собственно при каждом заходе генерировать карту локальную карту заново, используя указанный random seed
Re: Мой дом - тюрьма...
Согласен, не спорю. Но я предлагал с помощью рандом сида сохранаять только геометрию карты, остальное (убитые монстры, собранный лут и т.д.) естественно должно сохраняться отдельно.С заданного seed у тебя опять сгенерируется уровень, предметы, монстры и квесты, причем теже самые что были только-что. Сохранять данные все равно надо, о пройденных уровнях по-крайней мере.
Re: Мой дом - тюрьма...
Можно использовать просто единожды сгенерированный массив в 1 килобайт из случайных чисел.Jolly Roger писал(а):тогда ещё было бы неплохо использовать собственный алгоритм псевдослучайных чисел, а не полагаться на системный.
Ну и чтобы получить псевдослучайное число, нужно по какой-либо формуле получить индекс в этом массиве и вытащить оттуда число.
Код: Выделить всё
int index = y * 480 + x + axisPos * 72000;
int randomIndex = index % 1021; // чем ближе числа к простым, тем наверно лучше
return pseudoRand[randomIndex];
Этот массив можно воткнуть прямо в исходники хардкодом.
Ну и обычный рандом остается рандомом, параллельно.
- AllSeeingI
- Сообщения: 133
- Зарегистрирован: 10 апр 2010, 18:20
Re: Мой дом - тюрьма...
О, щас про генератор случайных чисел почитаю!)
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Мой дом - тюрьма...
Только не надо изобретать свои собственные Epic Fail RNG, когда есть куча нормальных, работающих алгоритмов с открытым кодом.
Re: Мой дом - тюрьма...
Можно использовать линейный конгруентный метод. Кодируется за 5 минут, необходимо всего три условия. Весьма годный.
Re: Мой дом - тюрьма...
Пальцы тоже незачем гнуть, иногда быстрей реализовать за 5 минут то, что пришло в голову, и иметь над этим полный контроль, чем искать что-то готовое левое. Незачем из-за каждого пустякового вопроса подседать на именованные алгоритмы. Головой думать тоже полезно. В том числе и над скоростью работы алгоритма и над тем как он вообще работает. И, например, над тем, что иногда полезно бывает иметь не чистую последовательность, а постоянное соответствие, чтобы, скажем, по паре (x,y) всегда выдавалось одно и то же псевдослучайное число, которое зависит только от x и y (ну и от seed).Aerton писал(а):Только не надо изобретать свои собственные Epic Fail RNG, когда есть куча нормальных, работающих алгоритмов с открытым кодом.
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Мой дом - тюрьма...
Да, он конечно получше, чем вышеприведённый, но для игр, настолько сильно зависящих от рандома, как рогалики, он не "весьма", а "едва" годный. Слишком сильна зависимость идущих подряд значений.Hogar писал(а):Можно использовать линейный конгруентный метод. Кодируется за 5 минут, необходимо всего три условия. Весьма годный.
Anfeir Никакого загибания пальцев тут нет. Просто это недобросовстно - советовать другим людям использовать заведомо плохие решения, ведь кто-нибудь может по незнанию их применить. Головой конечно думать полезно, но стоит перед этим ознакоимиться с теоретической частью. Да и найти хороший алгорим с исходником на любимом языке тоже вряд ли займёт больше минуты-другой. Даже если вдруг уйдёт час или два, чтобы запинать готовый исходник в свою среду, это всё равно с лихвой окупится тем, что не придётся искать странные баги в своём алгоритме генерации, которые на самом деле вызваны лишь кривым рандомом.
Отображение x,y -> z это задача совсем не для RNG. Даже в твоём собственном примере оно делается через какой-то хеш.Anfeir писал(а):И, например, над тем, что иногда полезно бывает иметь не чистую последовательность, а постоянное соответствие, чтобы, скажем, по паре (x,y) всегда выдавалось одно и то же псевдослучайное число, которое зависит только от x и y (ну и от seed).
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость