Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не получается вызвать/записать свойство в объект класса (http://www.flasher.ru/forum/showthread.php?t=123864)

mg_creative 14.04.2009 15:43

не получается вызвать/записать свойство в объект класса
 
Такая вот диллема возникла, перехожу с АС2 на АС3
ну не могу понять хоть убей и все
1. создаю новый документ Document class пишу main.root_class
создаю соответствующую папку и директорию
2. рисую объекты которые мне нужны (создаю в папке main соответствующие классы)

стоит задача загрузить картинки из XML
с парсом XML проблем не возникло, но не могу сделать следующее.
мне надо вставить в нарисованный в руте объект я дал имя ему cont_ т.е. не название класса а именно имя переменной cont_
и соответственно при парсинге XML мне нужно в нем создать экземпляр определенного объекта:
Код AS3:

package main {
        import flash.display.Sprite;
        import flash.display.MovieClip;
        import flash.xml.*;
        import flash.net.*;
        import flash.events.*;
        import flash.display.DisplayObjectContainer;
        import main.*;
        public class XML_doc extends Sprite {
                var  xml_file:String;
                var xml_string:XML;
                var objects:Array = new Array();
                var result:XMLDocument = new XMLDocument();
                public function XML_doc (xml_file:String) {
                        this.xml_file = xml_file;
                        trace (this.xml_file);
                        this.result.ignoreWhite = true;
                        load_from_file();
//                        trace(this.xml_string);
//                        result.parseXML(this.xml_string);
//                        getImages(result.firstChild);
 
 
                }
                private function getImages (node:XMLNode) {
                        var kids:Array = node.childNodes;
                        var x_:int = 50.0;
                        var y_:int = 2.0;
                        for (var i:int = 0;  i < kids.length; i++) {
                                //trace (kids[i]);
                                var contaner:contaner_dummy = new contaner_dummy();
                                contaner.preview_src = kids[i].attributes.preview_src;
                                contaner.src = kids[i].attributes.src;
                                contaner.link = kids[i].attributes.link;
                                contaner.x = x_;
                                trace(root_class); // здесь он мне показывает что [руткласс загружен]
                                root_class.cont_.addChild(contaner); //здесь пишет 1120: Access of undefined property cont_ ! хоть убей!
                                x_ += 147;
                        }
                        trace(this.objects);// это я уже пытался забить все объекты в массив и получить через свойство objects - результат тотже, не видно этого свойства хоть убей
 
                }
                private function  load_from_file() {
                        var loader:URLLoader = new URLLoader();
                        loader.dataFormat = "text";
                        loader.addEventListener(Event.COMPLETE, loaded);
                        var request:URLRequest = new URLRequest(this.xml_file);
                        try {
                                loader.load(request);
                        }
                        catch (error:Error) {
                                trace("Unable to load request document");
                        }
                }
 
                private function loaded(event:Event) {
                        var str:String = event.target.data;
                        this.result.parseXML(str);
                        getImages(result.firstChild);
                        //this.xml_string = new XML(event.target.data);
                        //trace (this.xml_string);
                }
 
        }
}

Вообщем никак не пойму, как получить доступ к уже нарисованным в сцене объектам?

Запарился уже :wacko:

Psycho Tiger 14.04.2009 17:56

Ну правильно все. Он не знает такого свойства, создайте класс, наследующийся от него и обьяви там это свойство. В классах АС2 кстати он так же бы сругался, скорее с АС1 переходишь. (я кстати тоже, сначала АС1, потом АС3, потом АС2 :))

Если лень - то вот (но лучше так не делай)
Код AS3:

root_class["cont_"].addChild(contaner);


mg_creative 14.04.2009 18:19

Ну у меня класс root_class имеется, я так понимаю, что явно задавать свойство не требуется, если соответствующий объект есть на тайм лайне... вернее даже я думаю: не вызовет ли это конфликта?

Код AS3:

package main {
        import flash.display.*;
        import flash.events.*;
        import flash.net.*;
        import main.*;
        import flash.xml.*;
        dynamic public class root_class extends Sprite {
//                var cont_r:cont = new cont();
 
                public function root_class () {
                        trace (this.cont_r);
                        trace("Hellow World!!");
                        this.contaner.background_.alpha = 0;
                        var xml_doc:XML_doc = new XML_doc('gallery.xml');
                }
        }       
}

