2012-02-16 4 views
0

Как следует из названия, кто-нибудь знает правильный способ сохранения объектов, которые постоянно повторяются (в настоящее время устанавливаются в случайное положение по оси x) от нереста друг к другу , в игроком?Предоставление объектов избегать нереста друг над другом

ответ

0

Вы можете добавить чек в событие Создать вашего объекта респауна, который использует place_meeting(x,y,object_index), чтобы проверить, пересекает ли он другой экземпляр того же типа объекта. Если это так, вы можете попробовать установить другую позицию.

Вы также можете сделать это в коде, который нерестится экземпляры, при первом создании экземпляра, а затем проверить случайные места, пока вы не найдете хороший:

newinst = instance_create(0,spawnY,object0); 
with(newinst) { 
    var tries, done; 
    tries = 0; 
    done = false; 
    do { 
     tries += 1; 
     x = irandom(room_width); 
     done = !place_meeting(x,y,object_index); 
    } until(done or tries>50); 
    if(not done) { 
     // not enough space (or bad luck), bail out 
     instance_destroy(); 
    } 
} 

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

+0

Я заменил вершину следующим: newinst = instance_create (random (room_width), random (room_height), objTreasure); И он отлично работает. –

0

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

while (true) { 
    done = true; 
    with(obj_wall) { 
     if (point_distance(other.x, other.y, x, y) < 30) { 
      other.x = random(room_width); 
      other.y = random(room_height); 
      done = false; 
     } 
    } 
    if (done) { 
     break; 
    } 
} 

Приведенный выше код охватывает все объекты obj_wall, которые в данный момент находятся в игре. Если случается, что ваше вновь созданное существо находится на расстоянии 30 пикселей от стены, будет выбрано случайное новое местоположение. Каждый раз, когда выбирается новое местоположение, конфликт снова проверяется (выполняется переменная). Надеюсь, поможет!