我刚刚创建了我的第一个游戏,但遇到了一些问题。我上传到 Kongregate(但尚未发布),在预览中外部文件(音乐和三张图片)不加载。游戏的其余部分运行良好。
如果我尝试更改它,以便其中有一个包含资产的 zip 并更改代码中的目录,它就会分崩离析。
我正在使用 FlashDevelop,所以一切都是程序化的。我注意到 swf 只有几 kb 大,所以无论如何要将资产编译到 swf 文件中并以这种方式加载它们,还是我需要做其他事情?
请帮助,并提前感谢。
我刚刚创建了我的第一个游戏,但遇到了一些问题。我上传到 Kongregate(但尚未发布),在预览中外部文件(音乐和三张图片)不加载。游戏的其余部分运行良好。
如果我尝试更改它,以便其中有一个包含资产的 zip 并更改代码中的目录,它就会分崩离析。
我正在使用 FlashDevelop,所以一切都是程序化的。我注意到 swf 只有几 kb 大,所以无论如何要将资产编译到 swf 文件中并以这种方式加载它们,还是我需要做其他事情?
请帮助,并提前感谢。
好的,那我来解释一下。假设您的主模块game.swf从同一文件夹加载了一些图像asset.jpg 。你在本地测试它,它工作得很好。您将game.html、game.swf和asset.jpg放在您的网站http://niamke.com/上,它仍然有效。然后您将游戏发布为http://kongregate.com/games/niamke/myniamkegame/并且它突然停止加载assets.jpg。
为什么
来自 Flash Player 的 HTTP 请求是通过浏览器处理的。因此,浏览器从 Flash 插件实例中获取“ asset.jpg ”请求。一个页面中可能有来自多个不同域的各种内容(包括多个 Flash 应用程序),因此浏览器不会费心找出正确的地址,而是尝试加载相对于最顶部的 HTML 文档,基本上是http:/ /kongregate.com/games/niamke/myniamkegame/asset.jpg不存在。
如何避免它
您应该创建一小段代码来计算您加载的文件的正确 URL。一旦您的内容附加到 Stage,任何显示对象都可以访问包含绝对 SWF URL 的 loaderInfo 对象。
用法
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 链接到在线托管文件的位置。”