Добавлено через 1 минуту
причем в строке trace(this.cont_r) - выводит [object cont] (я уже переименовал переменную cont_ в cont_r, чтобы не было вопросов)

Добавлено через 11 минут
вот попробовал из класса XML_doc вызвать root_class
Код AS3:

trace (root_class);// - [object root_class]

Получается, что его вообще не видно!?
Нет вру root_class видно, но если сделать так:
Код AS3:

trace (root_class["cont_r"]); //пишет undefined

То нифига он это свойство не видит, если через точку, то вообще компилятор орет :(

Вообще не могу понять, как к таймлайну обратиться... получается что в Document class пишу main.root_class - это значит что я присваиваю рут как экземпляр root_class... тогда как же мне к этому экземпляру обратиться и к его свойствам, тобиш экземплярам на тайм лайне?

Я даже пробовал пойти от обратного.. т.е.: сделать в классе XML_doc свойство objects и записать туда массив объектов
но из конструктора root_class свойства XML_doc.objects тоже не могу получить... пишет ошибку компиляции !?

Я же ведь объявил классы как публичные и динамичные!? в чем проблема не пойму, уже всю голову сломал себе

Psycho Tiger 14.04.2009 19:05

Цитата:

Ну у меня класс root_class имеется, я так понимаю, что явно задавать свойство не требуется
Не-а, требуется.

Я походу туплю, это вроде АС2 стайл, попробуй с getChildByName

mg_creative 14.04.2009 19:25

Я и так уже пробовал!
1061:Call to a possibly undefined method getChildByName through a reference with static type Class

%(

Задал явно свойство cont_r
Как и предполагал, он мне написал типа: Конфликт, такая переменная уже существует

Голова уже кипит просто, ничего не понимаю, чего надо этой железяке!

Такое ощущение, что он видит только то что root_class - это объект, а доступа к его свойствам просто нет!

Psycho Tiger 14.04.2009 19:31

Воспользуйся кастингом, чтобы он увидел это свойство.
Про него можно прочитать в соседней ветке, AS3 Tips&Tricks.
Откастуй в Sprite, например.
Код AS3:

(your_class as Sprite).getChildByName

UPD: я слабо глядел на твой код, щас вгляделся - у тебя root_class - это просто класс. Он существует? Да. О чем тебе трейс и говорит, вызывая статичный метод toString(). А экземпляр у тебя создан? Врятли. И ты пытаешься обратиться к статичному свойству, которое у тебя не определенно.

mg_creative 14.04.2009 19:48

а разве экземпляр не создается при компиляции мультика?... ведь фактически они уже существуют на таймлайне? или надо сделать еще и экземпляр root_class и добавить его на таймлайн, к которому я никак не могу достучаться.... какойто замкнутый круг тогда получается!

Добавлено через 2 минуты
Он же мне в трейс "Хеллоу ворлд!!!" пишет... значит конструктор запускается, значит экземпляр root_class создается, или я чегото не догоняю?

он и в трейс пишет [object root_class] - т.е. объект (экземпляр рут_класса)

Psycho Tiger 14.04.2009 23:05

Запускается конструктор того, экземпляр чего не был создан? Кто то из нас сошел с ума - либо я, либо флеш.
Прикрепи исходник.

mg_creative 15.04.2009 06:41

Заработало вот так
Код AS3:

parent["cont_r"].addChild(contaner);

:drinks:

Когда начал эксперементировать с кастингом, компилятор вроде заткнулся :)но начал в вывод ругаться, и выдавать DOM... я обратил внимание на DOM изучил его и вывел такой вот способ :) может не новый, но все равно имейте ввиду
причем работает именно так
Код AS3:

parent.cont_r.addChild(contaner);

не работает: Компилятор ругается, хотя возможно из-за того что я его явно в root_class не объявил как свойство, но если объявлять, компилятор опять же ругается на конфликт

SunShadow 16.04.2009 08:36

Когда создается мультик и запускается твой конструктор в dynamic классе, строчка
Код AS3:

trace (this.cont_r);

не будет работать по той простой причине что сам объект в мультике cont_r еще не инициализировался. Нужно отлавливать событие когда инициализация объекта завершена. Я ловил его через Event.ENTER_FRAME или Event.ADD_TO_STAGE(последнее работает для объектов в момент добавления их на сцену). Но пока мультик не доиграется до кадра на таймлайн где находится нужный объект, в данном случае твой cont_r, он будет недоступен в коде.


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

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