1372 подписчика
Продолжаю тему столкновения объектов.
Короче говоря, я долго обдумывал идею о том, как сообщить игроку обратную связь о том, что действие не может быть выполнено. Изначально, я не просто хотел сообщить эти сведения, но и выдать целеуказание на исправление: некоторое смещение, которое позволит подвинуть объект на указанную величину и избежать столкновения. Иными словами - выдачи рекомендации о расхождении.
Было придумано несколько вариантов и все они объединялись лишь одним: слишком сложно. И для реализации, и для выполнения. Предлагалось высчитывать вектора движения точек, определять "безопасные позиции" относительно точек пересечения и производить пропорциональное смещение в обратном направлении. Даже звучит пугающе (реализация, к слову, не слишком сложная, но сколько ресурсов будет сжираться на расчёт смещения, которое, возможно, даже не к каждому случаю подойдёт).
Короче говоря, было решено пойти другим путём: взаимодействие с преградами через действия обработчика.
Что это значит. Например, машинка под углом въезжает в стену и упирается (въехала в текстуры проще говоря). Обработчик сообщает, мол, нельзя произвести такое движение. Далее, управляющая программа пробует произвести смещение поменьше (например, на половину), потом ещё поменьше - и так до тех пор, пока на получится сделать минимально допустимое смещение.
Главное достоинство такого метода заключается вот в чём: во-первых, мы избавляемся от расчётов, которые не факт, что себя оправдают (снижение нагрузки на процессор); во-вторых, снижаем ещё больше нагрузку на процессор в случаях, когда такие вычисления, в принципе, не нужны (упоминавшийся ранее пример наезда на лужу и снижение скорости).
В качестве оптимизации существующего алгоритма - можно возвращать набор тел, с которыми произошло пересечение и их тип (какое-то, пусть даже целочисленное, свойство, позволяющее по-разному реагировать на столкновения).
1 минута
25 августа 2022