Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Не работает вызов функции в мувиклипе (http://www.flasher.ru/forum/showthread.php?t=202699)

Alex626 02.08.2013 20:06

Не работает вызов функции в мувиклипе
 
Добрый день!

Столкнулся сегодня с проблемой странного характера... Мой скрипт создаёт мувиклипы динамически с помощью attachMovie. Код следующий:

Код AS1/AS2:

var test_mc:MovieClip = _root.Root.attachMovie("test1",newname,_root.Root.getNextHighestDepth(),{_height:_root.slotH });
 
test_mc.activameMe();

Но вторая строчка не работает... В клипе test1 в первом кадре есть функции

Код AS1/AS2:

activameMe = function()
{
    trace("success");
}
onRelease = function()
{       
        trace("clip released");
        shutdownAndRemove();
}

Но activameMe вызваться и не собирается. При этом, я спокойно вызываю функцию test_mc.onRelease(), и всё работает. Есть предположение, что на инициализацию функций уходит время, и на момент вызова она ещё не активна. Посоветуйте пожалуйста решение.

dark256 03.08.2013 10:12

Сама по себе задача, конечно же, интересная.
Но так делать не рекомендую.
Если у вас 100 клипов, и в каждом свой код, то найти его будет крааайне сложно.
Поэтому делаем так:

Код AS1/AS2:

var test_mc:MovieClip = _root.Root.attachMovie("test1",newname,_root.Root.getNextHighestDepth(),{_height:_root.slotH });
 
test_mc.activameMe = function(){
    trace("success");
}
 
test_mc.onRelease = function(){       
        trace("clip released");
        shutdownAndRemove();
}
 
test_mc.activameMe();

И наслаждаемся жизнью. К слову сказать - при таком подходе вам не придется вкопипащивать в каждый клип один и тот же сходный код.

Alex626 03.08.2013 14:24

Интересный подход. Да, у меня в каждом клипе достаточно много кода. Долго рылся в интернете, и выяснил, что attachMovie в принципе не задействует событий вроде onLoad, так что отследить полную инициализацию сложновато.

Пока пробовал вчера, придумал вот такой способ:

в _root:
Код AS1/AS2:

var test_mc:MovieClip = _root.Root.attachMovie("test1",newname,_root.Root.getNextHighestDepth(),{_height:_root.slotH });

в клипе test1:

Код AS1/AS2:

 
onEnterFrame = function()
{
  activateMe();
}
 
activameMe = function(){
    delete this.onEnterFrame;
    trace("success");
}

В общем, основывался на том, что заранее угадать время инициализации не получится, и поймать событие onLoad тоже не удастся. Но зато событие onEnterFrame всегда срабатывает автоматически, так что я решил вызвать функцию с первым фреймом инициализированного клипа, после чего функция onEnterFrame удаляется. Возможно кому-то пригодится.

dark256 04.08.2013 13:13

Не. Это костыли. Жуткие. Будет у кого-то работать, у кого-то нет.

У меня не "интересный подход", а единственно верный в данном случае :)

Alex626 04.08.2013 16:36

А если функция слишком большая по объёму, и её неудобно прописывать в руте каждый раз?

dark256 05.08.2013 03:16

Нет. Если она слишком большая - вы что-то либо неправильно делаете, либо неверно себе представляете программные структуры.

Если вы живете в СПб - можно потусить и послушать меня на видео.

Alex626 05.08.2013 16:28

Да нет, не в Питере...

У меня сложный интерфейс RPG инвентаря, кода приходится писать много.


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

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