1. ГГ выходит за пределы комнаты. 2. Комната сохраняется в бинарный файл с именем текущей позиции (Например "WX6,WY-3.MAP") 3. Комната очищается. 4. проверяется: если есть сохранение то загружается из файла иначе генерируется новая карта 5. ГГ телепортируется на противоположную выходу позицию (функция типа wrap_screen или вручную)
Я изучаю GML второй день всего, но очень нравится. Вот первая поделка, которая перерастает во вторую. Вот То что получилось
Сначала сделал так:
Потом переделал так:
Так вот вопрос к знатокам... я плохо знаю как gml так и программирование поэтому у меня проблемы с реализацией. Но чтобы не с пустыми руками я написал псевдокод чтобы самому понять. (очень подробный):
Код
global.xpos=0 global.ypos=0 //Псевдопозиция комнаты. Т.е. если ушёл вверх то ypos+1 если в левую часть экрана то xpos-1 //Отсчёт идет от старта
save = file_text_open_write(global.xpos*global.ypos.map); { if instance_position(x,y,obj) file_text_write_string(save,'instance_create('+string(x)+string(',')+string(y)+string(',obj)')); file_text_writeln(save); then instance_destroy() } file_text_close(save)
//смена комнат { ЕСЛИ (Х позиция объекта ГГ) < 0 ТО global.world_xpos = global.world_xpos-1 создать файл ini записать координаты объекТОв в комнате сохранить ini MAP[xpos,ypos].map очистить комнату ЕСЛИ есть файл[xpos-1,ypos].map ТО(загрузить) ИНАЧЕ (сгенерировать новые объекты) (Х позиция объекта ГГ)=(Х позиция объекта ГГ)+ширина_комнаты }
{ ЕСЛИ (Х позиция объекта ГГ) > ширина_комнаты ТО global.world_xpos = global.world_xpos+1 создать файл ini записать координаты объекТОв в комнате сохранить ini MAP[xpos,ypos].map очистить комнату ЕСЛИ есть файл[xpos+1,ypos].map ТО(загрузить) ИНАЧЕ (сгенерировать новые объекты) (Х позиция объекта ГГ) = 0 scr(сгенерировать новые объекты) }
{ ЕСЛИ (Y позиция объекта ГГ) < 0 ТО global.world_xpos = global.world_ypos+1 создать файл ini записать координаты объекТОв в комнате сохранить ini MAP[xpos,ypos].map очистить комнату ЕСЛИ есть файл[xpos,ypos+1].map ТО(загрузить) ИНАЧЕ (сгенерировать новые объекты) (Y позиция объекта ГГ) = высота_комнаты scr(сгенерировать новые объекты) }
{ ЕСЛИ (Y позиция объекта ГГ) > высота_комнаты ТО global.world_xpos = global.world_ypos-1 создать файл ini записать координаты объекТОв в комнате сохранить ini MAP[xpos,ypos].map очистить_комнату ЕСЛИ есть файл[xpos,ypos-1].map ТО(загрузить) ИНАЧЕ (сгенерировать новые объекты) (Y позиция объекта ГГ) = 0 scr(сгенерировать новые объекты) }
В оригинале в том примере который по ссылке используются массивы, но они очень ограничивают размер комнаты. у меня она сейчас 10000*10000 чтоб было где разгуляться. Ну и плюсь.. я плохо понимаю как их использовать.
я так и не смог заставить это работать в своём проекте. уже 12 часов долблюсь(
Буду рад любой помощи.
Сообщение отредактировал dimonnomid - Четверг, 25 Апреля 2013, 16:14
Немного несовместимые понятия. По картинке чистой воды скролл шутер. (это не плохо, жанр интересный)
Цитата (dimonnomid)
Да ладно вам, когда и где бесконечный мир был лишним.
О, да пустой бесконечный мир самое лучшее о чём я мечтал.
Цитата (dimonnomid)
В оригинале в том примере который по ссылке используются массивы, но они очень ограничивают размер комнаты. у меня она сейчас 10000*10000 чтоб было где разгуляться.
И чём ты даже эту комнату наполнишь?
По теме: На скрине огромнейшие корабли, для РОГАЛИКА они должны быть в разы меньше что бы побольше всего вместить на карту. Куча карт на которых по пять корабликаф занимающих всю карту будут очень унылы.
Цитата (dimonnomid)
1. ГГ выходит за пределы комнаты. 2. Комната сохраняется. 3. Комната очищается. 4. проверяется: если есть сохранение то загружается иначе генерируется новая карта 5. ГГ телепортируется на противоположную выходу позицию
Будут резкие переходы между картами аки локации. А грузить каждый такой кусочек как на скрине придётся примерно раз в пять секунд. Лаги (точнее ими будут казатся мегачастые переходы) будут раздражать любого игрока.
Итог - я не особо понял идею (а если правильно то это тихий ужас) и не могу ничем помочь.
Цитата (dimonnomid)
Я изучаю GML второй день всего, но очень нравится.
Тогда зачем бросился делать такую сложную идею? Сделай сначала простые игры, но по твоей теме (тайловый рпг, рогалик и проч.) и после создания сразу удаляй в корзину. Делай мини-идее вроде - проект с инвентарём, проект с генерацией карт, с сохранением и проч. Если ты просишь просто так взять и написать твой псевдокод нормальным кодом то давай досвиданья.
Немного несовместимые понятия. По картинке чистой воды скролл шутер. (это не плохо, жанр интересный)
Чем это они не совместимые? поищите космический рогалик. Эклектика
Цитата
О, да пустой бесконечный мир самое лучшее о чём я мечтал. И чём ты даже эту комнату наполнишь? По теме: На скрине огромнейшие корабли, для РОГАЛИКА они должны быть в разы меньше что бы побольше всего вместить на карту. Куча карт на которых по пять корабликаф занимающих всю карту будут очень унылы.
Я хоть где то заикнулся про пустой мир? Я приложил 2 файла. Первый скролл шутер, с него я начал и его же скриншот. Второй посмотрите всё поймёте.
Цитата
Будут резкие переходы между картами аки локации. А грузить каждый такой кусочек как на скрине придётся примерно раз в пять секунд. Лаги (точнее ими будут казатся мегачастые переходы) будут раздражать любого игрока.
Пример как это работает я тоже приложил. Работает надо заметить отлично.
Цитата
Итог - я не особо понял идею (а если правильно то это тихий ужас) и не могу ничем помочь.
Если вы не посмотрели ссылки и не поняли идею и вопроса, то почему я вижу ваше сообщение здесь?
Цитата
Тогда зачем бросился делать такую сложную идею? Если ты просишь просто так взять и написать твой псевдокод нормальным кодом то давай досвиданья.
Про код писать я тоже не упоминал. Я просил помощи, где рыть или как переделать. Верный ли алгоритм. Да и разве эта идея сложна?
Знаете, лычка «гильдия школоты», у вас в подписи, полностью себя оправдывает, спасибо за дельные советы.
а про рациональность... мне кажется вполне неплохая. "Переход" очень быстро происходит. И загрука или генерация Проблемы с реализацией у всех и всегда. Щас вот дописываю тестовый блок по сохранению и загрузке.
Наконец то разобрался как работает запись переменных в файл
Код
save = file_text_open_write('save.txt') file_text_write_string(save,'instance_create('+string(ПОЗИЦИЯ-Х)+string(',')+string(ПОЗИЦИЯ-Y)+string(',Osomething)')); file_text_writeln(save); file_text_close(save)
Наконец то разобрался как работает запись переменных в файл
Юзайте ини и навсегда забудьте этот мазохизм. Онлайн справка. Т.е для того что бы сохранить переменную "пиченьки кол-во" нужно всего лишь написать: ini_open("system.sys")//открываем файл system.sys ini_write_real("Еда","Сколько пиченек","пиченьки кол-во")//записывам переменную в секцию еда ini_close()//закрываем
pololo=123;//переменная для записи a = file_text_open_write(string(pololo)+".sys")//создаём файл file_text_close(a)//закрываем созданный pololo="NIKITA" a = file_text_open_write(string(pololo)+".sys") file_text_close(a)
Код роботает. Зы. Код создаёт два разных файла. КЭП.
Сообщение отредактировал stalker5889 - Четверг, 25 Апреля 2013, 17:09