Walter She's Blog

flash,flex ,javascript原创教程,web设计,Flash RIA,其它与之相关的内容.

« 在Flash中怎样建立一个数组LoadCursor类 »

修复alpha属性误差

电影剪辑的_alpha(MovieClip._alpha)属性值其实是在0 - 255整数范围内。当设置my_mc._alpha = 20时,my_mc._alpha的真实值为 256 * 20% = 51.2 修正为整数后为51(因为0 - 255其实是有256个整数,所以为256 * 20%)。

看下面的代码:

var clip:MovieClip = this.createEmptyMovieClip(

                 "clip", this.getNextHighestDepth( ));

clip._alpha = 0;

for(var i = 1; i <= 100; i++){

  clip._alpha++;

  trace(i+"% =  " + clip._alpha + "% alpha");

}


在输出面板的最后几行如下:
95% = 74.21875% alpha
96% = 75% alpha
97% = 75.78125% alpha
98% = 76.5625% alpha
99% = 77.34375% alpha
100% = 78.125% alpha

你会发现最后clip._alpha = 78.125而不是100,没想到吧会产生这样大的误差。那么误差到底是在哪一步
产生的呢?下面具体分析以下:

当i=1时
clip._alpha = 1,1% * 256 = 2.56 因为只能取整数所以实际值是2;
当i=2时
clip._alpha = clip._alpha + 1,在上一次循环后clip._alpha 转化为0-255之间的数值是2,将其转化
到%数即为 2/256*100% = 0.78125% 。所以clip._alpha = 0.78125 + 1 ;

剩下的你自己可以计算,会发现和输出面板里的数值一致。

那么在做和透明度有关的动画时怎样避免这种误差呢?如果你真正懂得了上面的解说的话相信
你会有自己的好办法。下面是其中的一种,可以参考:

//注:假设clip为舞台上的一电影剪辑

clip._alpha = 0;
fader(clip, 0, 100);

function fader(mc, startAlpha, endAlpha) {

  mc.fade1 = startAlpha;
  mc.fade2 = endAlpha;
  mc.onEnterFrame = fade;
}

function fade( ) {

  this._alpha = this.fade1++;

  if (this.fade1 >= this.fade2) {
    this._alpha = this.fade2;
    delete this.fade1;
    delete this.fade2;
    delete this.onEnterFrame;
  }
}

上面的代码既修正了alpha的误差也减少了计算量,因为没有使用 xx = xx._alpha之类运算量大的语句。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表