我们逐帧跟踪MovieClip,并希望找到预设的唯一对象(这是opengl的光栅化器flash动画)。我们做这项工作,代码如下:
public function process() : void
{
movieClip.addEventListener(Event.FRAME_CONSTRUCTED, onEnterFrame);
onDone = false;
currentFrame = 0;
movieClip.gotoAndStop(1);
while (!onDone)
{
movieClip.nextFrame();
};
}
private function onEnterFrame(e:Event) : void
{
if ( currentFrame >= movieClip.totalFrames )
{
convert(movieClip);
movieClip.removeEventListener(Event.FRAME_CONSTRUCTED, onEnterFrame);
onDone = true;
onDoneCallback(movieClipItem);
}
else
{
frames[currentFrame] = new Vector.<Object>();
labels.push(movieClip.currentFrameLabel);
for (var j:int = 0; j < movieClip.numChildren; ++j)
{
var child:DisplayObject = movieClip.getChildAt(j);
if ( child.visible )
{
frames[currentFrame].push(getSnapshot(child));
if ( !(child in objects) )
{
objects[child] = [];
}
objects[child].push(currentFrame);
}
}
currentFrame++;
};
}
因此,我们有“框架”集合,在每个框架上,我们拥有该框架上存在的对象。然后我们尝试在帧集合中找到相同的对象,并使用跟随函数来比较对象:
private function objectEqual (left:DisplayObject, right:DisplayObject) : Boolean {
return left === right && left.name == right.name;
}
但这种比较效果不佳。例如,当在第2帧和第10帧添加相同的动画片段时,objectEqual会告诉我们这个影片剪辑是不同的(这是不同的对象实例,但具有相同的内容,因此在我们的情况下,必须相等)。有些时候Shape对象可能会改变它们的内容,但实例和实例名称将保持不变,因此“objectEqual”也会出错,并告诉我们“left”和“right”是相同的,但它们是不同的。
答案 0 :(得分:1)