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

seraphim 03.05.2010 22:45

Проверка столкновений объектов произвольной формы
 
Вложений: 1
задался задачей проверки на пересечение или касание двух спрайтов/мувиков/шейпов произвольной формы.
Неужели для проверки надо будет использовать hitTestPoint()? т.к. hitTestObject выдает:
Код AS3:

package {
        import flash.display.*;
 
        public class Hit extends Sprite {
                public function Hit() {
                        var shape1:Shape = new Shape();
                        shape1.graphics.beginFill(0xFF0000);
                        shape1.graphics.drawCircle(100,100,100);
                        shape1.graphics.endFill();
                        addChild(shape1);
 
                        var shape2:Shape = new Shape();
                        shape2.graphics.beginFill(0xFFF000);
                        shape2.graphics.drawRect(180,180,100,100);
                        shape2.graphics.endFill();
                        addChild(shape2);
 
                        trace(shape1.hitTestObject(shape2));
                }
        }
}

"true" хотя круг и квадрат визуально не пересекаются. Естественно необходимо проверять пересечение более сложных по форме спрайтов (не правильной формы).

Есть ли способ проверять столкновения с наименьшими затратами от процессора?

dimarik 03.05.2010 22:58

Да. Пользуйтесь математикой модели.

gloomyBrain 03.05.2010 23:32

hitTestObject возвращает true в том случае, если пересекаются габаритные прямоугольники объектов.
Нужно получить область пересечения (еще один прямоугольник), внутри которой проверять каждую точку на пересечение с обоими объектами (то есть если точка пересекается и с тем, и с другим - значит оба объекта есть в этой точке - значит они пересекаются)
Однако это очень грубо и тут есть что оптимизировать

incvizitor 04.05.2010 03:13

короче, когда увидишь что hitTestObject возвращает true, делаешь следующее:
1)находишь bounds обоих объектов относительно чегото одного. Находим координаты центров двух объектов и смотрим где первый относительно другого. Если с верху и с лева (как на рисунке), находим правый край первого и левый второго, также нижний первого и верхний второго. таким образом мы можем определить зону где теоретически могло быть столкновение для каждого объекта.

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


3)Таким образом мы получили 2 массива с поинтами в цикле просто проверяем на совпадения. Если границы не имеют общих точек - объекты не пересекаются и нааборот.

Как видите - ничего невероятного.

Gaen 04.05.2010 03:24

http://noregret.org/tutor/n/collision/#2.2
На здоровье.

fljot 04.05.2010 03:40

http://www.tink.ws/blog/as-30-hittest/

dimarik 05.05.2010 00:50

тоже штоле кинуть линк ) http://www.coreyoneil.com/portfolio/index.php?project=5

seraphim 05.05.2010 14:54

спасибо огромное за ответы.... будем тестить :)))

Psycho Tiger 05.05.2010 14:57

А ещё можно попиксельный хиттест битмапдатами ) *на правах разнообразия*

UUps, dimarik дал двиг именно на пиксельную )


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

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