Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   hitTest двух клипов с изогнутыми формами (http://www.flasher.ru/forum/showthread.php?t=43112)

Nikolas 18.02.2003 15:58

hitTest двух клипов с изогнутыми формами
 
Подскажите, как просчитать hitTest двух таких клипов, не по рамке а по контуру. Форма может быть любая (блин).

Zirgz 19.02.2003 22:17

da hitTest i tak eta delajet bez njekakih ulovok:

Цитата:

myMovieClip.hitTest(target )

target The target path of the hit area that may intersect or overlap with the instance specified by MovieClip. The target usually represents a button or text-entry field.
help chitatj nada!

sergwizard 20.02.2003 05:45

lame lame lame
 
Вложений: 1
Цитата:

da hitTest i tak eta delajet bez njekakih ulovok:
Ты разницу между "bounding box" и "shape" улавливаешь? Так вот, Nicolas спрашивает именно про "shape" – контур.
Оказывается, это тебе надо читать хелп. Где явно написано, что предложенное тобой myMovieClip.hitTest(target), - Evaluates THE BOUNDING BOXES (выделено мной) of the target and specified instance, and returns true if they overlap or intersect at any point.
И попробуй-ка сделать вот такой примерчик, используя myMovieClip.hitTest(target)
Сомневаюсь, что у тебя получится " bez njekakih ulovok ".

Zirgz 20.02.2003 14:06

Вложений: 1
nu da vot sdelal, bez njekakih ulovok, toka nje target a _x, _y, shape flag

ogovorilsja, sore, no ulovok njekakih njenada! k tomuzhe eta napisana v helpe !

sergwizard 20.02.2003 22:50

Вложений: 1
Не-е-ет, примерчик-то твой хилый. И абсолютно не равнозначен тому, что я выложил. Сразу видно, что он сделан с hitTest(x, y, shapeFlag). А это использование подходит только для довольно маленьких объектов, размерами которых можно пренебречь, а брать только координаты их центров. Поэтому в твоем примере, как это видно на картинке, шар может почти полностью лежать на фигуре, но hitTest регистрироваться не будет.
Но, я это все тебе говорю не для того, чтобы как-то поглумиться над тобой, а только для того, чтобы ты не пытался относиться к вопросам других с пренебрежением и высокомерием. Не надо так резко отправлять других к хелпу.
Не надо таких комментариев "lame lame". Даже ты, зная английский, делаешь такие ошибки. А что говорить о тех, кто не знает английского? Вот форум для того и существует, чтобы одни могли задавать любые вопросы, а другие - делиться опытом и маленькими хитростями.
Извини, если обидел. Но и ты постарайся не обижать других.

Zirgz 20.02.2003 23:50

Вложений: 1
nu ladno, uprjok k mestu vspeshke upustil

a kak tebe etat fail?


no vopsheto ja etim njeanilasja do etava, kakbi njebilo nadabnastji, no njemnoshko prishlosj podumatj...

a ja vedj tebja zadel za zhivoje vsjotaki, izvinjajusj :)

no tvojo reshenije chisto bilo na mnoga huzhe a nje alternativnij variant.

sergwizard 21.02.2003 04:23

Вложений: 1
Вот ты приаттачиваешь файл, а ты сам его проверил? Мне кажется, - нет. Я даже уверен, что нет. Потому что у тебя startDrag без "true", и поэтому ты не можешь нормально двигать клип. А если бы проверил, то обнаружил бы то, что можно увидеть на приатаченных картинках.
Но то, что ты обратился к getBounds, говорит, что ты на правильном пути. Но, опять-таки, всегда стоит подумать, подходит ли данный способ для решения данной задачи. И вот тут можно ответить и на твое утверждение, что предложенный тобой способ (в другом топике) – намного лучше моего. Во-первых, я предложил только ОДИН из способов, специально оговорив это в самом начале. Во-вторых, для каждой задачи – свой способ. Я до сих пор думаю, что тот, который я предложил – более универсальный: он позволяет более гибко подойти к удалению копий клипов. Например, если я хочу удалить клипы только тогда, когда их количество четно какому-то числу, или если я хочу удалить какую-то определенную конфигурацию клипов. В общем, я хочу еще раз повторить: для каждой задачи – свой способ. Хорош ли предложенный тобой? – безусловно! Для своих задач.
Но зацепило меня за живое не то, чей предложенный способ лучше или хуже, а твое ничем необоснованное высокомерие и слово "lame", трижды повторенное.
Я, по жизни – добрейшей души человек, но, сталкиваясь с хамством и грубостью, становлюсь сам не свой. Даже друзья это хорошо усвоили и не пытаются меня в таких случаях успокаивать, а просто, сразу вызывают скорую помощь для пострадавшего. Шучу, конечно. Но в каждой шутке - ....
Поэтому так и отнесся к твоим постам. Хотя против тебя лично нечего не имею. Я отлично помню, что мы с тобой нормально общались, когда тестили твой austrapak. Надеюсь, и в дальнейшем будем общаться нормально.

В нашей полемике мы забыли про автора вопроса, Nicolas(a).
Давай – все же – ответим ему.
Nicolas, смотря какую задачу ты решаешь. Если это достаточно большие объекты, и нужно точно отследить их столкновение, - есть еще один нетривиальный способ: разместить по контуру одного из них точечные клипы-маяки, и отслеживать столкновение с ними.

Nikolas 21.02.2003 19:22

Здравствуйте, Sergwizard

Спасибо за Вашу защиту от нападок нашего "лесного брата". За время развития событий я сумел сам справиться с поставленной задачей.
Ваш совет по поводу "клипов-маяков", приходил мне в голову, но объектов очень много и в каждый вставлять "маяки", очень трудоемкий процесс.
Задача решилась очень интересным способом:
1. При загрузке МС в "container" мы прощитываем "shape", с шагом 2 пикселя, и заносим объекты со свойствами (х и у) в массив для данного МС.
Код:

container = ссылка на нужный контейнер.
clipBounds = МС.getBounds(container);
masName = (_level0[container._name+"_ht"]=[]);
for (j=clipBounds.xMin;j<=clipBounds.xMax;j+=2) {
        for (k=clipBounds.yMin;k<=clipBounds.yMax;k+=2) {
                if (МС.hitTest(container._x+j,container._y+k,true)) {
                        masName.push({x:j,y:k})
                }
        }
}

Мы получаем на каждый МС свой массив с образом шейпа. Затем нам уже не составляет труда находить области совпадения двух МС на сцене.
2. При совпадении "bounding box" двух МС, мы включаем проверку совпадений их шейпов (по их массивам, до первого совпадения)
Код:

var HTmass = eval(container1+"_ht")
var HTUrl = eval(container1+".МС")
for (m=0;m<=HTmass.length-1;m++) {
        var loc = HTUrl.localToGlobal(HTmass[m])
        if (container2.hitTest(loc.x,loc.y,true)) {
                // В момент совпадения выполняем что захотим.
                break;
        }
}

* Использование localToGlobal обусловлено тем, что эти МС вложенные и в процессе, они могут вращаться, скалиться, и т.д. Но чтобы localToGlobal не портил входяший объект, мы его переопределяем:
Код:

MovieClip.prototype.lg = MovieClip.prototype.localToGlobal;
MovieClip.prototype.localToGlobal = function(coord) {
        var temp = {x:coord.x, y:coord.y};
        this.lg(temp);
        return temp;
};

Всем спасибо.

SPV 21.02.2003 19:38

Все свободны :D

Nox Noctis 21.02.2003 19:49

видишь суслика ?.. и я нет. а он есть.
 
теперь-то суслика видят все =)


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

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