2013-12-03 2 views
2

поэтому я делаю сноубординг, и, когда игрок едет вниз, я хочу, чтобы ландшафт случайно генерировал. Сейчас я использую этот код:Алгоритм для случайного создания объектов

void Biome::draw() 
{ 
    srand(seed); // seed is generated elsewhere 
    for (int x = 0; x < maxObstAmount; x++) 
    { 
     int xLoc = rand() % 640; 
     int yLoc = rand() % 480; 
     int obst = rand()%obstsInBiome.size(); 
     obstsInBiome[obst].drawObstacle(xLoc, yLoc); 
    } 
} 

Функция выбирает случайное препятствие в биоме, и запускает его в случайном месте на экране, который, по существу, то, что я хочу. Однако это заставляет объекты перекрываться и т. Д., Поэтому мне просто интересно, может ли кто-нибудь помочь мне придумать лучший алгоритм для их создания, чтобы они не перекрывались? Спасибо

+0

что вы застряли? Разве вы не можете просто сохранить список всех порожденных препятствий и проверить, основываясь на этом, прежде чем вы создадите новый? –

+0

Я думал, что циклический цикл через 100 раз каждый раз, когда я создаю новый объект, будет неэффективным, разве это не так? – picklechips

+2

Если у вас есть 100 объектов на экране в любой момент времени, цикл по массиву будет наименьшим из ваших проблем. –

ответ

2

Вы можете вычислить области, в которые вы могли бы сгенерировать новый объект, не накладываясь заранее, и использовать этот диапазон для создания позиции нового объекта.

EDIT:

Вот описание алгоритма Я хотел бы использовать данный сценарий вы описали:

Я изображающее нечто подобное с й-у географии. Где o - объекты, о которых идет речь. C является горизонт создания.

 |-------------------------------------------------------------------------------- 
    |  o   o 
    |   o   o 
    |o   o      <-- Player moves this direction 
^|  o o o 
    | | o    o 
    y |-------------------------------------------------------------------------------- 
    C x--> 

Если у вас есть только один объект на x-позицию, то проблема довольно тривиальна. На приведенной выше диаграмме смежные o представляют собой объекты с размером в направлении y.

Это вторая схема четко разграничить отдельные объекты:

 |-------------------------------------------------------------------------------- 
    |  7   3 
    |   5   1 
    |9   4      <-- Player moves this direction 
^|  6 4 2 
    | | 8    2 
    y |-------------------------------------------------------------------------------- 
    C x--> 
  1. Сформировать свой первый объект.
  2. Создайте следующий объект в области, не занятой предыдущим объектом.
  3. Повторите шаг 2, если хотите.

Если вы можете иметь более одного объекта за х-положении, или если объекты имеют некоторую ширину в направлении оси х:

 |-------------------------------------------------------------------------------- 
    |  o   o 
    |   o   o 
    |o   oooo      <-- Player moves this direction 
^|  o  ooo 
    | | o    ooo 
    y |-------------------------------------------------------------------------------- 
    C x--> 

или

 |-------------------------------------------------------------------------------- 
    |  7   3 
    |  7  5   1 
    |  7 4444      <-- Player moves this direction 
^| 88  6  222 
    | | 88    222 
    y |-------------------------------------------------------------------------------- 
    C x--> 

Ваша проблема перекрытия становится немного сложнее отслеживать, но он по-прежнему управляем.

  1. Создайте свой первый объект.
  2. Проверить объекты, начиная с немедленным предыдущим объектом до первого объекта без измерений, которые вмешиваются или пересекают горизонт созданияC и устраняющее пространству, занимаемые ими от выбора пула позиций, чтобы создать свой новый объект ,
  3. Повторите шаг 2.

Выработать на шаг, чтобы я приведу пример:

 |-------------------------------------------------------------------------------- 
    | 
    11|1 
    11|1          <-- Player moves this direction 
^| 
    | | 
    y |-------------------------------------------------------------------------------- 
    C x--> 

Скажем, у нас этот сценарий, у нас есть создать object 1, только треть этого объекта даже с точки зрения, но мы можем посмотрим, создадим ли мы еще один объект до того, как этот объект окажется в поле зрения, это будет проблематично. Чтобы избежать перекрытия, мы можем выбрать случайное положение и ширину, которые могут существовать в пространстве, расположенном выше object 1. Ниже будет действительный выбор:

 |-------------------------------------------------------------------------------- 
     | 
     1|11 
     1|11          <-- Player moves this direction 
^ | 
    | 22 | 
    y |-------------------------------------------------------------------------------- 
     C x--> 

сценарий дальше может быть что-то вроде этого:

 |-------------------------------------------------------------------------------- 
     |  33 
     |  33   111 
    4|4     111      <-- Player moves this direction 
^4|4   22 
    | |  
    y |-------------------------------------------------------------------------------- 
     C x--> 

Вы не можете разместить object 5 где object 4 рисуется, но объекты 3, 2 , и 1 находятся в этом месте и не нуждаются в рассмотрении. Таким образом, вы можете проверить свой алгоритм против последнего созданного объекта, 4, (и, возможно, 3 в зависимости от того, как вы установили игру) и соответственно установить лимиты создания.

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

+0

Единственный способ, которым я мог бы это сделать, - хранить позицию объектов в массиве каждый раз, когда я создаю один, а затем циклически перебирать массив уже используемых позиций, когда я создаю новый объект, но ездить по петле 100 раз каждый раз, когда я создаю новый объект, неэффективен? – picklechips

+0

@ RyanMartin Я не думаю, что вам нужно будет хранить отдельный массив, если у вас уже есть ссылки на эти объекты, я предполагаю, что вы можете получить доступ к их положению и ширине и просто вычислить их на лету. Я не знаю, как ваша игра настроена, но я представляю, что у вас есть объекты, идущие к сноуборду, идущему вниз. Тогда вы столкнулись бы только в случае перекрытия с объектами, которые существуют на горизонте, где вы будете генерировать новые объекты. Тогда вам не нужно было бы цитировать и проверять все более 100 объектов, а вместо них просто близкие к горизонту? –

+0

Ну, я планирую, что игрок действительно движется вниз, а затем препятствия нерест и игрок, проходящий мимо них, затем они появляются при необходимости перед экраном, прежде чем игрок достигнет их. Я думаю, что я мог бы понять некоторые вещи с этими идеями, я посмотрю, как все пойдет – picklechips

Смежные вопросы