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

Omar2002 06.03.2008 11:09

Класс не может задефайнить переменную в мувиклипе
 
Ситуация такая:
Создал класс
Создал Мувиклип
Поместил мувиклип на сцену и прописал в Linkage для этого мувиклипа вышесозданный класс.
При старте всей флешке передаю в класс ссылку на этот мувиклип.
У классса есть метод selectedIndex, который в мувиклипе присваивает значения 2 переменным

MC.curItemValue = MC.Values[val];
MC.curItemText = MC.arrVals[val];

после этого переменная curItemValue - хранит нужное значение, а
MC.curItemText - undefined. Оба массива из которых берутся значения заполнены переменными и с ними проблем нету.

Код класса:
Код:

class ListBox extends MovieClip {       
       
        public var MC:MovieClip;
       
        function ListBox() {
        }
       
        public function addItem(iName,iVal):Void {               
                MC.arrVals.push(iName);
                MC.Values.push(iVal);
                if(MC.arrVals.length<2)
                {
                        MC.curItemText = iName;
                        MC.curItemValue = iVal;
                        MC.sel_txt.text = iName;
                }
        }
       
        public function removeAllItems() {       
                MC.arrVals.length = 0;
                MC.Values.length = 0;
        }
       
        public function get list():Array {
                return MC.arrVals;
        }
       
        public function get currentItemText() {
                return MC.curItemText;
        }
       
        public function get value() {
                return MC.curItemValue;
        }
       
        public function set selectedIndex(val):Void {
                MC.curItemValue = MC.Values[val];
                MC.curItemText = MC.arrVals[val];
                MC.sel_txt.text = MC.curItemText;
        }
       
        //tmc - ссылка на мувик
        public function set setmc(tmc):Void{
                MC = tmc;
                MC.arrVals = new Array();
                MC.Values = new Array();
                MC.countItems = 5;
        }
       
        public function setCountItems(val:Number):Void {
                MC.countItems = val;
        }
       
}


wvxvw 06.03.2008 11:28

Код:

public var MC:MovieClip;
А зачем это вообще нужно? Если класс уже наследуется от МувиКлипа не проще ли тот клип к которому линкуется класс и использовать? А то так поди знай когда вы определяете что это за клип (MC), и когда определяете в нем какие-то параметры...

ЗЫ. ща еще умные люди понабегут %) по поводу синтаксиса ругаться будут %)
прописными - статические переменные, с прописной - имена классов.

Olegg 06.03.2008 11:59

покажите код на флэшке.

Omar2002 06.03.2008 13:19

Цитата:

Сообщение от wvxvw
Код:

public var MC:MovieClip;
А зачем это вообще нужно? Если класс уже наследуется от МувиКлипа не проще ли тот клип к которому линкуется класс и использовать? А то так поди знай когда вы определяете что это за клип (MC), и когда определяете в нем какие-то параметры...

ЗЫ. ща еще умные люди понабегут %) по поводу синтаксиса ругаться будут %)
прописными - статические переменные, с прописной - имена классов.

К сожалению не получается без этой ссылки обращаться к прилинкованному мувику. Т.е. Мувик без проблем использует переменные и методы класса, а вот класс к переменным мувика доступ не может получить - может руки кудрявые.

Проблему на самом деле обошел, но не решил.

А по поводу синтаксиса - а что, если название класса с большой буквы начинается, то он как-то по другому воспринимается флешей?
Стаическая переменная с большой буквы - тоже не понял в чем проблема.
В PHP я знаю, что все, что относится к OOП - пишется с большой буквы - это для компилятора надо. Во флеше так же?

Код мувика (в первом и единственном кадре написан)
Код:

stop();

selec._width = lwidth;
sel_txt._width = lwidth;
sel_txt.text = curItemText;//curItemText;

var sel_pressed = false;
var sy = selec._y;
var sx = selec._x;
var sw = lwidth;//selec._width;
var sh = selec._height;
var d_sel = 0;
var count = countItems;
var over;


