Как получить доступ к открытым свойствам и методам загруженного SWF - PullRequest
2 голосов
/ 18 марта 2011

Как бы вы вызвали публичные свойства и методы SWF-файла, который вы загружаете в actionscript?

Я годами использовал stackoverflow, чтобы отвечать на мои вопросы по программированию, поэтому я хотел дать ответ, написав руководство по проблеме, с которой мне было трудно разобраться. Это мое первое руководство пользователя, поэтому скажите мне, что я могу сделать, чтобы улучшить его.

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Одной из наиболее мощных функций флеш-движка является возможность загрузки флеш-программ в рамках флеш-программ с помощью класса Loader. К сожалению связь с загруженной программой ограничена. Хотя вы можете установить объект LocalConnection, есть ограничение на трафик, который он может безопасно поддерживать.

Простым решением является загрузка SWF-файла в домене безопасности вашей основной программы. Это дает преимущество в том, что открытые методы и свойства загруженного SWF-файла загружаются и наоборот.

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

public class ParentChildLoader extends Loader

Далее мы должны сохранить SWF-файл как ByteArray. Путь к переменной - это путь к файлу в системе. Вы можете использовать объект URLStream вместо FileStream для URL-адреса http.

var swfBytes:ByteArray = new ByteArray();
var file:File = new File(path);
if (file.exists)
{
    var loadStream:FileStream = new FileStream();
    loadStream.open(file, FileMode.READ);
    loadStream.readBytes(swfBytes);
    loadStream.close();
}

Теперь, когда у нас есть SWF-файл, сохраненный как ByteArray, мы загружаем SWF-файл в наш домен безопасности и ожидаем завершения события.

var context:LoaderContext = new LoaderContext();
context.allowLoadBytesCodeExecution = true;
addEventListener(Event.COMPLETE, onSwfLoad);
loadBytes(swfBytes, context);

Если вы хотите получить доступ к свойствам загруженного SWF-файла из загрузчика, используйте свойство content.

Object(this.content).foo(bar);
Object(this.content).a = b;

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

Object(this.parent).foo(bar);
Object(this.parent).a = b;

Это имеет множество практических применений, от повторного использования общих функций до снятия некоторых программных нагрузок с вашей творческой команды. Предостережение; загруженный SWF-файл существует в домене безопасности вашей основной программы, поэтому важно, чтобы вы загружали только те файлы, которым доверяете, с помощью этого метода.

1 голос
/ 20 марта 2011

Более чистый способ - использовать интерфейсы. Вот пример. Состоит из двух проектов. Проект 1 (PluginLoader) - ваше базовое приложение. Часть этого проекта включает в себя интерфейс AS3:

/* IPlugin.as */
package
    {
        public interface IPlugin
        {
            function getID():String;
            function doStuff():void;
        }
    } 

Затем загруженный SWF-файл во втором проекте (TestPlugin) реализует интерфейс:

package
{
    import flash.display.Sprite;

    public class TestPlugin extends Sprite implements IPlugin
    {
        private const _ID:String = "TestPlugin";

        public function getID():String {
            return _ID;
        }

        public function doStuff():void {

            trace('Test plugin: Doing Stuff');
        }
    }
}

Интерфейс будет включен в этот проект через исходные файлы или SWC.

Затем загрузить его (обратно в проект PluginLoader):

    public class PluginLoader extends Sprite
    {
        public function PluginLoader()
        {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            loader.load(new URLRequest('plugins/TestPlugin.swf'));
        }

        private function completeHandler(e:Event):void {
            var plugin:IPlugin = e.target.content as IPlugin;
            trace(plugin.getID());
            plugin.doStuff();

        }
    }
}
0 голосов
/ 18 марта 2011

Я бы не согласился с вами на вашем подходе. Это «хакерский», по моему мнению. Существует причина, по которой вы ограничены в общении с загруженными SWF-файлами, и это потому, что вы не знаете, что они делают и как они предполагают, что ими управляют.

Если вы хотите говорить архитектурно, это очень плохой способ доступа к информации. Основное приложение не должно иметь доступа к свойствам в загруженном SWF. Если вы создаете крупномасштабное приложение, и загруженному SWF-файлу (может быть, модулю?) Нужна информация, которую имеет основное приложение, вам следует изучить структуру приложения, такую ​​как Parsley, которая внедряет зависимости, чтобы предоставить данные, необходимые для загруженного SWF-файла. Это гораздо более чистый подход и является архитектурно обоснованным.

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