Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   загрузка swf и размещение на сцене несколько раз (http://www.flasher.ru/forum/showthread.php?t=123541)

Summer_sun 03.04.2009 21:22

загрузка swf и размещение на сцене несколько раз
 
Вложений: 1
Нужно загрузить файл logo.swf и размножить 4 раза на сцене. Делаю так:
Код AS3:

var loader:Loader;
var numOfItems:Number=4;
 
loader=new Loader();
 
loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
var urlRequest:URLRequest=new URLRequest("logo.swf");
loader.load(urlRequest);
 
function initListener(e:Event):void {
 
        for (var i:Number=0; i<numOfItems; i++) {
                var myclip:MovieClip = new mymc();
                myclip.addChild(loader.content);
 
                myclip.width=40+i;
                myclip.height=40+i;
                myclip.x=40+i;
                myclip.y=40+i;
 
                addChild(myclip);
 
        }
}

Код AS3:

mymc

пустой клип в библиотеке
Логотип загружается, но отображается 1 раз. С простой картинкой получается, а в чем тут проблема не пойму.

BlooDHounD 03.04.2009 21:28

один и тот же клип нельзя отобразить в несольких контэйнера. он у вас отображается только в последнем

willis83 03.04.2009 21:33

по поводу присваивания координат логотипу, 40 плюс минус 4 не значительно.... может стоит умножать?? Может они ложатся друг на друга? И не пойму зачем ширину, высоту менять на пару пикселей....

Summer_sun 03.04.2009 21:33

подскажите что сделать пожалуйста

с другими координатами он тоже один.

BlooDHounD 03.04.2009 23:01

склонировать содержание. либо через Loade.loadBytes, либо через Loader.loaderInfo.getDefinition. первый способ работает медленее и жрёт больше памяти

Summer_sun 05.04.2009 16:57

делала по книге Мука ActionScript 3.0 для Flash (с 871)
Код AS3:

var loader:Loader;
 
loader=new Loader();
 
var urlRequest:URLRequest=new URLRequest("logo.swf");
loader.load(urlRequest);
 
loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
function initListener(e:Event):void {
 
        var logoClassName:String=getQualifiedClassName(e.target.content);
        var appDomain:ApplicationDomain=e.target.content.loaderInfo.applicationDomain;
        var logoClass:Class=appDomain.getDefinition(logoClassName);
 
 
        var newlogo:Object = new LoadedClass();
        addChild(newlogo);
 
}

но не работает :(

Код AS3:

var logoClass:Class=appDomain.getDefinition(logoClassName);

на эту строку ругается 1118: Implicit coercion of a value with static type Object to a possibly unrelated type Class.


видела еще на форуме такую констуркцию

Код AS3:

loader.contentLoaderInfo.applicationDomain.getDefinition("LoadedClass") as Class;

и пример с такой конструкцией к описанию AS 3.0. на сайте Adobe , но тоже не получается. Мне знаний конечно не хватает и опыта, но разобраться с размножением подгружаемого клипа для меня очень нужно.

BlooDHounD 05.04.2009 17:26

а почему ему не ругаться? getDefinition возвращает Object. а Вы его пытаетесь присвоить переменной типа Class. в ошибки написано что он не умеет конвертировать один тип в другой. для исправления ошибки используется оператор as.

Summer_sun 05.04.2009 17:40

Код AS3:

var loader:Loader;
var numOfItems:Number=3;
 
loader=new Loader();
 
var urlRequest:URLRequest=new URLRequest("logo.swf");
loader.load(urlRequest);
 
loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
function initListener(e:Event):void {
 
        var logoClassName:String=getQualifiedClassName(e.target.content);
        var appDomain:ApplicationDomain=e.target.content.loaderInfo.applicationDomain;
        var logoClass:Class=appDomain.getDefinition(logoClassName) as Class;
 
 
        var newlogo:Object = new LoadedClass();
        addChild(newlogo);
 
}

так?
теперь оно ругается на следующую строчку
Код AS3:

var newlogo:Object = new LoadedClass();

1180: Call to a possibly undefined method LoadedClass.

а у Мука вот что
Цитата:

var ModuleClassName:String = getQualifiedClassName(e.target.content):
var appDomain:ApplicationDomain =
e.target.content.1oaderInfо.applicati onDomai n;
// После выполнения следующей строки кода переменная ModuleClass будет
// ссылаться на основной класс приложения Module.swf
var ModuleClass:CIass = appDomain.getDefinition(ModuleClassName);
Получив ссылку на класс Module, мы можем использовать ее для создания новых
объектов:
var newModule:Object = new ModuleClass( );

BlooDHounD 05.04.2009 17:48

откуда вы взяли переменную LoadedClass?

Summer_sun 05.04.2009 18:07

ой :)
Код AS3:

var loader:Loader;
 
 
loader=new Loader();
 
var urlRequest:URLRequest=new URLRequest("logo.swf");
loader.load(urlRequest);
 
loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
function initListener(e:Event):void {
 
        var logoClassName:String=getQualifiedClassName(e.target.content);
        var appDomain:ApplicationDomain=e.target.content.loaderInfo.applicationDomain;
        var logoClass:Class=appDomain.getDefinition(logoClassName) as Class;
 
 
        var newlogo:Object = new logoClass();
        addChild(newlogo);
 
}

вообщем теперь оно ругается только на последнюю строчку
1118: Implicit coercion of a value with static type Object to a possibly unrelated type flash.display:DisplayObject.

BlooDHounD 05.04.2009 18:18

ну сделайте соответствующие выводы. такая ошибка у Вас уже была. подумайте.

dimarik 05.04.2009 19:19

super.addChild(newlogo as DisplayObject);

Alex Lexcuk 05.04.2009 21:56

Вложений: 1
Мой вариант с 25-ю собаками
Код:

package
{
        import flash.display.*
        import flash.events.*;
        import flash.text.*;
        import flash.ui.*;
        import flash.system.*;
        import flash.net.*;
        import flash.utils.*;


        dynamic public class DocManyDog extends Sprite
        {
                private var loader:Loader,
                urlLoader:URLLoader,
                i:int;

                public function DocManyDog()
                {
                        trace("ok");
                        urlLoader = new URLLoader();
                        urlLoader.dataFormat= URLLoaderDataFormat.BINARY;
                        urlLoader.addEventListener(Event.COMPLETE, onLoadComplete);
                        urlLoader.load(new URLRequest("cat.swf"));
                }

                public function onLoadComplete(evt:Event):void {
                        init();
                        trace("OK");
                       
                }

                private function init():void{
                        for (i=0; i<25; i++){
                                addChild(loader = new Loader());
                                loader.loadBytes(urlLoader.data);
                                loader.x = int(i/5)*100;
                                loader.y = int(i%5)*100;
                        }
                       
                }
        }
}

Распакуйте куда нибуть архив для тестов. Пробовал вытащить документ класс из загруженной флешки нормально - катит, при создании экземпляра типа new загруженныйДок виснет намертво CS3, в FlashDevelop работает. Архивчик для Flash CS3

Мечтатель 05.04.2009 22:15

Код AS3:

var newlogo:Object = new logoClass();
        addChild(newlogo);

Естественно, "он" ругается, так как Вы пытаетесь добавить в список отображения непонятно что...В список отображения можно добавлять лишь экземпляры классов, которые унаследованы от класса DisplayObject. В Вашем случае класс logoClass - это совершенно неизвестное существо, как для компилятора так и для меня. Имена классов принято записывать с Большой буквы.

Summer_sun 06.04.2009 01:30

Код AS3:

var loader:Loader;
 
 
loader=new Loader();
 
var urlRequest:URLRequest=new URLRequest("logo.swf");
loader.load(urlRequest);
 
loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
function initListener(e:Event):void {
 
        var logoClassName:String=getQualifiedClassName(e.target.content);
        var appDomain:ApplicationDomain=e.target.content.loaderInfo.applicationDomain;
        var LogoClass:Class=appDomain.getDefinition(logoClassName) as Class;
 
        var newlogo:Object = new LogoClass();
 
 
 
super.addChild(newlogo as DisplayObject);
}

не ругается но ничего не показывает всеравно :)