var main_mc = createEmptyMovieClip("main_mc",1);
var sc_mc = createEmptyMovieClip("sc_mc",2);

unvis_all = function ()
{       
        var i = 0;
        while (i < arrVals.length)
        {
                removeMovieClip(main_mc["sel" + i]);
                i++;
                sel_pressed = false;               
        }
        main_mc._x = 0;
        main_mc._y = 0;
        removeMovieClip(sc_mc["scroll"]);
        removeMovieClip(sc_mc["_scroll_bar"]);
        removeMovieClip(sc_mc["_bg_scroll"]);
        clearInterval(un_id);
}

roll = function (n, k)
{
    n.onRollOver = function ()
    {
        setProperty(n._bg, _alpha, 0);       
    }
    n.onRollOut = function ()
    {
        setProperty(n._bg, _alpha, 100);     
    }
    n.onPress = function ()
    { 
          selectedIndex = k;
          sel_txt.text = arrVals[k];
          unvis_all();
    };
};

selec.onPress = function ()
{               
        if(!sel_pressed) {
                posy = sy + sh;
                posx = sx;
                ListW = lwidth;
                if(arrVals.length > count) {
                        sc_mc.attachMovie("scroll", "scroll", 1003, {_x: (sx), _y: (sy + sh)});
                        ListW = lwidth - sc_mc["scroll"]._width;
                        scx = sx + ListW ;// sc_mc["scroll"]._width;
                }
                var i = 0;
                while (i < arrVals.length)
                {
                        var cur_mc:MovieClip = main_mc.attachMovie("sel", "sel" + i, 200 + i, {_x: posx, _y: posy});     
                        cur_mc._txt.autoSize = true;
                        cur_mc._txt.text = arrVals[i];               
                        cur_mc._bg._width = ListW;
                        cur_mc._bgAlt._width = ListW;
                        cur_mc._bg._height = cur_mc._height;
                        cur_mc._bgAlt._height = cur_mc._height;
                        posy = posy + cur_mc._txt._height;
                        roll(cur_mc, i);
                        i++;
                }
                msk_mc._width = main_mc["sel0"]._width+5;
                msk_mc._height = ((main_mc["sel0"]._txt._height) * count);
                msk_mc._x = sx;
                msk_mc._y = sy + sh;
                main_mc.setMask(msk_mc);
                if(arrVals.length > count)
                {
                        dy = (main_mc["sel0"]._txt._height) * count - sc_mc["scroll"]._onpr._height;
                        sc_mc["scroll"].onPress = function() {                               
                                startDrag(this,false,scx+0.5,sy + sh,scx+0.5,(sy + sh + dy));
                                s = true;
                        }
                        sc_mc["scroll"]._x = scx;
                        sc_mc["scroll"].onRelease = function(){                               
                                this.stopDrag();
                                s = false;
                        }
                        sc_mc["scroll"].onReleaseOutside = function(){                               
                                this.stopDrag();
                                s = false;
                                this._onpr._reds._alpha = 0;
                        }
                        sc_mc["scroll"].onRollOver = function ()
                        {
                                this._onpr._reds._alpha = 100;
                        }
                        sc_mc["scroll"].onRollOut = function ()
                        {
                                this._onpr._reds._alpha = 0;
                        }
                        sc0 = Math.floor(sc_mc["scroll"]._y);
                        sc100 = Math.floor((sy + sh + dy) - sc_mc["scroll"]._y);                       
                        mc0 = 0;
                        mc100 = main_mc["sel0"]._txt._height * (arrVals.length - count);                       
                        moveId = setInterval(m=function()
                        {
                                per = Math.floor((Math.floor(sc_mc["scroll"]._y) - sc0) * 100 / sc100);                               
                                main_mc._y = - per * mc100 / 100;
                                                                                       
                        },10);
                        sc_mc.attachMovie("_scroll_bar", "_scroll_bar", 1002, {_x: (scx+5), _y: (sy + sh*5/4), _height:(sy + sh*1/4 + dy)});
                        sc_mc.attachMovie("_bg", "_bg_scroll", 1001, {_x:(scx), _y:(msk_mc._y), _width:(10), _height:(msk_mc._height)});
                }
                sel_pressed = true;
        }else{
                unvis_all();
                sel_pressed = false;
        }
}

