Как передать переменную из одного Swf в другой Swf в ActionScript3? - PullRequest
0 голосов
/ 19 октября 2011

У меня есть два swf (a.swf и b.swf) в as3.Теперь я хочу передать переменную из a.swf в b.Swf.i по этой ссылке Учебное пособие Я использовал класс загрузчика. Вот мое кодирование.

var loader:Loader = new Loader();
loader.load("a.swf?test=hi");

Но я получил сообщение об ошибке

Ошибка типа: ошибка # 1034: сбой приведения типа: невозможно преобразовать «textchat.swf? Test = hi» во flash.net.URLRequest.at BasicTickerSprite_fla :: MainTimeline / frame1 ()

Как я могу исправить эту проблему? Как я могу передать строку из одного SWF в другой SWF?Кто-нибудь, пожалуйста, объясните мне подробно Так заранее

Ответы [ 5 ]

4 голосов
/ 19 октября 2011
1 голос
/ 19 октября 2011
var loader:Loader = new Loader();
loader.load(new URLRequest("http//localhost/a.swf?test=hi"));

для этого вам понадобится локальный сервер
обновление

    private var _ldr:Loader;
    private var _mc:MovieClip;
    public function Main():void {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point
        _ldr = new Loader();
        _ldr.contentLoaderInfo.addEventListener(Event.INIT, onInit);
        _ldr.load(new URLRequest('a.swf'));
    }

    private function onInit(e:Event):void{
        _mc = _ldr.content as MovieClip;
        _mc['test'] = 'hi';
        addChild(_mc);
    }
1 голос
/ 19 октября 2011

ExternalInterface - хороший подход.

Возможно, еще лучше будет класс LocalConnection:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/LocalConnection.html

Возможно, хорошее начало для понимания основных понятий - этоответ здесь при переполнении стека:

Как передать строку из SWF в другой SWF

Ответ пластикового осетра:

Давайте уточним немного: 1. Загрузчик swf, мы будем называть родительским.2. SWF, загруженный родителем, мы будем называть дочерним.

Дочерний объект содержит строку, и вы хотите, чтобы родительский элемент мог читать эту строку> Итак ... Дочерний объект должен определить публичную переменнуюдля строки.(Это означает, что вы должны использовать файл Class для него, так как вы не можете объявить свойство общедоступным на временной шкале.)

Наконец, родитель попытается получить это свойство.Вы можете захотеть обернуть это в try / catch для обработки случаев, когда строка не будет присутствовать.

Вот пример дочернего класса.

package  
{
import flash.display.Sprite;

/**
 * ...
 * @author Zach Foley
 */
public class Child extends Sprite 
{
    public var value:String = "This is the child Value";
    public function Child() 
    {
        trace("Child Loaded");
    }

}
}

А вот родительский загрузчиккласс:

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

/**
 * ...
 * @author Zach Foley
 */
public class Parent extends Sprite 
{
    private var loader:Loader;

    public function Parent() 
    {
        trace("PArent Init");
        loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
        loader.load(new URLRequest("child.swf"));
    }

    private function onLoaded(e:Event):void 
    {
        trace("Child Loaded");
        trace(loader.content['value']);
    }

}
}

Выходные данные будут: PArent Init Дочерний объект Loaded Child Loaded Это дочерний элемент Значение

0 голосов
/ 07 июля 2013

Я знаю, что это старая тема, но мне недавно пришлось ссылаться на экземпляр сервера Smartfox и переменные между несколькими SWF-файлами.Я думал, что поделюсь основами того, как я достиг этого.

ParentSWF

public var MyVar:String = "Hello";
public var sfs:SmartFox = new SmartFox(true);
private var ChildMC:MovieClip = new MovieClip();
private var myLoader:Loader;

private function LoadChildSWF(evt:Event):void //i used button click event to load swf
    {
    myLoader = new Loader();                     // create a new instance of the Loader class
    var url:URLRequest = new URLRequest("YOURSWF.swf"); // in this case both SWFs are in the same folder
    try
        {
            myLoader.load(url);
            myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,FFLoaded);

        } 
        catch (error:Error) 
        {
            trace("Unable to load requested document.");
        }
    }
    function FFLoaded(e:Event):void
    {
        ChildMC= myLoader.content as MovieClip;
        addChild(ChildMC);
        ChildMC.init(this);

    }
    public function RemoveChildMC():void
    {
        removeChild(ChildMC);
        ChildMC=null;
    }

ChildSWF

package
{
import com.smartfoxserver.v2.SmartFox;

public class ChildDocumentClass extends MovieClip
{
    private var refDocument:*;
    private var ChildVar:String;
    private var sfs:SmartFox;
    public function ChildDocumentClass()
    {
        trace("Initilise ChildDocumentClass");
        // Nothing to do
    }
    public function init(refDoc:*):void
    {
        // Get the references to the Document Class
        refDocument = refDoc;
        // Get the references to the Server Instance
        sfs=refDocument.sfs;
    //Pass Parent Variable to child variable 
        ChildVar=refDocument.MyVar;
    }
//call to parent class function example to remove loaded swf
    private function UnloadThisSWF():void
    {
        refDocument.RemoveChildMC();
    }
}
}

Как видите, общение может бытьдостигается передачей родительского класса в дочерний класс через функцию init (refDoc: *).

0 голосов
/ 19 октября 2011

Вы можете улучшить связь между SWF-файлами, используя объект ExternalInterface.

Посмотрите на здесь для справки Adobe.

и посмотрите на следующие ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...