Генерация комнаты
|
|
ress | Дата: Вторник, 28 Августа 2012, 21:49 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Разрабатывая "движок" для будущей игры, представляющей из себя клона The Binding of Isaac, я напоролся на проблему с генерацией местности.
Суть этой проблемы заключается в том, что оригинал - The Binding of Isaac выдает уровни с зеркальной симметрией, и в результате они смотрятся довольно-таки неплохо... Вот и я хочу сделать что-то похожее, но никакой мысли по реализации симметрии не возникает. Ребят, может поможете советом?
Я очень недоволен...
|
|
| |
LunarPixel | Дата: Вторник, 28 Августа 2012, 21:56 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| мм.. ну например так: делишь локацию на две части, генерируешь одну из них, записываешь информацию в двумерный массив/сетку/или куда удобно, принимая, например, ячейку массива, за клетку на уровне. Записав в ячейку 1, считаем, что в этом месте на уровне камень, записав 2 - яма и т.д. Затем зеркально разворачиваем массив и по нему строим вторую часть локации.
|
|
| |
BrightSpot | Дата: Вторник, 28 Августа 2012, 21:57 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| строй половину уровня, записывай тип и расположение объектов в масивы\переменные\ини(текстовые) файлы и при создании комнаты по этим переменным отстраивай вторую половину уровня... что бы была зеркальная симетрия просто придумай формулу что развернет координаты( типа xx\yy- позиция обьекта, значит его клон должен быть в позиции длинна\ширина комнаты - xx\yy) хотя скорее всего я не понял смысл вопроса...Добавлено (28.08.2012, 21:57) --------------------------------------------- пиксель опередил=))
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
ress | Дата: Вторник, 28 Августа 2012, 22:17 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| Quote (LunarPixel) Затем зеркально разворачиваем массив и по нему строим вторую часть локации. Да... Но с зеркальным разворотом массива у меня возникла проблема. LunarPixel, можешь немного пояснить, как это осуществить?
Quote (BrightSpot) что бы была зеркальная симетрия просто придумай формулу что развернет координаты При помощи карандашика и бумаги, а может и вдруг всплывшей в мозгу математики я сообразил, что если из размера комнаты по иксу вычесть абсциссу(такой термин есть в программировании? ) объекта A, то объект B размещенный по этим координатам будет зеркален объекту A.
Я очень недоволен...
|
|
| |
BrightSpot | Дата: Вторник, 28 Августа 2012, 22:29 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| Quote (ress) При помощи карандашика и бумаги, а может и вдруг всплывшей в мозгу математики я сообразил, что если из размера комнаты по иксу вычесть абсциссу(такой термин есть в программировании? ) объекта A, то объект B размещенный по этим координатам будет зеркален объекту A. с таким успехом мог просто предолженую мной формулу взять=))) то же самое=))Добавлено (28.08.2012, 22:29) --------------------------------------------- я то думал что мне твоя зеркальность напоминает... вспомнил - делал зацыкленный уровень с "невидимым" переходом так там тоже кусок комнаты переносил в конец и делал идентичные действия между ними и просто "телепортировал" персонажа до того как будет заметен конец\начало комнаты=))) эхх ностальгия=)
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
LunarPixel | Дата: Вторник, 28 Августа 2012, 22:35 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| по массиву:
mas 1 2 3 4 5 6 7 8 9
Code for (i=0; i<l; i+=1) for (j=0; j<l; j+=1) { mas2[i,j]=mas[l-i;l-j] }
mas2 9 8 7 6 5 4 3 2 1
|
|
| |
ress | Дата: Вторник, 28 Августа 2012, 22:49 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Quote (LunarPixel) по массиву Ух я нуб... Спасибо что просветил. Quote (BrightSpot) с таким успехом мог просто предолженую мной формулу взять Как я сообразил, ты отражаешь объекты по X и Y одновременно. А в моем случае желательно только по X или Y.
Я очень недоволен...
|
|
| |
Saladin | Дата: Вторник, 28 Августа 2012, 22:49 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Quote (ress) Да... Но с зеркальным разворотом массива у меня возникла проблема. LunarPixel, можешь немного пояснить, как это осуществить? Сетку использовать будет намного удобнее. В сетке первая ячейка 0,0 это последняя ячейка в для зеркальной части. Получается что вторую половину уровня мы начинаем отстраивать в обратном порядке.
Берем двойной цикл: Code for (i=0; i<grid_size/2; i+=1) for (j=0; j<grid_size/2; j+=1) { //тут устанавливаем обьект на координаты сетки i*cell_size,j*cell_size и записываем тип обьекта в ячейку сетки i,j instance_create(i*cell_size,j*cell_size,object) ds_grid_add(grid_id,i,j,index) //а тут размещаем зеркальный обьект и если нужно записываем в сетку instance_create((grid_size-i)*cell_size,(grid_size-j)*cell_size,object) ds_grid_add(grid_id,grid_size-i,grid_size-j,index) }
Если у нас в сетку уже записана половина комнаты, то таким же макаром извлекаем айди обьекта из ячеки сетки grid_size-i,grid_size-j и создаем его в позиции grid_size-i)*cell_size,(grid_size-j)*cell_size.
Надеюсь внятно обьяснил. Проще только вагоны разгружать.
Анбаннэд. Хэлоу эгин =)
Сообщение отредактировал Saladin - Вторник, 28 Августа 2012, 23:01 |
|
| |
BrightSpot | Дата: Вторник, 28 Августа 2012, 22:57 | Сообщение # 9 |
заслуженный участник
Сейчас нет на сайте
| Quote (ress) ты отражаешь объекты по X и Y одновременно я писал через"\" тоесть можно или так или так... ты ведь не писал по какой оси нужно зеркалить...
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
ress | Дата: Вторник, 28 Августа 2012, 22:58 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Quote (Saladin) Надеюсь внятно обьяснил. Да. Я все понял. Спасибо. Quote (BrightSpot) я писал через"\" тоесть можно или так или так... ты ведь не писал по какой оси нужно зеркалить... А разве есть смысл писать по какой оси зеркалить нужно? Что так, что этак сделаешь. Действия все-равно аналогичны.
Я очень недоволен...
Сообщение отредактировал ress - Вторник, 28 Августа 2012, 23:02 |
|
| |
BrightSpot | Дата: Вторник, 28 Августа 2012, 23:04 | Сообщение # 11 |
заслуженный участник
Сейчас нет на сайте
| Quote (ress) Действия все-равно аналогичны. после опыта общения на этом форуме уже автоматом пытаешся каждую мелочь расжевать, иначе может последовать куча напрягающих вопросов...
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
Saladin | Дата: Вторник, 28 Августа 2012, 23:05 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Маленькая неточность в коде, лень переписывать, скажу на словах. В приведенном псевдокоде зеркально отображается четверть комнаты (верхний левый угол в нижний правый). Чтобы отражалась половина нужно брать чистый перебор по одной из осей, либо чистый i либо j.
Анбаннэд. Хэлоу эгин =)
|
|
| |