Форум 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=176988)

Alex_S 22.03.2012 03:16

Столкновение окружностей
 
Здравствуйте.
Подскажите или посоветуйте материал (статьи, уроки) где раскрывается тема столкновения юнитов друг с другом в процессе передвижения к одной для всех цели (например, движение толпы монстров на игрока как в Alien Shooter).
Пишу алгоритм поведения врагов для изометрического шутера, и наткнулся на данную проблему. В данный момент для каждого юнита(представлены как окружности), перед обновлением координат, проверяется столкновение со всеми остальными, если после добавления соответствующего значения вектора скорости по Х столкновение состоится, то движение юнита прекращается по оси Х, то же самое для У. Это работает корректно только для 2-3 юнитов, когда их больше, все остальные юниты игнорируют запрет на движение и сливаются воедино.
Как решить данную проблему?
Заранее благодарю.

stweet 22.03.2012 06:42

Код AS3:

public function myHitTest(enemy:DisplayObject, hero:DisplayObject):Boolean
{
        // вычисляем дистанцию
        var dx:Number = enemy.x - hero.x;
        var dy:Number = enemy.y - hero.y;
 
        // нормализуем дистанцию
        var dis:Number = Math.sqrt(dx * dx + dy * dy);
 
        // указываем минимальную(критичную) дистанцию для столкновения
        // я написал 10 пикселей как пример, используй сумму радиусов окружности.
        var need:Number = 10;
 
        // проверяем дистанцию и возвращаем истину если,
        // дистанция между объектами меньше критичной.
        if (dis < need) return true;
 
        // возвращаем лож если дистанция не прошла проверку.
        return false;
}

Но и это не идеально, есть ещё "оптимизированнее" решение.

anmelegov 22.03.2012 10:59

вы изобретаете велосипед, есть специальный класс Point у которого есть метод distanse()

TanaTiX 22.03.2012 11:00

Вот так.
Код AS3:

if(Point.distance(youPoint, enemyPoint)>=youRadius+enemyRadius{
  trace("hitTest");
}

ЗЫ. не успел, ну да пусть ради примерчика висит.

GBee 22.03.2012 12:24

А может дистанс медленнее работает?

stweet 22.03.2012 12:26

Цитата:

Сообщение от anmelegov (Сообщение 1070453)
вы изобретаете велосипед, есть специальный класс Point у которого есть метод distanse()

Я не изобретал велосипед, его до меня ой как давно изобрели! =)
В своём примере я просто продемонстрировал как это работает, я же не навязывал или там не"(V)утверждал(V)".

А признаться, я как то "Point - ом" и не пользовался ни разу)))

udaaff 22.03.2012 12:32

2 + 2 и без Pointa сложить вполне себе можно. И по поводу велосипеда, это к Пифагору :)

stweet 22.03.2012 12:35

Цитата:

Сообщение от GBee (Сообщение 1070471)
А может дистанс медленнее работает?

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

Мне кажется, если бы разработчики не взирали на (столь "идеально" оптимизированные) решения от Adobe - а, все давно уже на флексе писали бы. =)

Котяра 22.03.2012 12:41

Оперируйте квадратами расстояний.

stweet 22.03.2012 13:07

А и ... TanaTiX внимательнее к своим примерам, в спешке даже в одной строчке допускаете ошибки!


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

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