FLASH AS3:以编程方式删除关键帧

时间:2012-01-05 14:52:35

标签: flash actionscript-3 video actionscript slideshow

以下是我要做的事情: 我有一个带有简单渐变过渡的图片幻灯片。我没有源文件,我想从幻灯片中提取所有单张图片。我已将视频导入闪存,以便视频中的所有图像都是关键帧。

所以现在,我有一部约10,000个关键帧的电影。我有一个我不想要的已知关键帧间隔(当图片单独在一个帧上并且它没有与另一个图片转换时)。

可以:

  1. 删除关键帧的间隔
  2. 使用我想要的关键帧
  3. 创建一个新的动画片段/文档/场景....

    任何建议都会非常有用!感谢

2 个答案:

答案 0 :(得分:1)

你不能像你想要的那样复制关键帧,但是我可以为你提供一种方法来播放你的电影/动画片段而不需要不需要的帧。

首先,您应该在EnterFrame上添加一个事件监听器:

addEventListener(Event.ENTER_FRAME, onEnterFrame);

然后你可以编写一个定义有效帧的方法:

private function isValidFrame(frameIndex:uint):Boolean
{
    return frameIndex > 10       //range start
            && frameIndex < 3000 //range end 
            && [62, 15, 337].indexOf(frameIndex) == -1;//add forbidden frames here
}

最后,你可以编写你的enterframe监听器:

private function onEnterFrame(e:Event):void
{
    var frameIndex:uint = this.currentFrame;
    while (!isValidFrame(frameIndex))
    {
        frameIndex++;
        if (frameIndex >= 10000)
        {
            //stop everything
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
    }
    gotoAndStop(frameIndex);
}

干杯!

答案 1 :(得分:1)

为什么要删除关键帧?您可以直接转到所需的确切关键帧,并从该帧的动画片段中制作位图副本。 下面是一个小的util类,我用它来制作DisplayObjects的位图副本:

package{
import flash.display.DisplayObject;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

public final class Cropper{

    public function Cropper():void{}

    public static function crop(_x, _y, _w:Number, _h:Number, displayObject:DisplayObject):Bitmap
    {
        var cropArea:Rectangle = new Rectangle(_x, _y, _w, _h);
        var croppedBitmap:Bitmap = new Bitmap(new BitmapData(_w, _h, true, 0x00000000));

        var dispObjData:BitmapData = new BitmapData(displayObject.width, displayObject.height, true, 0x00000000);
        dispObjData.draw(displayObject);

        croppedBitmap.bitmapData.copyPixels(dispObjData, cropArea, new Point(0, 0), null, null, true);

        return croppedBitmap;
    }
}

}

你可以在循环中使用它来迭代关键帧数组并制作副本,如下所示:

var arr:Array = new Array(1, 10, 20, 30, 40...);
for(var i:int = 0; i < arr.length; i++){
yourDisplayObject.gotoAndStop(arr[i]);
var cropPic:Bitmap = Cropper.crop(x, y, width, height, displayObjectToCopy);
}

告诉我它是否适合你...