Заставить объекты избегать нереста друг на друга - PullRequest
0 голосов
/ 16 февраля 2012

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

Ответы [ 2 ]

0 голосов
/ 28 июля 2015

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

0 голосов
/ 16 февраля 2012

Вы можете добавить проверку к событию Create вашего возрождающегося объекта, который использует 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();
    }
}

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

...