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

Blackjack1616 23.04.2010 21:42

Почему я не могу обратиться к мувику?(область видимости)
 
привет! есть код:

Код AS1/AS2:

function createObj(){
        function initObjFromLib(iName,iLib,iNew,xCoord,yCoord){
                iName=attachMovie(iLib,iNew,_root.getNextHighestDepth());
                iName._x=xCoord;
                iName._y=yCoord;
        }
        function initEmptyObj(iName,xCoord,yCoord){
                _root.createEmptyMovieClip(iName,_root.getNextHighestDepth());
                iName._x=xCoord;
                iName._y=yCoord;
        }
        initObjFromLib(buttonNext,"mc","smc",365,255);
        initObjFromLib(buttonBack,"mc","smc2",485,255);
        initEmptyObj(frameForShow,100,100);
        trace(buttonNext);
 
}
 
createObj();

результат работы trace: undefined, а я хочу что бы был _level0.smc.

почему так выходит? как сделать лучше, если я хочу сделать код более удобным, логичным, но не хочу заморачиваться с ООП на ас2?

udaaff 23.04.2010 21:46

А что такое buttonNext? И зачем вы функции в функцию позасовывали?

Blackjack1616 23.04.2010 21:53

buttonNext - это предполагаться быть кнопкой.

от функции initObjFromLib я хочу создание мувиКлипа с заданными параметрами(как называется, объект из библиотеки, новое имя, икс, игрек) и последующим к нему обращением.

а что функции нельзя объявлять в функции?

Добавлено через 4 минуты
я хотел что бы
это:
Код AS1/AS2:

nextButton=attachMovie("mc","smc",_root.getNextHighestDepth());
nextButton._x=100;
nextButton._y=100;

было в более(как на мой непрофессиональный взгляд) удобной форме

Код AS1/AS2:

function initObjFromLib(iName,iLib,iNew,xCoord,yCoord){
                iName=attachMovie(iLib,iNew,_root.getNextHighestDepth());
                iName._x=xCoord;
                iName._y=yCoord;
        }
initObjFromLib(buttonNext,"mc","smc",365,255);

Добавлено через 9 минут
да я помню, что могу обратиться к новому имени(attachMovie("mc","НОВОЕ_ИМЯ", _root.getNextHigestDepth()) ), но мне кажется, что логичнее обращаться к имени переменной(buttonNext)

я опять велосипед изобретаю?

AzagThoth 23.04.2010 22:05

Ого Вы жжёте.
Код AS1/AS2:

MovieClip.attachMovie()
Доступность
Flash Player 5.
 
Синтаксис
my_mc.attachMovie(idName:String, newName:String, depth:Number [, initObject:Object]) : MovieClip
 
Параметры
idName Linkage name (имя для линковки) символа мувиклипа в Библиотеке, используемое для присоединения (attach) мувиклипа на Сцену. Это имя вводится в поле Identifier диалогового окна Linkage Properties.
 
newname Уникальное имя присоединяемого мувиклипа.
 
depth Число, определяющее глубину присоединяемого мувиклипа.
 
initObject (поддерживается, начиная с Flash Player 6) Объект, содержащий свойства, передаваемые присоединенному мувиклипу. Это свойство позволяет динамически создавать мувиклипы, получающие параметры. Если initObject не объект, параметр игнорируется. Все свойства initObject копируются в только что созданный мувиклип. Свойства, определенные в initObject, доступны функции-конструктору. Этот параметр является необязательным.
 
Возвращает
Ссылку на созданный объект .
 
Описание
Метод; берет символ из Библиотеки и присоединяет (attach) к мувиклипу my_mc на Сцене. Используйте MovieClip.removeMovieClip() или MovieClip.unloadMovie() для удаления мувиклипа, присоединенного с помощью attachMovie().
 
Вы можете расширять методы и обработчики событий класса MovieClip, создавая его подклассы. Для более подробной информации смотри "Присвоение класса мувиклип-символу " в Использовании ActionScript во Flash.
 
