PDA

Просмотр полной версии : Добавить событие в динамический объект


infbyte
13.07.2014, 21:06
создал динамические карты на столе.
Как сделать так что бы при наведении она просачивалась на передний план?
http://f6.s.qip.ru/uFoPLXXn.png
как уничтожить карту ? что бы она убралась со стола
подскажите плиз

samana
13.07.2014, 22:27
Это зависит от того, в какой версии actionscript вы пишите.

infbyte
13.07.2014, 22:48
AS3

Попробовал сейчас с прозрачностью, но метод не подходит:
clip.addEventListener(MouseEvent.CLICK, qwe333);
function qwe333(event:MouseEvent):void{
(event.target as MovieClip).alpha = 0;
}

Карта исчезает, но она блокирует другие карты.

samana
13.07.2014, 23:08
Alpha - это просто прозрачность. Даже если она равна нулю, ваш объект продолжает быть на сцене, просто он невидимый.
Вам нужно удалить карту
if(clip.parent) clip.parent.removeChild(clip)
А чтобы карта выдвигалась на передний план, то при наводке мыши по ней
if(clip.parent) clip.parent.addChild(clip)

infbyte
13.07.2014, 23:42
что-то не хочет:(
Удаляет только одну карту, как-то рандомно , всего один раз.
На передний план не выводит.
Можете подсказать, что не так?



for (var n=1; n<30; n++) {

var clip = new karta();
clip.x = 400;
clip.y = 300;
clip.rotation = Math.random()*360;

clip.addEventListener(MouseEvent.ROLL_OUT, qwe111);
function qwe111(event:MouseEvent):void{
(event.target as MovieClip).gotoAndPlay(7);
}


clip.addEventListener(MouseEvent.ROLL_OVER, qwe222);
function qwe222(event:MouseEvent):void{
(event.target as MovieClip).gotoAndPlay(1);
if(clip.parent) clip.parent.addChild(clip);
}

clip.addEventListener(MouseEvent.CLICK, qwe333);
function qwe333(event:MouseEvent):void{
if(clip.parent) clip.parent.removeChild(clip);
}



addChild(clip);

}


Есть кадр - в нем у меня код, что выше.
Карта - это MovieClip , в свойствах которого я поставил галку напротив : "export for AS" после чего ему пристроилось классовое имя karta

samana
14.07.2014, 00:10
Не правильно работает, потому что есть ссылка, только на последнюю карту. Попробуйте так
for (var n = 1; n < 30; n++)
{

var clip = new karta();
clip.x = 400;
clip.y = 300;
clip.rotation = Math.random() * 360;

clip.addEventListener(MouseEvent.ROLL_OUT, qwe111);
function qwe111(event:MouseEvent):void
{
var targetClip:MovieClip = e.target as MovieClip
targetClip.gotoAndPlay(7);
}

clip.addEventListener(MouseEvent.ROLL_OVER, qwe222);
function qwe222(event:MouseEvent):void
{
var targetClip:MovieClip = e.target as MovieClip
targetClip.gotoAndPlay(1);
if (targetClip.parent) targetClip.parent.addChild(targetClip);
}

clip.addEventListener(MouseEvent.CLICK, qwe333);
function qwe333(event:MouseEvent):void
{
var targetClip:MovieClip = e.target as MovieClip
if (targetClip.parent) targetClip.parent.removeChild(targetClip);
}

addChild(clip);

}

infbyte
14.07.2014, 00:24
что-то не хочет.
ругается на
Монтажный кадр 1, Layer 'карточки', Frame 12, Line 12, Column 30 1120: Access of undefined property e.

samana
14.07.2014, 00:28
А, то я по-привычке написал. Замените все e на event или наоборот.
ps. там где e.target

infbyte
19.07.2014, 20:03
создал карточки , сделал кнопку "перейти в начало игры"
после перехода, эти карточки поверх самой игры.
как уничтожить все карточки new karta(); , которые мы создавали?
хелп плз


Нашел в инете инфу, что вот так но не работает.


if(contains(karta)){removeChild(karta);}

samana
19.07.2014, 20:50
Вообще конечно нужно было бы при создании карт поместить их все в массив. Тогда в любой момент, карты полностью в вашем распоряжении, делайте с ними что хотите, хоть удаляйте.

infbyte
20.07.2014, 03:15
Сделал в цикле, заполнение массива и добавление на стол:
myMovieClips.push(mc);
addChild(myMovieClips[n]);
Допустим у нас 50 карт.
Все создались - все ок.


Далее я создал кнопку "УДАЛИТЬ ВСЕ", которая удаляет все карты разом:

for (var m = 0; m < myMovieClips.length; m++)
{
trace(myMovieClips.length);
myMovieClips[m].parent.removeChild(myMovieClips[m]);
}

Все ок , удаляются нормально!



В каждой карте у меня есть событие на клик, которое производит удаление активной карты.

mc.addEventListener(MouseEvent.CLICK, qwe333);
function qwe333(event:MouseEvent):void
{
var targetClip:MovieClip = event.target as MovieClip
if (targetClip.parent) targetClip.parent.removeChild(targetClip);
}



Начинаю удалять карты вручную, осталось 40 карт!
Нажимаю на "УДАЛИТЬ ВСЕ" , которая должна пробежаться по всему массиву(по 50 элементам) и удалить, но она возвращает ошибку TypeError: Error #1009: Cannot access a property or method of a null object reference.

Что я обращаюсь к уже удаленному объекту.

как я понял, я удалил не ячейки массива, а просто снял со сцены объекты и второй раз их снимать уже нельзя.


Подскажите плиз:
1)как при проходе через массив, не обходить те 10 , элементы которых где я уже применил removeChild?
2) при нажатии на "function qwe333" - как узнать к какому элементу массива относится эта карта?
Просто если бы я это смог узнать , в этой кнопке сразу бы и удалял ячейку через splice

Добавлено через 11 минут
UPD:
все вроде решил вопрос костылем.
через оператор try catch

dimarik
20.07.2014, 17:55
Подскажите плиз:
1)как при проходе через массив, не обходить те 10 , элементы которых где я уже применил removeChild?

Можно обойти все, но проверять у каждого присутствие stage или parent. Чтобы не обходить, необходимо уже обошедшие помещать в отдельный массив.

2) при нажатии на "function qwe333" - как узнать к какому элементу массива относится эта карта?
Просто если бы я это смог узнать , в этой кнопке сразу бы и удалял ячейку через splice


Можно воспользоваться методом Array#indexOf() (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#indexOf());
var index:int = myMovieClips.indexOf(karta);
if (index != -1) {
trace("Карта присутствует в списке под индексом", index);
myMovieClips.splice(index, 1);
}

все вроде решил вопрос костылем.
через оператор try catch
А вот это не нужно делать.