![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Цитата:
Цитата:
|
|
|||||
|
Цитата:
Добавлено через 1 минуту Если вас смутило слово grid в коде, то это виртуальная сетка для ускорения расчетов столкновений.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Так получается, что данный пример столкновений полностью ставит под сомнения мои уже готовые наработки по алгоритму движения героя и арены. А учитывая, что это мой первый опыт не только игры, но и AS3 - попробовать сделать гибрид - нереально на данном этапе. Поэтому хотел бы вернуться к предложенной мной схеме (рис.).
Схема игры и ее алгоритм были придуманы тут. На рисунке, который был приведен чуть ранее видно, что к арене и герою добавилось еще одно действующее лицо - враг (тоже в виде окружности), который движется за героем по тому же самому алгоритму, что и герой движется за мышкой, только скорость врага ниже. Задача номер один: переделать старый алгоритм на новый лад. С этим туговато... я вижу лишь более менее красивый выход - это если в функции движения врага они столкнулись, то враг останавливается, а герою надо передать новую функцию, описывающую его движение... Вообщем, идея есть, но четкой логической структуры пока нет. Поэтому прошу помощи по этому пункту - это основа для будущих рассуждений. Задача номер два: понять каким образом изменится уравнение движеня героя при выходе на круговую траекторию. Нынешнее движение задано через следующую функцию: private function followMe(target:Point, obj:Object):void { var dx:Number = target.x - obj.x; var dy:Number = target.y - obj.y; var dx1:Number = mouseX - obj.x; var dy1:Number = mouseY - obj.y; var angle:Number = Math.atan2(dy, dx); var angle1:Number = Math.atan2(dy1, dx1); var dist:Number = Math.sqrt(dx*dx + dy*dy); if(dist > obj.step) { var tgtX:Number = obj.step * Math.cos(angle); var tgtY:Number = obj.step * Math.sin(angle); hero.rotation = angle1*180/Math.PI; obj.x += tgtX; obj.y += tgtY; } } var tgtX:Number = obj.step * Math.cos(angle); var tgtY:Number = obj.step * Math.sin(angle); Добавлено через 8 минут Данная задача фактически сводится к чему-то в духе: получить точку касания А на красной штриховой линии (т.е. угол соприкосновения героя и врага). Провести 2 касательные к окружности и из них выбрать ту точку, которая ближе к нашей точке А. Запустить героя по новой (круговой) траектории, сохранив скорость. При достижении точки - опять линейная траектория. Вариант, когда мышь в пределах круга - еще проще. Не нужны вообще касательные - достаточно лишь продлить отрезок ВC' до пересечения с кругом. Это и будет финальная точка нашего героя. Последний раз редактировалось australian incognito; 25.11.2011 в 05:00. |
|
|||||
|
Предлагаю такой механизм:
Персонаж знает куда ему надо попасть и какая у него скорость. Каждый шаг персонаж высчитывает направление движения и точку куда ему шагнуть. Перед тем как шагнуть персонаж проверяет не будет-ли столкновения с каждой из соседних преград Если позиция куда он идёт не свободна( сумма радиусов меньше расстояния между центрами) то направление движения корректируется сперва пробуем +10граудусов потом -10, +20, -20, +30, -30 и так пока не появится возможность пройти Такая схема позволит обойти несколько преград сразу, но персонаж не будет выбирать кратчайшую дорогу и может залезть в тупик если персонаж должн быть умнее, ходить кратчайшей дорогой, и уметь не заходить в тупики, то тогда надо копать в этом направлении: http://wonderfl.net/c/aWCe http://lab.polygonal.de/2007/06/13/d...e-graph-class/
__________________
Хороший отдых - половина работы. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:50. |
|
|
« Предыдущая тема | Следующая тема » |
|
|