Вторник, 03 Декабря 2024, 20:57

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Генерация комнаты
ressДата: Вторник, 28 Августа 2012, 21:49 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Разрабатывая "движок" для будущей игры, представляющей из себя клона The Binding of Isaac, я напоролся на проблему с генерацией местности.

Суть этой проблемы заключается в том, что оригинал - The Binding of Isaac выдает уровни с зеркальной симметрией, и в результате они смотрятся довольно-таки неплохо... Вот и я хочу сделать что-то похожее, но никакой мысли по реализации симметрии не возникает. Ребят, может поможете советом? smile


Я очень недоволен...
LunarPixelДата: Вторник, 28 Августа 2012, 21:56 | Сообщение # 2
старожил
Сейчас нет на сайте
мм.. ну например так: делишь локацию на две части, генерируешь одну из них, записываешь информацию в двумерный массив/сетку/или куда удобно, принимая, например, ячейку массива, за клетку на уровне. Записав в ячейку 1, считаем, что в этом месте на уровне камень, записав 2 - яма и т.д. Затем зеркально разворачиваем массив и по нему строим вторую часть локации. smile

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)
что бы была зеркальная симетрия просто придумай формулу что развернет координаты

При помощи карандашика и бумаги, а может и вдруг всплывшей в мозгу математики я сообразил, что если из размера комнаты по иксу вычесть абсциссу(такой термин есть в программировании? biggrin ) объекта 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)
Надеюсь внятно обьяснил.

Да. Я все понял. Спасибо. smile
Quote (BrightSpot)
я писал через"\" тоесть можно или так или так... ты ведь не писал по какой оси нужно зеркалить...

А разве есть смысл писать по какой оси зеркалить нужно? Что так, что этак сделаешь. Действия все-равно аналогичны.


Я очень недоволен...

Сообщение отредактировал ress - Вторник, 28 Августа 2012, 23:02
BrightSpotДата: Вторник, 28 Августа 2012, 23:04 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
Quote (ress)
Действия все-равно аналогичны.

после опыта общения на этом форуме уже автоматом пытаешся каждую мелочь расжевать, иначе может последовать куча напрягающих вопросов...



Более мощный компьютер глючит быстрее и точнее.
SaladinДата: Вторник, 28 Августа 2012, 23:05 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
Маленькая неточность в коде, лень переписывать, скажу на словах. В приведенном псевдокоде зеркально отображается четверть комнаты (верхний левый угол в нижний правый). Чтобы отражалась половина нужно брать чистый перебор по одной из осей, либо чистый i либо j.

Анбаннэд. Хэлоу эгин =)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг