所以我已经找到了一种创建像素化划像效果的好方法,其中像素的影片剪辑嵌套在行中。我创建了一个遍历每一行的循环,然后在该循环中为每行中的像素创建了另一个循环。然后我在1-0之间使用一个随机数作为延迟,然后才对像素进行alpha-up。我使用Greensock作为补间,效果很好。
一个问题,我无法停止行的for循环,并且每行都会立即出现。尽管如此,像素是交错的,这是一个很好的效果,但我希望它从左到右移动。所以我的代码看起来像这样:(顺便说一句,是的,AS3确实有setTimeout,它工作正常)
function stripeWipeUp(stripe:MovieClip):void {
var total = stripe.numChildren;
for (var i:int = 0; i<total; i++) { // the rows
trace(i);
setTimeout(function() {
trace("setTimeout: "+i);
var row:MovieClip = stripe.getChildAt(i) as MovieClip;
var pixTotal = row.numChildren;
for (var j:int = 0; j<pixTotal; j++) { the pixels
var pix:MovieClip = row.getChildAt(j) as MovieClip;
var num = Math.floor(Math.random()*100)/100; // the delay
pixUp(pix, num); // my greensock function
}
}, 500);
}
}
在那里使用setTimeout会发生的事情是,在一个setTimeout完成之前,“i”for循环命中每一行(有27个)。因此,它不能正常工作 - 在setTimeout完成之前,下一个循环不应该执行。任何想法如何实现这一点,每行停止大约500毫秒?感谢。
答案 0 :(得分:1)
你的问题就是这个。
trace("setTimeout: "+i);
“我”不是你的想法
“i”的范围是stripeWipeUp而不是匿名函数
据说“i”始终是在所有匿名函数中运行的循环的最后一次迭代的值。
因此,你可以看到,当anon函数触发“i”时,最有可能等于“total”
这就是为什么我们避免使用匿名函数,因为范围很难确定。
创建一个数组并在其中存储一个自定义类,用于控制您想要执行的操作的每个“像素”
在这个类中使用Timer对象而不是setTimeOut。
setTimeOut是从AS2遗留下来的垃圾函数。
答案 1 :(得分:0)
删除setTimeout,只需添加延迟乘以i
var num = ( i * 500 ) + Math.floor(Math.random()*100)/100; // the delay
答案 2 :(得分:0)
我会将I和j,一个Timer,以及一个Timer的事件处理程序封装到一个类中。在事件处理程序中我会:
答案 3 :(得分:-1)
我能够通过将内部部分取出并使其成为单独的功能来使其工作。我更喜欢像Creynders这样更清洁的解决方案,但由于某些原因无效。这是代码:
// the row of pixels
function row(stripe:MovieClip, i:int, up:Boolean, del:Number):void {
setTimeout(function() {
var row:MovieClip = stripe.getChildAt(i) as MovieClip;
var pixTotal = row.numChildren;
for (var j:int = 0; j<pixTotal; j++) {
var pix:MovieClip = row.getChildAt(j) as MovieClip;
var num = Math.floor(Math.random()*100)/100;
(up) ? pixUp(pix, num) : pixDown(pix, num);
}
}, del);
}
// the rows in the "stripe"
function stripeWipe(stripe:MovieClip, up:Boolean):void {
var total = stripe.numChildren;
var del:Number = 0;
for (var i:int = 0; i<total; i++) {
row(stripe, i, up, del);
del = del+100;
}
}