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

Torero 17.08.2007 21:01

Добавление экземпляра класса, название которого получаем динамически.
 
Если название топика непонятно, попробую объяснить еще раз: в Library есть n мувиков, связанных с .as файлами: C1, C2, C3, ..Cn.

В процессе выполнения скрипта, мы получаем(напр от php, xml или рандомно) название класса, экземпляр которого необходимо создать.

Код:

var s:String="C2";
var d=new s;

само-собой не срабатывает.
Как решить данную проблему?

lowka 17.08.2007 21:57

flash.utils.getDefinitionByName()

Dima_DPE 18.08.2007 15:19

Я делаю так.
Код:

import flash.utils.*;
import flash.display.*;

var c:Class=getDefinitionByName('C2') as Class;
var bd:BitmapData=new c(0,0); //as BitmapData; не обязательно, хотя кто-то и будет готов поспорить (да и я могу ошибаться)

var b:Bitmap=new Bitmap(bd);

addChild(b);


Torero 18.08.2007 15:25

Спасибо.

etc 18.08.2007 15:25

Dima_DPE, отредактируйте свой пост и оформите код тегами [code][/code].

Torero 19.08.2007 01:50

Увязывая ролик с XML-ом, напоролся на непонятную ошибку.
При запуске ролика, должны появляться экземпляры указанных в XML классов с заданными в XML параметрами. Однако, после того как появляется 1й экземпляр, Flash почему-то выпадает в ошибку
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Проблеммную строчку я закомментировал и выделил белым. Подскажите пжл причину ошибки.

XML:
Код:

<page>
        <classobj classname="D" params="firstparams" />
        <classobj classname="E" params="secondparams" />
</page>

AS3
Код:

package {
import flash.events.Event
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.xml.XMLNode;
import flash.utils.getDefinitionByName;
        public class C extends Sprite {
                public function C(){
                        loadXML();
                }
               
                private function loadXML(){
                        var loader:URLLoader;
                        loader = new URLLoader();
                        loader.addEventListener(Event.COMPLETE, xmlLoaded);
                        var request:URLRequest = new URLRequest("test.xml");
                        loader.load(request);
                       
                        function xmlLoaded(event:Event):void {
                            var myXML:XML = new XML(loader.data);
                                runxml(myXML);
                        }

                        function runxml(xml:XML) { 
                                var n:uint;
                                var instances:Array;
                                var ClassReference:Class;
                                for each(item in xml.children()) {
                                        n++;
                                        ClassReference = getDefinitionByName(item.@classname) as Class;
                                        trace(n+": "+item.@classname);
                                        //instances[n] = new ClassReference();               
                                }
                        }
                }
        }
}

AS3-D
Код:

package {
import flash.display.Sprite;
        public class D extends Sprite {
                public function D(){
                        trace("D class Loaded");
                }
        }
}

AS3-E
Код:

package {
import flash.display.Sprite;
        public class E extends Sprite {
                public function E(){
                        trace("E class Loaded");
                }
        }
}


Dima_DPE 19.08.2007 10:35

Дам-с. Массив материализовать требуется
Код:

var instances:Array=[];
или
Код:

var instances:Array=new Array();
Привыкай! Я как посмотрел еще и про uint подумал, но вспомнил что им сразу нуль присваевается. Удачи!

PS Да еще, item.@classname является экземпляром класса XMLList, но он легко приводится к строке и даже не ругается при компиляции и выполнение (а я бы ругался =) ). Это как раз тот случай, о котором писал Рост на flash-ripper.com.

Torero 19.08.2007 15:12

м-да.. перетрудился я видимо... спасибо..

2 Dima_DPE:
вопросик: а какие мысли/чувства во мне твой "PS" должен был пробудить и на какие выводы натолкнуть? :)

etc 19.08.2007 17:28

Torero, мысль о том, что надо к строке приводить.

Torero 19.08.2007 20:11

Буду краток: прочитал, оценил, спасибо. :)


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

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