加载显示不会出现

时间:2011-12-21 21:27:23

标签: flash actionscript-3 flash-cs5

我正在编写一个带有as3的flash应用程序,如果你想查看这个应用程序:http://www.kongregate.com/games/yossefki/nqueensolver

这个应用程序做了一些需要时间的极端计算。我想在屏幕上显示“加载”,直到我写完主要计算之前完成计算。

loadingText.visible = true

在我写完

之后
loadingText.visible = false

但没有显示任何内容。如果我理解正确,只有在计算完成后才会进行更改,因此它会变得可见并再次返回到不可见状态 然后才应用更改。 有办法解决它吗?

这是功能:

public function solve():void{
    //sizeOfBoard:int , solutionNumber:int):Array

    trace("start solving at queens");
    loadingText.visible = true;
    trace("loading set to visible");
    solutionNumDes++;
    solutionNumCounter = solutionNumDes;
    for(var i:int=0;i<_size;i++)
        solution[i] = 0;

    resetBoard();
    if(solveRec(0))
        display();
    trace("loading set to unvisible");
    loadingText.visible = false;
    trace("finised solving at queens");

}//solve

其中solveRec是繁重的计算

2 个答案:

答案 0 :(得分:1)

问题可能在于您在同一帧中进行计算和可见性切换。

所以基本上你可能正在做的是:

  1. 按钮点击
  2. loadingText.visible = true;
  3. 沉重的计算
  4. loadingText.visible = false;
  5. 框架渲染
  6. 这里的问题是,与异步操作(如加载内容)不同,您必须“等待”计算结束。您可以通过等待一帧直到开始计算来避免这种情况。为了简单起见,loadingText.visible可以是一个标志,表示需要计算,每帧都会检查。

    1. 按钮点击
    2. loadingText.visible = true;
    3. 框架渲染,加载文字现在可见
    4. 输入框架
    5. :检查if(loadingText.visible)
    6. 沉重的计算
    7. loadingText.visible = false;
    8. 框架渲染
    9. 在计算结果时,您仍然无法执行任何操作。这意味着显示加载文本有效,但您不能拥有花哨的加载条或旋转圆。为此,您需要使用更高级的技术,通过每帧只计算部分计算,将整个计算分割为多个帧。

      您可以拆分这样的功能:

      private function solveButtonClicked():void {
          loadingText.visible = true;
      }
      
      private function enterFrame(e:Event):void {
          if(loadingText.visible) solve();
      }
      
      private function solve():void {
      
          solutionNumDes++;
          solutionNumCounter = solutionNumDes;
          for(var i:int=0;i<_size;i++)
              solution[i] = 0;
      
          resetBoard();
          if(solveRec(0))
              display();
          trace("loading set to unvisible");
          loadingText.visible = false;
          trace("finised solving at queens");
      
      }//solve
      

答案 1 :(得分:1)

如果计算时间超过帧刷新间隔,屏幕将冻结,直到操作完成。您必须将计算分散到帧以上,然后将剪辑设置为可见和不可见将真正显示一些结果。

结帐Pseudothreads。它是一种简洁实用的方法,可将长计算分成相当大的部分,并为Flash Player留下足够的处理能力,以便及时重绘屏幕。