我使用Flash CS5和FlashDevelop在ActionScript 3中构建游戏。我正在努力让游戏尽可能多的数据驱动。因此,大多数游戏信息都存储在XML文件中,这些文件在游戏需要时加载。
这种加载工作正常,但事实上,一些文件变得相当大,因此加载可能需要几秒钟的时间(目前在我的电脑上大约需要3秒钟,但我预计它会变得更长)。所以我想添加一个带有进度信息的加载屏幕(至少是一个带有百分比的栏)。
后面的部分让我感到困惑
public function load( a_FileName:String, a_Callback:Function, a_LoadingScreen:MovieClip ):void
{
m_Callback = a_Callback;
m_LoadingScreen = a_LoadingScreen;
var t_URLLoader:URLLoader = new URLLoader();
t_URLLoader.addEventListener( Event.COMPLETE, fileLoadComplete );
t_URLLoader.addEventListener( ProgressEvent.PROGRESS, fileLoadProgress );
t_URLLoader.load( new URLRequest( a_FileName ) );
}
以下代码应在每个ProgressEvent.PROGRESS 上调用
public function fileLoadProgress( e:ProgressEvent ):void
{
m_LoadingScreen.txtPercentage.text = Math.floor( ( e.bytesLoaded / e.bytesTotal ) * 100 ) + "%";
}
问题是,我的程序似乎是先加载文件(繁忙时不做任何其他事情),然后才显示加载屏幕。
如果我在fileLoadProgress函数中放入跟踪,我会在输出窗口中得到一些更新,但屏幕不会更新。
当使用MouseEvents时,我知道你可以使用updateAfterEvent()函数来强制调用draw,但在使用ProgressEvents时,这个方法似乎不可用。
有什么方法可以在加载xml文件时强制我的屏幕更新吗?
---编辑----
我做了一个小沙盒来进一步测试这个问题:一个FLA文件,在第一帧上只有一个动态文本字段,下面的代码:
var t_URLLoader:URLLoader = new URLLoader();
t_URLLoader.addEventListener( Event.COMPLETE, fileLoadComplete );
t_URLLoader.addEventListener( ProgressEvent.PROGRESS, fileLoadProgress );
t_URLLoader.load( new URLRequest( "data/TerritoryData.xml" ) );
stop();
function fileLoadProgress( e:ProgressEvent ):void
{
trace( Math.floor( ( e.bytesLoaded / e.bytesTotal ) * 100 ) + "%" );
txtPercentage.text = Math.floor( ( e.bytesLoaded / e.bytesTotal ) * 100 ) + "%";
}
function fileLoadComplete( a_Event:Event ):void
{
trace( "done!" );
txtPercentage.text = "done!";
}
这是我能做的最多的熊骨头,但它仍然显示出同样的问题。在我的输出窗口中,跟踪显示:
28%56%84%100%完成!
但在屏幕上,它从空白变为"完成"。如果我在fileLoadProgress函数中设置断点,屏幕也不会更新。如果我在fileLoadProgress函数中关闭URLLoader(),它最终会显示一个"28%"的文本。
有什么想法吗?这让我发疯了。。。
您是否尝试过在第一帧中设置所有内容,但在第二帧中加载?所以实际上需要:
t_URLLoader.load( new URLRequest( "data/TerritoryData.xml" ) );
stop();
到第二帧。我认为txtPercentage不会在两者之间刷新。
正如Dave Hart在对原始问题的评论中提到的那样。答案是,除非从外部网站加载xml文件,否则Flash不会更新屏幕。
有了我网站上的XML,游戏会在文本字段中显示一到两个更新,屏幕更新会在其间暂停(我在后台使用了一个简单的动画来跟踪帧速率)。到目前为止,这仍然不是我在调试窗口中收到的跟踪输出的数量,但至少它表明它确实可以通过大约每秒一次的更新将内容输出到屏幕。
也是我第一次尝试它时,它似乎比随后的几次工作得更好,但这可能是因为文件暂时存储在本地?
不幸的是,这对我来说毫无用处,因为我的文件将在本地加载。所以我想我将不得不忍受加载没有任何动画的屏幕。