Хобрук: Ваш путь к мастерству в программировании

SWFLoader не работает дважды

У меня есть игра, которая динамически загружает другую мини-игру.

Я загружаю его с помощью SWFLoader:

function loadMinigame(minigameName:String):void
{
    var loader:SWFLoader = new SWFLoader;
    loader.load("/Content/Swf/" + minigameName + ".swf");
    layerMinigames.addElement(loader);
}

В первый раз, когда я загружаю, все работает нормально. Но когда я выхожу из мини-игры и пытаюсь открыть ее снова тем же методом, она не используется в моем приложении (иногда бывает, иногда нет).

Обе игры являются приложением Flex.

Что происходит?

Обновить

Я сделал loader.loadForCompatibility = true, и теперь он правильно загружается! Но теперь я получаю сообщение об ошибке, когда пытаюсь привести результат:

loader.addEventListener(Event.COMPLETE, function(e:Event):void
{
    var sys:SystemManager = SystemManager(e.currentTarget.content);
});

дает:

TypeError: Ошибка № 1034: Ошибка приведения типа: невозможно преобразовать _AppMinigame1_mx_managers_SystemManager @ 14c97eb9 в mx.managers.SystemManager.


  • Другая ошибка связана с тем, что ваша мини-игра - это другой SWF-файл, поэтому его ApplicationDomain отличается от вашего основного SWF-файла, поэтому даже идентичные классы во время выполнения в этих двух SWF-файлах различаются. Возможно, вместо этого сделайте приведение результата объекта. (Зачем вам SystemManager из этого SWF?) 31.07.2014
  • @Vesper Мне нужно настроить некоторые данные внутри загруженной мини-игры, например, сменить аватар. Пока успеха нет. 31.07.2014
  • Я думаю, вам следует отправлять строки или Object в мини-игру, возможно, отправляя ей пользовательские события с полем data, содержащим объект для анализа. 31.07.2014
  • @Vesper, что ты имеешь в виду? звонит sys.dispatchEvent(new MiniEvent(objData))? 31.07.2014
  • loader.content.dispatchEvent(new Event("customevent",objData)). Однако проверьте синтаксис и проверьте, что вы получаете при прослушивании события. 01.08.2014

Ответы:


1

Вам лучше кешировать загруженную мини-игру после загрузки, а затем просто отображать ее снова, когда это необходимо. Однако убедитесь, что ADDED_TO_STAGE прослушиватель мини-игры правильно сбрасывает мини-игру.

static var loadedGames:Object={};
function loadMinigame(minigameName:String):void
{
    if (loadedGames[minigameName]==null) {
        var loader:SWFLoader = new SWFLoader;
        loader.load("/Content/Swf/" + minigameName + ".swf");
        loadedGames[minigameName]=loader;
        loader.addEventListener(Event.COMPLETE,loaderFinished);
    } else {
        layerMinigames.addElement(loadedGames[minigameName]);
    }
}
function loaderFinished(e:Event):void {
    layerMinigames.addElement(e.target);
    // do the rest, like setting proper start time for minigame, etc
}

ОБНОВЛЕНИЕ: поскольку у вас заканчивается память при запуске такого процесса, это означает, что экземпляр мини-игры удерживает слишком много памяти и должен быть освобожден (GC'd), чтобы загрузить другую мини-игру. Таким образом, кеширование загрузки SWF исключено. Вы можете освободить SWF-файл, используя unloadAndStop() вызов против него. Перед этим убедитесь, что ваша мини-игра удалена из списка отображения, а ее REMOVED_FROM_STAGE прослушиватель завершает работу всех прослушивателей, подключенных к stage. Также вам может потребоваться отладка SWF-файла мини-игры, чтобы определить возможные утечки памяти, поскольку ваши SWF-файлы используют одно и то же пространство памяти, а утечка памяти в одном из них сводит на нет ваши усилия что-либо делать во всех остальных.

31.07.2014
  • Я не могу кэшировать все мини-игры. Но та же проблема возникает, если я пытаюсь загрузить другую мини-игру ... 31.07.2014
  • Вы не можете кэшировать, то есть у вас заканчивается память? Да, к этому ограничению лучше подготовиться. Тогда вы не сможете решить свою проблему, загрузив все SWF-файлы один раз и оставив все как есть. Вероятно, вы можете кэшировать prototype этого Main класса SWF, отбросив расширенный SWF и создав new loadedGames[minigameName]() всякий раз, когда вам понадобится новый экземпляр игры. Я обновлю ответ. 31.07.2014
  • Новые материалы

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

    Быстрая разработка: волшебный мир больших языковых моделей
    РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..