我正在使用 Flash CS5 和 FlashDevelop 在 ActionScript 3 中构建游戏。我试图让游戏尽可能多地以数据驱动。所以大部分游戏信息都存储在游戏需要时加载的 XML 文件中。
此加载工作正常,但碰巧有些文件变得相当大,因此加载可能需要几秒钟(目前在我的 PC 上约为 3,但我希望它会变得更长)。所以我想添加一个带有进度信息的加载屏幕(至少一个带有百分比的栏)。
后面的部分是让我困惑的部分。这是我要求加载 XML 文件的代码:
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() 函数来强制进行绘图调用,但是在使用 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%”文本。
有任何想法吗?这让我发疯...