![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Коллеги, назрел следующий интересный вопрос. Уже который день не могу придумать нормальный алгоритм для учета коллизий при следующих условиях:
1. Есть некая область в виде окружности 2. Внутри этой области есть другие окружности (3-5 штук), значительно более мелкие (радиус меньше в 5-10 раз) 3. Одна из мелких окружностей всегда движется за курсором - управляемый объект 4. Другая - всегда движется за первой (с чуть меньшей скоростью) - преследующий объект 5. Все прочие статичны - помехи 6. У каждой из окружностей заданы массы Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая Задача 2: не давать мелким окружностям выходить за границы большой окружности, в которую они помещены В целом и задачи вроде как совсем не сложные (учитывая, что это окружности). И решаются неплохо по-отдельности, но когда пытаюсь совместить воедино - видны какие-то погрешности, да и мой алгоритм похож на какие-то костыли для костылей. Надеюсь на ваши советы. Чтобы было все более наглядно/визуально - прилагаю ссылку на актуальную версию и мини-пояснения: - Бледно-зеленая окружность - самая большая, желаемая граница для прочих объектов - Ярко-зеленая окружность следует за курсором (масса 80) - Синяя ее преследует (масса 100) - Серые - статичные помехи (массы 60 и 120) Чтобы вы не подумали, что я хочу, чтобы кто-то все сделал за меня - готов обсуждать конкретные куски кода, конкретные участки алгоритма. Добавлено через 14 минут Сейчас все реализовано по следующей схеме: Объекты размещаются изначально так, чтобы не пересекались (это не принципиально, просто для удобства). На событии я двигаю управляемый объект с некоторым шагом в направлении мыши, а преследующий объект - в направлении управляемого. Как только каждый из этих объектов сдвинулся - я перебором пробегаюсь по координатам центров всех мелких объектов на сцене (кроме этого самого) и считаю дистанцию между центрами передвинутого объекта и всех остальных. Тут же, если дистанция меньше, чем сумма их радиусов - нахожу дельту. Далее в зависимости от того, чья масса меньше - двигаю легкий объект на дельту в направлении от более тяжелого, опять же проверив предварительно - не даст ли такой сдвиг новую коллизию с более тяжелым объектом. Дальше запускаю дополнительную функцию на проверку - не вышел ли сдвинувшийся объект за пределы большого круга. Если вышел - сдвигаю его назад на дельту в направлении центра большой окружности. Тут бы по-хорошему опять проверять на коллизии... Вообщем, я запутан.
__________________
Игра "Пушкин" Последний раз редактировалось australian incognito; 17.01.2015 в 02:17. |
![]() |
Часовой пояс GMT +4, время: 21:25. |
|
|
« Предыдущая тема | Следующая тема » |
|
|