Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Столкновение двух объектов круглой формы (http://www.flasher.ru/forum/showthread.php?t=171761)

australian incognito 23.11.2011 15:41

Столкновение двух объектов круглой формы
 
Всем доброго дня, у меня очередной вопрос к сообществу.
Представьте себе игровое поле, на котором движутся 2 (или более) объекта круглой формы (hero и enemy1, enemy2 и т.д.). Объект hero двигается за курсором мыши со скоростью V1. Обьекты enemy движутся за hero со скоростью V2, которая, естественно ниже скорости героя.
Так вот задача следующая - при определении столкновения (как это сделать математически мне уже подсказали) нужно реализовать такое их поведение, чтобы объект enemy останавливался (с этим также нет проблем), а объект hero - начинал огибать контур enemy в направлении курсора мыши. Очевидно, что по сравнению с общей игровой сценой - радиусы объектов enemy и hero малы и говоря, что герой будет "огибать" врага - я понимаю, что скорее это будет не плавная круговая траектория, а, возможно, ломанная линия или что-то в этом духе.
Помогите с фазой огибания - хочется иметь максимально простое и не требовательное к ресурсам решение.
Все что находил в поиске тут и в гугле - имело отношение к отскоку объектов друг от друга (а-ля бильярдные шары).
Ситуация, когда будет 2 врага и при столкновении, я начну огибать первого, подбежит второй и закроет проход - можно рассмотреть тут же или создам отдельный топик - пока понять бы как огибать просто одного врага.
Спасибо заранее.

nuToH 23.11.2011 16:26

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

australian incognito 23.11.2011 17:08

Метод крайне интересен по своей сути, но как мне кажется для меня он не применим по 2-м причинам:
1. Он хорош для статичных препятствий, которые герой мог бы огибать интеллектуально, но когда препятствие динамично и стремится к герою - получится траектория самого героя очень уж широкой, чтобы оббежать врага, если курсор находится за его (врага) спиной.
2. В данном случае интеллектуальность траектории героя - это плохой фактор, т.к. суть игры - именно с помощью мыши (и реакции игрока) уводить героя от врагов. Вопрос огибания (обхода, другими словами) врага актуален лишь при условии, что касание состоялось!

nuToH 23.11.2011 17:33

Можно просто не учитывать противника на расстоянии более N пикселей. а траектория правится коэффициентами и степенями силовых/весовых уравнений.

australian incognito 23.11.2011 18:12

Вложений: 1
Я вижу как мне кажется более простой метод, основанный скорее на математике, чем на физике:
Смотрим приложенную картинку:
Герой - синий круг с центром в точке А.
Враг - красный круг с центром в точке В.
Курсор - в точке С.
Моя идея такова - при столкновении двух обьектов - герой начинает двигаться вместо линейной траектории - по круговой траектории (штриховая красная линия на рисунке) до тех пор пока отрезок AC пересекает эту штриховую линию в 2-х точках (А и А'). Как только точки А и А' сойдутся в одну (точка D) - герой переходит опять на линейную траекторию.

Тут соответственно встают следующие вопросы:
1. Как идея вообще? Может я не учел какие-то нюансы?
2. Подскажите уравнение движения по окружности (эллипсу), желательно не математическое, а скриптовое (математическое я знаю, но не совсем понимаю как из него правильно получить нужное)
3. В случае, если курсор находится в позиции C' - я так понимаю есть смысл переносить цель, к которой стремится герой - в точку А'.

Может кто-то сможет попытаться накидать общий алгоритм такого линейно-нелинейного движения, как -то пока у меня не очень укладывается как все это обьединить в кучу.

Ookami 23.11.2011 18:25

Цитата:

Как только точки А и А' сойдутся в одну (точка D) - герой переходит опять на линейную траекторию.
Немного не так. Даже по Вашему рисунку видно, что переход на линейную траекторию можно начать раньше. Фактически - рисуем из точки С 2 касательных к окружности вокруг врага (которая красным пунктиром), и как только центр нашего героя совпадает с одной из точек касания - переходим на линейную траекторию

Добавлено через 39 секунд
2 касательных - справа и слева окружности

australian incognito 23.11.2011 19:28

Цитата:

Сообщение от Ookami (Сообщение 1047821)
Даже по Вашему рисунку видно, что переход на линейную траекторию можно начать раньше.

Не согласен, ни по моему рисунку, ни на самом деле - раньше выходить на прямую траекторию не стОит. Если не пренебрегать пересечением объектов, конечно.
Цитата:

Сообщение от Ookami (Сообщение 1047821)
2 касательных - справа и слева окружности

Там абсолютно не нужны 2 касательные - достаточно одно, нужно лишь создать условие - определяющее, двигаться по часовой стрелке или против. А условие явно будет завязано на то, лежит ли отрезок АС слева или справа от точки В.

nuToH 23.11.2011 19:38

идея отличная, не уверен что она легче в реализации, но зато в отличие от потенц полей тут все будет предсказуемо и однозначно.
есть еще легче вариант, если при следующем движении произойдет столкновение - проверять возможно ли двигаться +- 10 градусов влево/вправо. если нет тогда проверим +- 20 и т.д. при лобовом столкновении дело дойдет до 90 градусов и движение 1 шаг пройдет по касательной, далее угол будет уменьшаться.

australian incognito 23.11.2011 20:02

Цитата:

Сообщение от nuToH (Сообщение 1047834)
идея отличная, не уверен что она легче в реализации, но зато в отличие от потенц полей тут все будет предсказуемо и однозначно.
есть еще легче вариант, если при следующем движении произойдет столкновение - проверять возможно ли двигаться +- 10 градусов влево/вправо. если нет тогда проверим +- 20 и т.д. при лобовом столкновении дело дойдет до 90 градусов и движение 1 шаг пройдет по касательной, далее угол будет уменьшаться.

Да, этот метод был описан в одном популярном блоге - я с ним знаком. Но он слишком сложен и ресурсоёмок, в сравнении с моим (по-крайней мере мне так кажется) и хорош для сложных препятствий.

artcraft 23.11.2011 20:03

я думаю тут нужно сразу подумать о том что могут быть и другие преграды

мне кажется вот это как раз то что надо 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.