是否可以使用Flash比较DisplayObjects的内容?

时间:2015-06-30 09:13:43

标签: actionscript-3 flash

我们逐帧跟踪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”是相同的,但它们是不同的。

1 个答案:

答案 0 :(得分:1)

像@Vesper所说的那样,可能你应该为你的帧集合中的每个对象添加一个原始变量(例如int),并通过散列函数序列化你想要比较的内容并存储在该变量中。只要散列函数提供唯一输出,您就可以比较此变量以查看内容是否相等。