AS3 / AIR替代PrevFrame()(如果是大影片剪辑则太慢)

时间:2015-07-07 14:15:46

标签: actionscript-3 air flash-cc

我遇到了prevFrame()的问题。在我以前的项目中,我从来没有遇到过麻烦(使用非常简单),但是这个...我不明白。一切都做它需要做的事情,但当我试图去我的“主要电影剪辑”的prevFrame时,它需要很长时间。 一些背景:我正在为一种古老的语言(非拉丁字母)制作一本字典。有6000个字形,所以我必须找到一种方法来制作这么复杂的“键盘”。

var gArray: Array = [gEmpty, clavierUI.g1, clavierUI.g2, clavierUI.g3, (...)
    clavierUI.g50
]; //array contaning the buttons for the keyboard (50 instances of the same
//movieclip. This movieclip is made of 6.000 frames, each containing a 
//glyph), the fnClavier function makes each of the fifty instances go to its
//respective frame)


var myXML2: XML = new XML();
var XML_URL2: String = "assets/glyphs.xml";
var myXMLURL2: URLRequest = new URLRequest(XML_URL2);
var myLoader2: URLLoader = new URLLoader(myXMLURL2);
myLoader2.addEventListener("complete", xmlLoaded2);
//import the codename for each glyph

function xmlLoaded2(event: Event): void {
    myXML2 = XML(myLoader2.data);
}

var xml2: XMLList = myXML2.glyph.code;

function fnClavier(e: Event): void { //transforms the keyboard
    for each(var glyph: MovieClip in gArray) { 
        glyph.gotoAndStop(gArray.indexOf(glyph) + (50 * (clavierUI.currentFrame - 1))); 
//the seconde half (50 * (...) -1))) can be explained like that : 
//50 = 50 keys by keyboard "page".
// clavier.currentFrame - 1 = modifier, tells which set of the 6000 glyphs 
//needs to appear (and later, correspond with the codename from xml)
    }
}

clavierUI.nextPage.addEventListener(MouseEvent.CLICK, fnNextPage);
function fnNextPage(e: Event): void {
    clavierUI.nextFrame(); //no problem here, goes fast.
    fnClavier(null);
}

clavierUI.prevPage.addEventListener(MouseEvent.CLICK, fnPrevPage);
function fnPrevPage(e: Event): void {
    clavierUI.prevFrame(); //takes about 20secondes to go back.
    fnClavier(null);
}

我的代码可能远非完美(我还在学习),但我不知道为什么它不起作用。跳过框架并进入下一个工作完美,所以任何人都知道为什么回到一帧需要永远? 谢谢。

1 个答案:

答案 0 :(得分:0)

你最好使用容器而不是框架。每次在关键帧之间移动时,框架都会被构造和解构,同时您构造所有容器一次,然后根据需要显示它们,一次显示一个容器。我希望Flash在某个地方进行优化,在通过nextFrame()显示之前构建下一帧,而突然调用prevFrame()会强制Flash立即构造它,如果它非常复杂,则需要花费很多时间。

你有6000个字形吗?这是很多,但不是太多。例如,您可以创建一组容器,每个容器包含120个字形。要做到这一点,你创建一个Sprite的数组,每个都有一个12x10的字形网格,其中将有50个。然后,当您需要另一个页面时,从数组中显示另一个精灵。此外,如果您的字形是静态矢量对象,则应将其转换为矢量图形,并添加为库项目(Shape后代,这些内存占用较少)。如果是栅格,请使用Bitmap和基础BitmapData类来使用它们。