Добавлено через 9 минут
спасибо за исходник Alex Lexcuk

BlooDHounD 06.04.2009 11:03

Summer_sun, а в logo.swf есть рутовый класс? или там мувик?

Summer_sun 06.04.2009 14:35

Там векторная картинка на главной шкале, никаких символов, ничего.

Но вообще на самом деле по заданию мы не знаем что там, просто swf файл с логотипом.

Вот по примеру с собакой получилось все. А вот с getDefinition никак.

BlooDHounD 06.04.2009 14:38

Summer_sun, потому, что рутовый класс должен быть каким-то сознательным, а не просто MovieClip. тогда можно будет создавать его копию. используйте метод с собакой. я бы его использовать низа что не стал бы.

Summer_sun 06.04.2009 14:50

Чесно говоря останавливаться на том что и так работает не хочется, хочется все-таки разобраться
Цитата:

что рутовый класс должен быть каким-то сознательным, а не просто MovieClip.
не поняла :(

BlooDHounD 06.04.2009 14:59

есть флэшка. у неё прописывается рутовый класс. если его не прописать, то он будет просто MovieClip. и "скопировать" соответственно его нельзя средствами АС.

Summer_sun 06.04.2009 15:04

Значит метод с getDefinition тут не получится, если это как раз флешка без прописанного класса, просто какая-то флешка без исходника. А если это swf AC2 то его можно только с помощью [Embed] внедрить, а для [Embed] необходим Flex Builder? Можно ли внедренную флешку 2.0. размножить?

etc 06.04.2009 15:12

CS4 поддерживает Embed.

BlooDHounD 06.04.2009 15:29

ну нельзя прописывать рутовый класс, тогда остаётся метод "собаки".

CrazyFlasher 06.04.2009 15:34

если у вас без анимации, то можно просто использовать BitmapData.draw


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

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