Пример
В примере ниже присоединяет символ с linkage identifier “circle” к мувиклипу на Сцене:
 
this.attachMovie("circle", "circle1_mc", this.getNextHighestDepth());
this.attachMovie("circle", "circle2_mc", this.getNextHighestDepth(), {_x:100, _y:100});
 
См. также
MovieClip.removeMovieClip(), MovieClip.unloadMovie(), removeMovieClip()

Добавлено через 1 минуту
Т.е. в Вашем случае достаточно одной строки.

udaaff 23.04.2010 22:07

Цитата:

а что функции нельзя объявлять в функции?
Много чего можно, особенно в AS1, но это не значит, что нужно так делать.

Код AS1/AS2:

function initObjFromLib(parent, iLib, iNew, xCoord, yCoord)
{
        var iName = parent.attachMovie(iLib, iNew, parent.getNextHighestDepth());
        iName._x = xCoord;
        iName._y = yCoord;
        return iName;
}
 
function initEmptyObj(parent, iName, xCoord, yCoord)
{
        var mc = parent.createEmptyMovieClip(iName, parent.getNextHighestDepth());
        mc._x = xCoord;
        mc._y = yCoord;
        return mc;
}
 
var buttonNext = initObjFromLib(_root, "mc", "smc", 365, 255);
var buttonBack = initObjFromLib(_root, "mc", "smc2", 485, 255);
var frameForShow = initEmptyObj(_root, "smc3", 100, 100);
 
trace(buttonNext + " " + buttonBack + " " + frameForShow);


Blackjack1616 23.04.2010 22:07

Цитата:

Сообщение от udaaff (Сообщение 902963)
И зачем вы функции в функцию позасовывали?

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

Добавлено через 4 минуты
Всем большое спасибо!

Добавлено через 23 минуты
...но если я вдруг сделаю так:
Код AS1/AS2:

function initObjFromLib(iParent,iLib,iNew,xCoord,yCoord){
                var iName;
                iName=attachMovie(iLib,iNew,iParent.getNextHighestDepth());
                iName._x=xCoord;
                iName._y=yCoord;
                return iName;
                //trace(buttonNext);
}
function createObj(){
 
        buttonNext = initObjFromLib(_root,"mc","smc",365,255);
        buttonBack = initObjFromLib(_root,"mc","smc3",465,255);
 
 
        trace("внутри: "+buttonNext);
}
function controlObj(){
        buttonNext+=10;
        trace("Получиться?");
}
trace("снаружи: "+buttonNext);
createObj();
controlObj();

Получиться, или избегать так делать?

udaaff 23.04.2010 22:32

Цитата:

Сообщение от Blackjack1616 (Сообщение 902978)
я подумал. что было бы не плохо функции определенного типа, держать в одном месте.

Тогда вам класс нужно писать, и данные функции делать методами этого класса, читай типа.

Цитата:

Получиться, или избегать так делать?
Получится. Только += 10 нужно не к мувику прибавлять, видимо.
И
Код AS1/AS2:

trace("снаружи: "+buttonNext);

у вас еще до создания объекта идет. Внимательнее как-то надо быть.

Blackjack1616 23.04.2010 22:40

Цитата:

читай типа.
Проще вроде уже АС3 читать, он под это более заточен, не?


Цитата:

buttonNext у вас объявляется как локальная переменная и снаружи функции ее не видно, соответственно.
ох.. Спасибо за помощь!

Цитата:

у вас еще до создания объекта идет. Внимательнее как-то надо быть.
Черт! И точно!

udaaff 23.04.2010 22:43

Не как локальная :) Я уже исправил. Если бы var был, то локальной была бы.

Blackjack1616 23.04.2010 22:55

Блин! Все работает! :yahoo:
И все по стопочкам лежит! большое-большое спасибо!
:drinks:


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

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