Мой дом - тюрьма...

Закрытые или заброшенные проекты, не состоявшие в Клубе, но имевшие ветку на форуме.

Модератор: Jolly Roger

Аватара пользователя
Hogar
Сообщения: 5
Зарегистрирован: 18 янв 2010, 19:34
Откуда: Севастополь

Re: Мой дом - тюрьма...

Сообщение Hogar » 27 июн 2010, 11:04

Остался вопрос, как в это вписать перемещения Героя, ведь карта-то для целой планеты, не ножками же он ходить будет. Видимо, корованы...
Я например буду представлять каждый пиксель на глобальной карте как карту X на Y тайлов, но при этом придется где-то хранить инфу обо всех участках карты, а в товем случае для этого понадобится X*Y*256*256 (как минимум байт). у меня карта например 153 на 85 и понадобится примерно 20 Мб чтобы просто хранить информацию о карте одного сейва. А если у игрока будет 20-30 сейвов? Так что я нашел только одно решение, но благо сейчас ресурсы позволяют это сделать.

Аватара пользователя
AllSeeingI
Сообщения: 133
Зарегистрирован: 10 апр 2010, 18:20

Re: Мой дом - тюрьма...

Сообщение AllSeeingI » 27 июн 2010, 11:13

Насчет хранения сейвов - не обязательно для каждой ячейки генерировать карту. Можно сделать 2-3 карты для, скажем, леса, а потом каждой из лесных ячеек приделать ссылку на одну из них... Думаю, никто в здравом уме не станет запоминать, что 2 дня назад в ячейке с координатами 201х47 оставил недобитого гоблина...

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Мой дом - тюрьма...

Сообщение Jolly Roger » 28 июн 2010, 04:15

AllSeeingI писал(а):
Ого, выглядит симпатично, что за алгоритм?
Алгоритм собственного сочинения. Думаю, я изобрел велосипед, но все же...
Механика такая: изначально имеем обнуленную, покрытую водой карту. Затем на ней в случайных местах устанавливаются стартовые точки, от которых будут расползаться материки. Потом в цикле земля начинает прирастать. Если точка Н стала сушей в предыдущем шаге, то каждая клетка вокруг нее имеет шанс стать сушей в текущем.
Потом, как я писал выше, осушение - все водные клетки, имеющие меньше 2-х водных соседей, становятся землей. Конечным результатом имеем что-то типа этого:
Screenshot13.jpg
Вот и не нужна статья, весь алгорит в двух предложениях! =D>
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
AllSeeingI
Сообщения: 133
Зарегистрирован: 10 апр 2010, 18:20

Re: Мой дом - тюрьма...

Сообщение AllSeeingI » 28 июн 2010, 05:15

Даа, че эти теоретики умеют, только воду льют! :supz:

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Мой дом - тюрьма...

Сообщение Toth » 28 июн 2010, 13:39

Есть еще другой вариант, в сейв сохранять информацию только о посещенных участках карты, тогда при высоком уровне смертности, сейвы не будут очень большие, плюс ограничить количество сейвов, например 10-ю слотами, как в старых играх делали (тогда и карту можно всю прегенерировать и сохранить сразу за один заход).

Аватара пользователя
Krechet
Сообщения: 10
Зарегистрирован: 14 авг 2009, 14:35

Re: Мой дом - тюрьма...

Сообщение Krechet » 30 июн 2010, 07:22

При генерации локальной карты можно использовать определенный (случайный, но фиксированный) random seed. Сами локальные карты вобще не сохранять, а для каждой ячейки глобальной карты хранить только random seed по которому генерится локальная карта в этой клетке. Собственно при каждом заходе генерировать карту локальную карту заново, используя указанный random seed.

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Мой дом - тюрьма...

Сообщение Jolly Roger » 30 июн 2010, 08:22

тогда ещё было бы неплохо использовать собственный алгоритм псевдослучайных чисел, а не полагаться на системный.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Мой дом - тюрьма...

Сообщение Toth » 30 июн 2010, 08:29

тогда ещё было бы неплохо использовать собственный алгоритм псевдослучайных чисел, а не полагаться на системный.
Они есть же, например: http://www.math.sci.hiroshima-u.ac.jp/~ ... T/emt.html
При генерации локальной карты можно использовать определенный (случайный, но фиксированный) random seed. Сами локальные карты вобще не сохранять, а для каждой ячейки глобальной карты хранить только random seed по которому генерится локальная карта в этой клетке. Собственно при каждом заходе генерировать карту локальную карту заново, используя указанный random seed
Не думаю, что это совсем правильно. Представь, ты только что зачистил уровень, собрал весь лут, получил квесты и т.д. перешел на следующий, и сразу же вернулся обратно. С заданного seed у тебя опять сгенерируется уровень, предметы, монстры и квесты, причем теже самые что были только-что. Сохранять данные все равно надо, о пройденных уровнях по-крайней мере.

