У меня проблемы с функциями move_and_slide и move_and_colide в GODOT

Я пытаюсь создать базовый симулятор эволюции, и для этого мне нужно, чтобы мои случайно созданные существа двигались к ближайшей еде. Я уверен в коде, который определяет направление для существ, поскольку я протестировал его, изменив положение на ожидаемую величину (да, я знаю, что не должен напрямую менять положение). Когда я затем использую move_and_slide или move_and_collide, я обнаруживаю, что вместо того, чтобы двигаться, как ожидалось, они прыгают на линию или собираются вдоль центра окна и, кажется, беспорядочно перемещаются вверх и вниз. Я не уверен, что вызывает это движение, поскольку все мои прошлые применения move_and_slide или move_and_collide работали отлично.

func move(food_positions, delta):
    if playing:
        direction = choose_direction(food_positions)
        if direction != null:
            move_and_slide(direction*SPEED)

Этот код вызывается извне, поскольку существа создаются внутри сцены «симуляции». food_positions - это массив Vector2, используемый для вычисления желаемого направления. Поскольку он вызывается из другой сцены, мне нужно было передать значение дельты при использовании move_and_collide.

Код для choose_direction следующий:

    var closest_food_pos = null
    var closest_food_distance = null
    # iterate through each food
    for food_pos in food_positions:
        # get distance betweeen the two positions
        var gap = food_pos - position
        var distance_food_me = sqrt(pow(gap.x,2) + pow(gap.y,2))
# insert test to within view distance here
        # confiming that we are not comparing to null
        if closest_food_distance != null and closest_food_pos != null:
            # comparing distances
            if closest_food_distance > distance_food_me:
                # setting to closest food
                closest_food_distance = distance_food_me
                closest_food_pos = food_pos
        else:
            #if null need to set to first food to compare
            closest_food_distance = distance_food_me
            closest_food_pos = food_pos

    if closest_food_distance != null and closest_food_pos != null:
        var gap = closest_food_pos - position
        var go_direction = gap.normalized()
        return go_direction.normalized()
    else:
        # add ai go towards function call here
        return null

Он еще не полностью закончен, и я планирую добавить кое-что в будущем.

Как примечание, это часть сцены существа, динамически инстансированная в сцене симуляции, которая является предварительно инстансированной / частью основной сцены, которая будет использоваться для управления и последующего удобства использования.

Репозиторий Git Hub: https://github.com/benpotter480/Evolution_simulation_that_doesnt_work

Извините, если части моего репозитория не отображаются как обычно, поскольку я новичок в его использовании.

Спасибо за любой совет.


person notme21    schedule 04.11.2019    source источник
comment
Не могли бы вы опубликовать еще связанный код? Например, для choose_direction() и для остальных ходов?   -  person hola    schedule 07.11.2019
comment
@hola, доделали это и добавили еще немного пояснений. Если есть еще что-нибудь, что может помочь, не стесняйтесь спрашивать.   -  person notme21    schedule 10.11.2019
comment
Привет, я настраиваю сцену с помощью предоставленного вами кода, и она отлично работает. Итак, проблема в другом. Как ты находишь food_positions? На что похоже дерево узлов?   -  person hola    schedule 11.11.2019
comment
На самом деле, если бы вы могли опубликовать минимальный проект, который я могу загрузить и протестировать, это было бы лучше всего.   -  person hola    schedule 11.11.2019
comment
@hola, я добавил репозиторий GitHub для своего проекта.   -  person notme21    schedule 15.11.2019
comment
ладно, круто, я чуть-чуть посмотрю на это.   -  person hola    schedule 15.11.2019


Ответы (1)


Хорошо, у меня есть решение.

Предисловие

Сначала я добавил точку останова на move_and_slide() и запустил проект из основной сцены для пошагового выполнения кода. Ничего не вышло. Значения были установлены и инициализированы. Я добавил операторы печати, чтобы узнать, что food_positions, creature_positions и direction показывали с течением времени, думая, что первые кадры не виноваты. Но ничего не вышло.

Я проверил сцену с существом. Там должно было что-то быть. Код выглядел нормально, ничего, что должно было заставить move_and_slide() делать то, что он делал. Я провел сцену с существом изолированно. Угадайте что, это сработало. Так что, по крайней мере, я знаю, что этого нет в сцене с существами.

Это было неприятно. Насколько я мог судить, в моделировании не было никаких причин. Я пробовал произвести 100 продуктов питания, 100 существ.

Потом 1 существо.

Это существо не двигалось. Это было что-то. Когда существ было больше, их как будто вталкивали друг в друга. Еще немного поигравшись, я бездумно крутил wall_left статичное тело и замечал этот небольшой выпуклость, а затем, подождите, это не RectangleShape2D.

Я удалил все стены и ...

Это сработало! Симуляция сработала!

TL; DR / Решение

У LineShape2D коллизионных форм стен нормали были обращены неверно. Измените Normal LineShape2D с (0, -1) на (0, 1).

Заключение

Это была головная боль. Надеюсь, это поможет и удачного кодирования!

person hola    schedule 15.11.2019
comment
Спасибо большое. Я просто повернул стены, и это работает. - person notme21; 16.11.2019