【问题标题】:Flash AS3 - Timer goes crazy after a few loopsFlash AS3 - 定时器在几个循环后发疯
【发布时间】:2012-09-25 23:36:26
【问题描述】:

我一直在制作一个“幻灯片”,其中 4 张图像以随机顺序进行动画处理。

为了防止一个图像连续出现多个动画,例如连续3次,我写了一点逻辑。

我的问题:在所有 4 个图像都动画了几次之后(在我认为第二次清除查询“数组”之后),计时器变得疯狂,trace() 随机数在高序列率下没有动画这些图像,我认为看起来令人毛骨悚然。

我的代码:

var myTimer:Timer = new Timer(2500);
myTimer.addEventListener(TimerEvent.TIMER, animate);
myTimer.start();

var array:Array = new Array();
var lastNum:int;

function animate(e:TimerEvent):void {
    var num:int = getRandomNumber( 1, 4 );
    trace( num );
    if( array.indexOf( num ) < 0 && num != lastNum ) {
        myTimer.delay = 2500;
        if( num == 1 ) {
            sideImg_start_1.play(); // comment this*
        } else if( num == 2 ) {
            sideImg_start_2.play(); // comment this*
        } else if( num == 3 ) {
            sideImg_start_3.play(); // comment this*
        } else if( num == 4 ) {
            sideImg_start_4.play(); // comment this*
        }
        array.push( num );
        if( array.length == 4 ) {
            array.splice(0, 4);
            trace(" array cleared - " + array.length);
            lastNum = num;
        }
    } else {
        myTimer.delay = 100; // I've also tryed so make a higher delay
                // like 500 but its the same problem...
    }
}

function getRandomNumber( min:int, max:int ):int {
    return Math.floor( Math.random() * ( 1 + max - min ) ) + min;
}

stop();

各位,谢谢大家的回答和帮助:D

更新:

首先,我尝试简单地调用“animate()”函数,而不是为计时器定义更高的速度以快速调用下一个数字,而不会浪费时间,这会使随机动画看起来很奇怪。

我之前使用过animate(null); 而不是myTimer.delay = 100;,但后来我收到了一个STACKOVERFLOW 错误:P

【问题讨论】:

  • 你能发布你的.fla吗?或您的瑞士法郎,更容易看到这一点以了解问题
  • 我正在制作的整个“flash website”有各种版权,你可以直接kpy代码(注释我标记的行)并粘贴到一个新的flash as3项目的第一帧中查看追踪的数字。如果你跟踪他们,你可以清楚地看到问题。
  • 您会看到一些数字快速重复。但这仅是当它们已经存在于数组中时。一段时间后你会看到显示数字的速度会加快。
  • 当它加速时,它会忽略逻辑并继续显示从 1 到 4 的所有数字...
  • 是的,听起来更好,祝你好运!

标签: actionscript-3 flash random timer delay


【解决方案1】:

例如,如果您的 lastNum 等于 4,并且您有 1,2 和 3 作为新值,那么您最终将陷入无限循环,

因为你不能插入 4(因为它等于 lastNum)并且你不能插入 1,2 或 3 因为它们已经在数组中。

你需要做的是:

if (array.length == 4) {
    array.splice(0, 4);
    lastNum = num;
} else {
    lastNum = 0; //<-- HERE
}

【讨论】:

  • 老兄,你太棒了!现在是德国凌晨 02:15,我的大脑似乎停止工作了大约 4 个小时 XD 这显然只是我犯的那个简单的愚蠢错误^^谢谢
  • 不客气,我刚刚用trace() 替换了你的sideImg_start_1.play();,这样更容易调试:) 干杯(我们在摩洛哥早了一小时,凌晨 1 点 25 分: p)
  • 好吧,但现在我想我可以简单地查看是否 array.length == 1,然后只捕获丢失的数字,或者尝试从随机数生成器中获取它 XD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 2015-03-09
  • 2011-06-10
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多