Аватара пользователя
Krechet
Сообщения: 10
Зарегистрирован: 14 авг 2009, 14:35

Re: Мой дом - тюрьма...

Сообщение Krechet » 30 июн 2010, 08:41

С заданного seed у тебя опять сгенерируется уровень, предметы, монстры и квесты, причем теже самые что были только-что. Сохранять данные все равно надо, о пройденных уровнях по-крайней мере.
Согласен, не спорю. Но я предлагал с помощью рандом сида сохранаять только геометрию карты, остальное (убитые монстры, собранный лут и т.д.) естественно должно сохраняться отдельно.

Аватара пользователя
Anfeir
Сообщения: 876
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Мой дом - тюрьма...

Сообщение Anfeir » 30 июн 2010, 15:31

Jolly Roger писал(а):тогда ещё было бы неплохо использовать собственный алгоритм псевдослучайных чисел, а не полагаться на системный.
Можно использовать просто единожды сгенерированный массив в 1 килобайт из случайных чисел.
Ну и чтобы получить псевдослучайное число, нужно по какой-либо формуле получить индекс в этом массиве и вытащить оттуда число.

Код: Выделить всё

int index = y * 480 + x + axisPos * 72000; 
	int randomIndex = index % 1021; // чем ближе числа к простым, тем наверно лучше
	return pseudoRand[randomIndex];
Единственный ньюанс - составление массива. Для этого взять 4 набора из чисел 0,1,2,3,...., 255 и рандомно раскидать их по массиву. Тогда распределение будет более ровным и правильным, чем если просто пробежаться по массиву и в каждый элемент воткнуть случайное число.
Этот массив можно воткнуть прямо в исходники хардкодом.

Ну и обычный рандом остается рандомом, параллельно.

Аватара пользователя
AllSeeingI
Сообщения: 133
Зарегистрирован: 10 апр 2010, 18:20

Re: Мой дом - тюрьма...

Сообщение AllSeeingI » 30 июн 2010, 17:12

О, щас про генератор случайных чисел почитаю!)

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Мой дом - тюрьма...

Сообщение Aerton » 30 июн 2010, 17:19

Только не надо изобретать свои собственные Epic Fail RNG, когда есть куча нормальных, работающих алгоритмов с открытым кодом.

Аватара пользователя
Hogar
Сообщения: 5
Зарегистрирован: 18 янв 2010, 19:34
Откуда: Севастополь

Re: Мой дом - тюрьма...

Сообщение Hogar » 30 июн 2010, 18:23

Можно использовать линейный конгруентный метод. Кодируется за 5 минут, необходимо всего три условия. Весьма годный.

Аватара пользователя
Anfeir
Сообщения: 876
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Мой дом - тюрьма...

Сообщение Anfeir » 30 июн 2010, 19:50

Aerton писал(а):Только не надо изобретать свои собственные Epic Fail RNG, когда есть куча нормальных, работающих алгоритмов с открытым кодом.
Пальцы тоже незачем гнуть, иногда быстрей реализовать за 5 минут то, что пришло в голову, и иметь над этим полный контроль, чем искать что-то готовое левое. Незачем из-за каждого пустякового вопроса подседать на именованные алгоритмы. Головой думать тоже полезно. В том числе и над скоростью работы алгоритма и над тем как он вообще работает. И, например, над тем, что иногда полезно бывает иметь не чистую последовательность, а постоянное соответствие, чтобы, скажем, по паре (x,y) всегда выдавалось одно и то же псевдослучайное число, которое зависит только от x и y (ну и от seed).

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Мой дом - тюрьма...

Сообщение Aerton » 30 июн 2010, 20:29

Hogar писал(а):Можно использовать линейный конгруентный метод. Кодируется за 5 минут, необходимо всего три условия. Весьма годный.
Да, он конечно получше, чем вышеприведённый, но для игр, настолько сильно зависящих от рандома, как рогалики, он не "весьма", а "едва" годный. Слишком сильна зависимость идущих подряд значений.

Anfeir Никакого загибания пальцев тут нет. Просто это недобросовстно - советовать другим людям использовать заведомо плохие решения, ведь кто-нибудь может по незнанию их применить. Головой конечно думать полезно, но стоит перед этим ознакоимиться с теоретической частью. Да и найти хороший алгорим с исходником на любимом языке тоже вряд ли займёт больше минуты-другой. Даже если вдруг уйдёт час или два, чтобы запинать готовый исходник в свою среду, это всё равно с лихвой окупится тем, что не придётся искать странные баги в своём алгоритме генерации, которые на самом деле вызваны лишь кривым рандомом.
Anfeir писал(а):И, например, над тем, что иногда полезно бывает иметь не чистую последовательность, а постоянное соответствие, чтобы, скажем, по паре (x,y) всегда выдавалось одно и то же псевдослучайное число, которое зависит только от x и y (ну и от seed).
Отображение x,y -> z это задача совсем не для RNG. Даже в твоём собственном примере оно делается через какой-то хеш.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя