Игровые активы не загружаются в Kongregate

Я только что создал свою первую игру, и у меня возникли некоторые проблемы. Я загрузил в Kongregate(но еще не опубликовал), и в предварительном просмотре внешние файлы (музыка и три изображения) не загружаются. В остальном игра работает нормально.

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

Я использую FlashDevelop, так что все программно. Я заметил, что swf имеет размер всего несколько килобайт, так что есть ли возможность скомпилировать ресурсы в файл swf и загрузить их таким образом, или мне нужно сделать что-то еще?

Пожалуйста, помогите, и спасибо заранее.

2 ответа

Хорошо, тогда позвольте мне объяснить. Предположим, у вас есть основной модуль game.swf, который загружает некоторое изображение asset.jpg из той же папки. Вы проверяете это локально, он работает просто отлично. Вы помещаете game.html, game.swf и asset.jpg на свой сайт http://niamke.com/ и он все еще работает. Затем вы публикуете свою игру как http://kongregate.com/games/niamke/myniamkegame/ и она внезапно перестает загружать asset.jpg.

Зачем

HTTP-запросы от Flash Player обрабатываются через браузер. Таким образом, браузер получает запрос на "asset.jpg" из экземпляра Flash Plugin. На одной странице может быть любой контент (в том числе несколько приложений Flash) из нескольких разных доменов, поэтому браузер не пытается определить правильный адрес и просто пытается загрузить относительно самого верхнего HTML-документа, в основном http://kongregate.com/games/niamke/myniamkegame/asset.jpg которого там нет.

Как этого избежать

Вы должны создать небольшой фрагмент кода, который показывает правильные URL для загружаемых вами файлов. Как только ваш контент прикреплен к рабочей области, любой экранный объект может получить доступ к объекту loaderInfo, который содержит абсолютный URL-адрес SWF.

использование

Files.parseURL(loaderInfo.url);

var aLoader:Loader = new Loader;
var aRequest:URLRequest = new URLRequest(Files.baseUrl + "asset.jpg");

Loader.load(aRequest);

Реализация

package
{
    public class Files
    {
        // Long live Bill Gates and Windows and backslashes.
        static public function figureSlash(value:String):String
        {
            var aSplit:Array = value.split("/");
            var oSplit:Array = value.split("\\");

            return (aSplit.length >= oSplit.length)? "/": "\\";
        }

        static public var baseUrl:String;
        static public var systemSlash:String;

        // Supposed to dissect the SWF url in order to
        // process relative resource file urls properly.
        static public function parseURL(value:String):void
        {
            // Figure correct slash.
            systemSlash = figureSlash(value);

            // Split SWF URL into Array and remove SWF name.
            var aSplit:Array = value.split(systemSlash);
            aSplit[aSplit.length - 1] = "";

            // Obtain the SWF root folder.
            baseUrl = aSplit.join(systemSlash);
        }
    }   
}

Комментарий привел меня к следующему выводу: "Я только что связал URLRequest с тем, где файлы размещались в Интернете".

Другие вопросы по тегам