AS3 играет / общается с внешним SWF - PullRequest
2 голосов
/ 02 сентября 2011

хорошо, так что я ввожу тестовый внешний SWF так:

var loader:Loader = new Loader();                     
var url:URLRequest = new URLRequest("load2.swf"); 
loader.load(url);                                    
addChild(loader);

Теперь я пытаюсь вызвать goto и играть так:

var loaded:Object;

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoaded);

function handleLoaded(e:Event):void {
  loaded = e.target.content;
}

load1.addEventListener(MouseEvent.CLICK, handleClick);

function handleClick(e:MouseEvent):void {
  if (loaded) {
    loaded.gotoAndPlay("outro");
  }

  //other content here.
}

этот простой внешний тестовый SWF имеет 10 кадров. @ frame 1 - метка «intro», @ frame 5 - действие «стоп», а на кадре 6 - метка «outro».

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

любые идеи / советы / подсказки и т.д. заранее спасибо.

Ответы [ 4 ]

1 голос
/ 03 сентября 2011

Попробуйте прослушать Event.INIT вместо Event.COMPLETE.

Цитирование документации для LoaderInfo:

complete: отправляется после успешной загрузки данных.

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

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/LoaderInfo.html

Редактировать : теперь я вижу, что вы не вызываете gotoAndPlay напрямую при загрузке, но позже.Я все равно оставлю здесь ответ.

1 голос
/ 02 сентября 2011

Попробуйте разыграть loaded как мувиклип:

MovieClip(loaded).gotoAndPlay("outro");

Хорошо, так что это не исправило ...

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

A га

Мне кажется, я решил это. Проблема связана с наличием текста TLF в load2.swf. Я доказал это, создав собственную версию load2 без текста TLF, и это прекрасно работало с вашим eerase.fla. Когда я добавил текстовое поле TLF в свой load2, оно начало показывать поведение, которое вы испытываете. Поэтому исправление заключается в том, чтобы просто не использовать текстовые поля TLF в любом загруженном SWF. Я протестировал, используя классические текстовые поля без проблем.

Причина, по которой это происходит, заключается в том, что текстовые поля TLF требуют загрузки данных, и поэтому он создает искусственный предзагрузчик, который загружается в ваш контент. Когда вы запускаете действие gotoAndPlay, вы на самом деле говорите с этим предварительным загрузчиком, а не с временной шкалой, которую вы создали, и следствием этого является то, что предварительный загрузчик «загружает» другую копию вашего контента. Это не фактический HTTP-запрос, поскольку весь контент находится внутри load2.swf, поэтому на панели Net в Firebug ничего не отображается. Вы можете более ясно увидеть, что создается, декомпилировав один из ваших SWF.

0 голосов
/ 02 февраля 2014

я улучшил его

function handleClick(e:MouseEvent):void
    {
    if (handleLoaded)
        {
            loaded.gotoAndPlay("outro");
        }

    //load new swf
    }

заменил на:

function handleClick(e:MouseEvent):void
{
    if (handleLoaded(e))
    {
        loaded.gotoAndPlay("outro");
    }

    //load new swf
}

Это работает точно .. Я тестирую на Flex SDK 3.6a .. Но я не тестировал на FlashCS3 / CS4 / CS5 пока нет.Спасибо

0 голосов
/ 03 сентября 2011

Я полагаю, что вы просто проверяете неправильную функцию в своем операторе if внутри функции handleClick.Вы должны проверять if (handleLoaded), а не if (загружен) ...

//these 4 lines load ext swf
var loader:Loader = new Loader();// create a new instance of the Loader class
var url:URLRequest = new URLRequest("load2.swf");// in this case both SWFs are in the same folder 
loader.load(url);
// load the SWF file;
addChild(loader);
//////////
//test below
var loaded:MovieClip;

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoaded);

function handleLoaded(e:Event):void
    {
    loaded = e.target.content;
    }

load1.addEventListener(MouseEvent.CLICK, handleClick);

function handleClick(e:MouseEvent):void
    {
    if (handleLoaded)
        {
            loaded.gotoAndPlay("outro");
        }

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