Форум 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 20:45

Цитата:

Сообщение от artcraft (Сообщение 1047837)
я думаю тут нужно сразу подумать о том что могут быть и другие преграды

Буду решать проблемы по мере их поступления, плюс к этому - научусь обходить сложные фигуры - с простыми будет легче.
Цитата:

Сообщение от artcraft (Сообщение 1047837)
мне кажется вот это как раз то что надо http://wonderfl.net/c/m29Y

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

artcraft 23.11.2011 20:59

я сам глубоко не вникал, но вроде сама проверка столкновений там совершенно не тайловая

alatar 23.11.2011 21:36

Цитата:

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

Добавлено через 1 минуту
Если вас смутило слово grid в коде, то это виртуальная сетка для ускорения расчетов столкновений.

australian incognito 25.11.2011 04:50

Так получается, что данный пример столкновений полностью ставит под сомнения мои уже готовые наработки по алгоритму движения героя и арены. А учитывая, что это мой первый опыт не только игры, но и AS3 - попробовать сделать гибрид - нереально на данном этапе. Поэтому хотел бы вернуться к предложенной мной схеме (рис.).
Схема игры и ее алгоритм были придуманы тут. На рисунке, который был приведен чуть ранее видно, что к арене и герою добавилось еще одно действующее лицо - враг (тоже в виде окружности), который движется за героем по тому же самому алгоритму, что и герой движется за мышкой, только скорость врага ниже.

Задача номер один: переделать старый алгоритм на новый лад. С этим туговато... я вижу лишь более менее красивый выход - это если в функции движения врага они столкнулись, то враг останавливается, а герою надо передать новую функцию, описывающую его движение... Вообщем, идея есть, но четкой логической структуры пока нет. Поэтому прошу помощи по этому пункту - это основа для будущих рассуждений.
Задача номер два: понять каким образом изменится уравнение движеня героя при выходе на круговую траекторию. Нынешнее движение задано через следующую функцию:
Код 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;
                        }
                }

Тут я в качестве параметра target задаю координаты мыши, а в качестве параметра obj - экземпляр класса героя. И тут главный вопрос, каким образом изменятся 2 строчки:
Код AS3:

var tgtX:Number = obj.step * Math.cos(angle);
var tgtY:Number = obj.step * Math.sin(angle);

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

Добавлено через 8 минут
Данная задача фактически сводится к чему-то в духе:
получить точку касания А на красной штриховой линии (т.е. угол соприкосновения героя и врага). Провести 2 касательные к окружности и из них выбрать ту точку, которая ближе к нашей точке А. Запустить героя по новой (круговой) траектории, сохранив скорость. При достижении точки - опять линейная траектория.
Вариант, когда мышь в пределах круга - еще проще. Не нужны вообще касательные - достаточно лишь продлить отрезок ВC' до пересечения с кругом. Это и будет финальная точка нашего героя.

artcraft 25.11.2011 15:03

Предлагаю такой механизм:

Персонаж знает куда ему надо попасть и какая у него скорость.
Каждый шаг персонаж высчитывает направление движения и точку куда ему шагнуть.
Перед тем как шагнуть персонаж проверяет не будет-ли столкновения с каждой из соседних преград
Если позиция куда он идёт не свободна( сумма радиусов меньше расстояния между центрами)
то направление движения корректируется сперва пробуем +10граудусов потом -10, +20, -20, +30, -30
и так пока не появится возможность пройти

Такая схема позволит обойти несколько преград сразу,
но персонаж не будет выбирать кратчайшую дорогу и может залезть в тупик

если персонаж должн быть умнее, ходить кратчайшей дорогой, и уметь не заходить в тупики,
то тогда надо копать в этом направлении:
http://wonderfl.net/c/aWCe
http://lab.polygonal.de/2007/06/13/d...e-graph-class/


Часовой пояс GMT +4, время: 07:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.