PDA

Просмотр полной версии : hitTest динамически созданных мувиков


wretch
10.03.2009, 00:38
Задача в следующем: нужно распознать, когда один юнит пересекается с другим и с каким именно.

_global.cDepth = 100;
onEnterFrame = function () {
if (_global.cDepth<105) {
//unit - круг 65х65
var thisMC:MovieClip = attachMovie("unit", "unit"+_global.cDepth, _global.cDepth);
thisMC._x = Math.random()*300;
thisMC._y = Math.random()*300;
_global.cDepth++;
}
};

Так же буду рад другим вариантам того, как сделать так, что бы юниты не проходили(в данном коде не появлялись) друг на друге.
пс. через хитТест не ясно, что с чем и когда проверять на хитТест, т.к. нужно нечто вроде unit###, где ### - любое цифровое значение. Есть ли что-то подобное во флеше Оо?

dimarik
10.03.2009, 10:13
Поиск по форуму, конечно же, ничего не дал oO?

wretch
10.03.2009, 13:23
угу... можно ткнуть куда-нить более конкретно? :D

dimarik
10.03.2009, 13:35
Ключевое слово hitTest (http://www.flasher.ru/forum/search.php?searchid=879643&pp=25). Нашлось 20 страниц обсуждений, где упоминается хиттест.

wretch
10.03.2009, 14:13
круто, а по параметру _name - 496 страниц
И так опустив навыки работы с поиском, вернёмся к задаче, если никто не против?)

nOobCrafter
10.03.2009, 14:40
Вчера тоже задался вопросом хиттеста, и помощью поиска нашел весьма любопытный пример который оставляет кучу свободы творчеству ;). this - _root как видно перебираем обьекты в руте на предмет того соприкасаются ли они с заданным обьектом c_mc, чуть что выводится сообщение с чем мы пересеклись.
this.onMouseMove = function() {
for (var i in this) {
if (typeof (this[i]) == "movieclip") {
if (this[i] != _root.c_mc) {
if (this[i].hitTest(_root.c_mc)) {
trace("касание с "+this[i]);
t_txt.text +="касание с "+this[i]+"\n"
}
}
}
}
};
По идее надо циклом пробегать по массиву аттаченных мувиком на предмет хиттеста, если он етсь то меняем координаты еще раз. ИМХО.
З.Ы. в слуае с окружностями писали что стоит лиш проверять растояние между их центрами.. если оно меньше 2х радиусов то тогда они столкнулись если больше то ссответствено нет.
З.З.Ы. я бы скрестил аттач с этим:
function getRandomIntArray(len:Number):Array
{
var A:Array = [];
var found:Boolean = false;
var un:Number;

while (A.length != len)
{
un = myRandNumber(1, len);
found = false; // где то тут кидаем рандомные координаты
for (var i = 0; i < A.length; i++)
{
if (A[i] == un) // тут хиттест
{
found = true;// если тру, то откат и по новой
break;
}
}
if (!found) A.push(un);
}
return A;
}
только вместо массивов бы так же перебирал аттаченные обьекты на предмет хиттеста

wretch
10.03.2009, 16:25
_global.cDepth = 1;
this.onEnterFrame = function() {
if (_global.cDepth<20) {
//unit - круг 65х65
var thisMC:MovieClip = attachMovie("unit", "unit"+_global.cDepth, _global.cDepth);
thisMC._x = Math.random()*500;
thisMC._y = Math.random()*500;
_global.cDepth++;
thisMC.onMouseDown = function() {
_global.cDepth = 1;
removeMovieClip(thisMC);
};
thisMC.onEnterFrame = function() {
for (var i in _root) {
if (typeof (_root[i]) == "movieclip") {
if (_root[i]._name != thisMC._name) {
if (_root[i].hitTest(thisMC)) {
trace(thisMC._name+" касание с "+_root[i]._name);
thisMC._x = Math.random()*500;
thisMC._y = Math.random()*500;
}
}
}
}
};
}
};
Работает вроде как надо)) посмотрим как дальше себя поведёт такой код)
Спасибо nOobCrafter'y за вариант перебрать все значения в руте на предмет мувиклипности 8)