![]() |
Столкновение двух объектов круглой формы
Всем доброго дня, у меня очередной вопрос к сообществу.
Представьте себе игровое поле, на котором движутся 2 (или более) объекта круглой формы (hero и enemy1, enemy2 и т.д.). Объект hero двигается за курсором мыши со скоростью V1. Обьекты enemy движутся за hero со скоростью V2, которая, естественно ниже скорости героя. Так вот задача следующая - при определении столкновения (как это сделать математически мне уже подсказали) нужно реализовать такое их поведение, чтобы объект enemy останавливался (с этим также нет проблем), а объект hero - начинал огибать контур enemy в направлении курсора мыши. Очевидно, что по сравнению с общей игровой сценой - радиусы объектов enemy и hero малы и говоря, что герой будет "огибать" врага - я понимаю, что скорее это будет не плавная круговая траектория, а, возможно, ломанная линия или что-то в этом духе. Помогите с фазой огибания - хочется иметь максимально простое и не требовательное к ресурсам решение. Все что находил в поиске тут и в гугле - имело отношение к отскоку объектов друг от друга (а-ля бильярдные шары). Ситуация, когда будет 2 врага и при столкновении, я начну огибать первого, подбежит второй и закроет проход - можно рассмотреть тут же или создам отдельный топик - пока понять бы как огибать просто одного врага. Спасибо заранее. |
самый простой способ - поиск пути методом потенциальных полей (гуглится быстро).
грубо говоря на каждого из твоих юнитов действует 2 типа силы - сила притяжения (от нас к целевой точке пути) и сила отталкивания(от каждого другого юнита к нам). сила отталкивания обратнопропорциональна расстоянию(квадрату расстояния, смотря какого эффекта добиваетесь) до юнита, сила притяжения - прямопропорциональна расстоянию до целевой точки пути. результирующее направление и есть направление движения. |
Метод крайне интересен по своей сути, но как мне кажется для меня он не применим по 2-м причинам:
1. Он хорош для статичных препятствий, которые герой мог бы огибать интеллектуально, но когда препятствие динамично и стремится к герою - получится траектория самого героя очень уж широкой, чтобы оббежать врага, если курсор находится за его (врага) спиной. 2. В данном случае интеллектуальность траектории героя - это плохой фактор, т.к. суть игры - именно с помощью мыши (и реакции игрока) уводить героя от врагов. Вопрос огибания (обхода, другими словами) врага актуален лишь при условии, что касание состоялось! |
Можно просто не учитывать противника на расстоянии более N пикселей. а траектория правится коэффициентами и степенями силовых/весовых уравнений.
|
Вложений: 1
Я вижу как мне кажется более простой метод, основанный скорее на математике, чем на физике:
Смотрим приложенную картинку: Герой - синий круг с центром в точке А. Враг - красный круг с центром в точке В. Курсор - в точке С. Моя идея такова - при столкновении двух обьектов - герой начинает двигаться вместо линейной траектории - по круговой траектории (штриховая красная линия на рисунке) до тех пор пока отрезок AC пересекает эту штриховую линию в 2-х точках (А и А'). Как только точки А и А' сойдутся в одну (точка D) - герой переходит опять на линейную траекторию. Тут соответственно встают следующие вопросы: 1. Как идея вообще? Может я не учел какие-то нюансы? 2. Подскажите уравнение движения по окружности (эллипсу), желательно не математическое, а скриптовое (математическое я знаю, но не совсем понимаю как из него правильно получить нужное) 3. В случае, если курсор находится в позиции C' - я так понимаю есть смысл переносить цель, к которой стремится герой - в точку А'. Может кто-то сможет попытаться накидать общий алгоритм такого линейно-нелинейного движения, как -то пока у меня не очень укладывается как все это обьединить в кучу. |
Цитата:
Добавлено через 39 секунд 2 касательных - справа и слева окружности |
Цитата:
Цитата:
|
идея отличная, не уверен что она легче в реализации, но зато в отличие от потенц полей тут все будет предсказуемо и однозначно.
есть еще легче вариант, если при следующем движении произойдет столкновение - проверять возможно ли двигаться +- 10 градусов влево/вправо. если нет тогда проверим +- 20 и т.д. при лобовом столкновении дело дойдет до 90 градусов и движение 1 шаг пройдет по касательной, далее угол будет уменьшаться. |
Цитата:
|
я думаю тут нужно сразу подумать о том что могут быть и другие преграды
мне кажется вот это как раз то что надо http://wonderfl.net/c/m29Y |
| Часовой пояс GMT +4, время: 09:39. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.