PDA

Просмотр полной версии : Доступ к свойствам и методам из отладочной флешки


djserge
09.09.2011, 17:23
Привет всем. Помогите решить такую задачу. Есть три флешки: preloader.swf, loader.swf, hello.swf.
Loader.swf подгружает главный и единственный класс из hello.swf. Как из отладочной флешки preloader.swf получить доступ к свойствам и методам двух других флешок?

Пробовал вместо этого кода

Hello = loaderInfo.applicationDomain.getDefinition('Hello') as Class;
LoaderHello = loaderInfo.applicationDomain.getDefinition('LoaderHello') as Class;

такой способ

Hello = getDefinitionByName('Hello') as Class;
LoaderHello = getDefinitionByName('LoaderHello') as Class;

ничего не получается.

В flashlog.txt пишутся сообщения об ошибках:

<Error> Error #1065: Переменная Hello не определена.
<Error> Error #1065: Переменная LoaderHello не определена.
Ok loaded: file://localhost/C:/Documents and Settings/Admin/%D0%9C%D0%BE%D0%B8 %D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B/Hello/Hello.swf
Предупреждение: SWF-файл ActionScript 1.0/2.0 загрузил SWF-файл ActionScript 3.0; код в SWF-файле ActionScript 3.0 выполняться не будет.
Предупреждение: SWF-файл ActionScript 1.0/2.0 загрузил SWF-файл ActionScript 3.0; код в SWF-файле ActionScript 3.0 выполняться не будет.


Ниже привожу их исходный код

Hello.swf

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.*;

public class Hello extends Sprite
{
public const stroka:String = "HELLO";

public function Hello():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//helloworld();
}
private var txt:TextField;
public function helloworld():void {
var format:TextFormat = new TextFormat();
format.size = 37;
txt = new TextField();
txt.y = 180;
txt.text="Hello world!!!"
txt.setTextFormat(format);
txt.autoSize = TextFieldAutoSize.LEFT;
addChild(txt);
}
}
}


Loader.swf

package {
import flash.display.Sprite;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.URLRequest;
import flash.events.*;

public class LoaderHello extends Sprite {

public const text:String = "WORLD";

public function LoaderHello() {

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.load(new URLRequest("Hello.swf"));
}

private function completeHandler(event:Event):void {

var info:LoaderInfo = event.target as LoaderInfo;
trace("Ok loaded: " + info.url);
try {
var a:Class = info.applicationDomain.getDefinition("Hello") as Class;
addChild( new a() );
} catch (e:ReferenceError) {
trace('ERROR: '+e);
}
}

private function ioErrorHandler(event:IOErrorEvent):void {
trace("ERROR: " + event);
}
}
}


Preloader.swf

package
{

import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.utils.*;
import flash.display.DisplayObject;

public class Preloader extends Sprite
{
//Ссылка на самих себя
protected static var self:Sprite;
//Ссылка на объект который будет загружен в профайлер
protected static var targetSprite:Sprite;
//Ссылка на объект stage загруженного объекта
protected static var targetStage:Stage;

public function Preloader():void
{
if (stage) initHandler(null);
else addEventListener(Event.ADDED_TO_STAGE,this.initHandler);
}

private function initHandler(event:Event):void
{
if (hasEventListener(Event.ADDED_TO_STAGE)) removeEventListener(Event.ADDED_TO_STAGE,initHandler);

self = this;
root.addEventListener("allComplete",allCompleteHandler);
}

private function allCompleteHandler(event:Event):void
{
var loaderInfo:LoaderInfo;

try
{
loaderInfo = LoaderInfo(event.target);

if (loaderInfo.content.root.stage == null) return;

//Извлекаем ссылку на загруженный объект
targetSprite = loaderInfo.content.root as Sprite;
targetStage = targetSprite.stage;
targetStage.frameRate = 30;

beginHarassment();
}
catch(e:Error)
{
trace("<Error> " + e.message);
}
}

private var Hello:Class;
private var LoaderHello:Class;
private function beginHarassment():void {
try {
targetSprite = loaderInfo.content.root as Sprite;

Hello = loaderInfo.applicationDomain.getDefinition('Hello') as Class;
LoaderHello = loaderInfo.applicationDomain.getDefinition('LoaderHello') as Class;

var stringHello:Object = new Hello();

var stringLoaderHello:Object = new LoaderHello();
stringHello.helloworld();
trace("TEXT"+stringHello.stroka);
trace("STROKA"+stringLoaderHello.text);

}
catch (e:Error) {
var self:Preloader = this;
trace("<Error> " + e.message);
setTimeout(function():void { self.beginHarassment(); }, 1000);
}
}
}
}

toFL
09.09.2011, 17:47
Переменная Hello не определена.
var Hello:Class = ...
Предупреждение: SWF-файл ActionScript 1.0/2.0 загрузил SWF-файл ActionScript 3.0; код в SWF-файле ActionScript 3.0 выполняться не будет.
Сделайте все swf-ки на AS3

djserge
09.09.2011, 18:57
Сделал заново все проекты в AS3, скомпилировал, в flashlog.txt опять ошибки:


Предупреждение: SWF-файл ActionScript 1.0/2.0 загрузил SWF-файл ActionScript 3.0; код в SWF-файле ActionScript 3.0 выполняться не будет.
Предупреждение: SWF-файл ActionScript 1.0/2.0 загрузил SWF-файл ActionScript 3.0; код в SWF-файле ActionScript 3.0 выполняться не будет.

toFL
09.09.2011, 19:53
Увы, значит скомпилировали не все SWF в AS3. Чудес не бывает.