var mouseListener:Object = new Object();

mouseListener.onMouseDown = function() {
        if (main_mc._ymouse < (sy-d_sel+Math.abs(main_mc._y)) || main_mc._ymouse > (sy+main_mc["sel0"]._height*count + d_sel + sh + Math.abs(main_mc._y)) || main_mc._xmouse < (sx-d_sel) || main_mc._xmouse > (sx + sw + d_sel+sc_mc["scroll"]._width))
        {               
                unvis_all();
        }
}
Mouse.addListener(mouseListener);


Код флешки. Тут значит Loado.comboBox - это и есть тот самый мувик.
Код:

        Loado._x = 370;
        Loado._y = 275;
        Loado._visible = true;
        Loado.comboBox.setmc = Loado.comboBox;
        for(var lNode:XMLNode = list.firstChild.firstChild; lNode != null;lNode = lNode.nextSibling)
        {
                Loado.comboBox.addItem(lNode.attributes.order_name,lNode.attributes.order_id);
        }
        ///Loado.comboBox.selectedIndex = 1;
        //_global.Message(Loado.comboBox.curItemText,'','');
        Loado._ok._f = funct;
        Loado._close.onRelease = function ()
        {
                this._parent._visible = false;
        }
        Loado._ok.onRelease = function ()
        {
                _global.id = Loado.comboBox.value;
                this._f();
                this._parent._visible = false;
        }
        Loado._cancel.onRelease = function ()
        {
                this._parent._visible = false;
        }
        Loado._shapka.onPress = function ()
        {
                Loado.startDrag(false,1,15,744,700-Loado._height);
        }
        Loado._shapka.onRelease = Loado._shapka.onReleaseOutside = function ()
        {
                Loado.stopDrag();
        }
        Loado._shapka.useHandCursor = false;


Olegg 06.03.2008 13:36

имя класса прально,с большой буквы.Свойство класса - на ваше усмотрение,я именую с маленькой и начинаю с подчёркивания, _mc.Так видно,что это свойство класса.А вот имена методов надо слитно писать.

итить-колотить! у вас еще и в мувике код?Как-то тут всё запутано....Еще вопрос? зачем вы писали класс,если у вас так много кода на кадре и еще и в мувике? Что этот класс делает?

wvxvw 06.03.2008 16:06

http://flasher.ru/forum/showthread.php?t=108898

Проверять watch"ем определена ли переменная (переменныэ в клипе инициализируются после выполнения конструктора)

Omar2002 10.03.2008 12:54

эм - в общем это я заменитель комбобокса стандартного писал. Посколько этих комбобоксов на сцене много, то решил сделать их как бы универсальными, т.е. есть класс - в котором методы хранятся (т.е. методы имеют те же имена, что и у стандартного компонента) и есть мувиклип, который я выкладываю прямо на сцену. Т.е. класс нажун был только для того, чтобы на переписывать большие куски кода, которые были со времен стандартного комбобокса.
Проблема была в том, что надо было все данные хранить не в классе, т.к. класс один на все комбобоксы сцены, для этого я и передавал ссылку на каждый мувик (комбобокс на сцене), а по этой ссылку создавал у мувика переменные и массивы.

Fann 10.03.2008 14:14

Omar2002, чтобы переменные были видны в вашем классе их нужно обьявить.
Код:

public var curItemText:String
, и this в вашем классе ето ваш мувиклип на котором класс


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

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