var w:Number = Stage.width;
var h:Number = Stage.height;
var star:MovieClip;
//版本检测 check
var versionNums:Array = $version.toString().split(" ");
inform.text = (Number(versionNums[1].substr(0,1)) < 8) ? "You need the Flash 8 player to view this movie!" : "" ;
//Create children
var sourceMC:MovieClip = this.createEmptyMovieClip("sourceMC", this.getNextHighestDepth());
var destMC:MovieClip = sourceMC.createEmptyMovieClip("destMC", sourceMC.getNextHighestDepth());
var screenShot = new flash.display.BitmapData(w, h, true, 0);
//-------------------------------------------|
destMC.onEnterFrame = function()
{
drawStar();
capture();
drawToScreen();
}
//-------------------------------------------|
function drawStar()
{
star = sourceMC.attachMovie("star", "star", 1); //attach at 1
glow.color = Math.floor(Math.random()*0xFFFFFF);
star.filters = [glow,bevel];
star._x = getRandomInt(w, (star._width/2));
star._y = getRandomInt(h, (star._height/2));
}
//-------------------------------------------|
function capture()
{
destMC._visible = false;
screenShot.draw(sourceMC);
destMC._visible = true;
}
//-------------------------------------------|
function drawToScreen()
{
destMC.attachBitmap(screenShot, 1); //attach at 1
}
//-------------------------------------------|
function getRandomInt(max, sub):Number
{
return Math.floor(Math.random() * ((max+1)-(sub*2)) + sub);
}
我获取了屏幕的宽和高,动态创建了两个movieClip.一个是sourceMc.另一个是destMc.然后在创建bitmapData的实例。
下一步,我加入了一些代码在onEnerFrame方法中:
代码:
destMC.onEnterFrame = function()
{
drawStar();
capture();
drawToScreen();
}
We draw a star on the stage, take a screenshot, and finally transfer that screenshot to a MovieClip.
我们在场景中绘制星,然后将它传递给一个MovieClip.
下面是”draw“的代码:
代码:
function drawStar()
{
//attach star at depth 1
var star = sourceMC.attachMovie("star", "star", 1);
glow.color = Math.floor(Math.random()*0xFFFFFF);
star.filters = [glow,bevel];
star._x = getRandomInt(w, (star._width/2));
star._y = getRandomInt(h, (star._height/2));
}
drawStar:(绘制星星)
我们实际上粘贴的是一个放在库中之前准备好的图像,注意,我们在粘贴时用了一个固定的深度以便当有新的星星重复时可以被替换掉。源和目标剪辑的命名方是很有用的。你将在capture()函数中看到为什么。
第二行改变了glow滤镜的色彩,你可以在“filter“层的代码上看到,这里面我们所用的Math.random()来创建随机的黑到白之间的色彩。
第三行,我们指定滤镜给MC.
最后使用了我自定义的函数getRandomInt(),我们设置x和y的位置是一个随机的整数,并且在屏幕边框之内。
capture:(缓冲)
下面这个函数将是很简单的。
代码:
function capture()
{
destMC._visible = false;
screenShot.draw(sourceMC);
destMC._visible = true;
}
这里面我们先让我们的目标mc不可见,为什么?因为我们在循环过程中目标MC中将会包含一个我们之前的原始星星,我们只是需要用其它的星星,另外我也更想做到的是观看bitmapData的工作过程。
draw方法(用在下一个函数中)不会清除掉bitmapData.而是将新数据和老的数据混合,因为我们不想看到先是一屏,然后空了,再来一屏的那种效果。需要注意的是在使用glow的时候星星会是正常的。有时有可能会出glow 周围不正常的现象。
如下是你希望的效果:

下面这个可能不是你想看到的效果:

好,在结束我们的capture() 函数时,我们让destMc显示出来就可以。
drawToScreen:(绘至屏幕上)
DrawToScreen函数的功能就象的它的标题一样。目的是要将它绘制在屏幕上。如下代码:
代码:
function drawToScreen()
{
destMc.attachBitmap(screenshot,1);
}
最后,你可以测试你的影片了。
小结:在这个教程中每次运行时我都隐藏目标MC,除了这之外,你还可以对它进行其它的操作,例好,更换Alpha,xscale.yscale等等属性,你还可以加入其它的滤镜效果,如blur,如果你随意拖动一个矢量图形对象,你可以使用cacheAsBitmap以使处它变得更容易。
如果你想清除BMD中的内容,你需要使用fillRect(rectangle,color);为了做到这一点,你需要使用geom 类来创建一个矩形,请参看之前的教程flash8 maelstrom 基础
大致如下:
代码: