难以理解ActionScript 3 Timer类

时间:2011-03-07 18:36:12

标签: actionscript-3

我正在尝试使用Flash / ActioScript 3制作一个骰子游戏。我做了所有必需品,它运作顺畅。现在我想改善用户体验。例如,当它的计算机轮到(根据模具价值滚动和做事)时,我想为模具设置动画。骰子有6个关键帧。因此,比方说,2秒钟,骰子将循环这6帧,然后它将停在一个值上(取决于随机发生器)。不知怎的,我不能按我的意愿去做。我怎么能写一个函数,以便当我说,

animateDice()

它只会在指定的时间间隔内为骰子设置动画?

更新

var timer:Timer = new Timer(10, 50);
myButton.addEventListener(MouseEvent.CLICK, onClick);
timer.addEventListener(TimerEvent.TIMER, animateDice);

function onClick(event: Event):void {
    timer.start();
}

function animateDice(event: Event):void {
    dice.play();
}

例如,我不明白为什么上面的代码不能正常工作。它在第一次点击时可以正常工作,但之后不会。

更新2:我想我还有问题。在计时器停止之前,如何暂停正在运行的代码? (是的,有一个解决方法---将计时器处理程序放在其他计时器等等中。有一种简单的方法吗?

也许,这会有所帮助:

首先我们看到骰子滚动(并且消息框告知用户游戏将决定谁开始)。然后是人类或计算机。当计算机转动时,首先我们再次看到滚动模具,比如1秒钟。然后它停止了,我们看到了结果。我是一个初学者,我不会错过任何东西,但从我看来,似乎所有这些简单的步骤(只是显示模具滚动一段时间)意味着很多很多行。

如果我使用一个简单的计时器进行模拟动画,脚本会继续,整个节目就会消失。

3 个答案:

答案 0 :(得分:2)

计时器对象有三个属性:

  • delay,或事件发生的频率
  • repeatCount,或者事件应该发射多少次
  • currentCount,或者到目前为止计时器事件被解雇的次数

您正在使用new Timer(10, 50)创建计时器,将delay设置为10并将repeatCount设置为50.这意味着,一旦您拨打timer.start(),计时器将会触发{ {1}}每10毫秒。每次触发时,它都会向TimerEvent.TIMER添加1。当currentCount大于或等于currentCount(50)时,它会停止循环计时器。

一旦您的计时器停止,如果您再次拨打repeatCount,它只会触发一次事件,因为timer.start()尚未重置为零,仍然是currentCount。< / p>

如果您在致电>= repeatCount之前致电timer.reset(),则会将此值设置为零,并且事情的行为应符合预期。

答案 1 :(得分:1)

var timer:Timer = new Timer(2000, 1);
myButton.addEventListener(MouseEvent.CLICK, onClick);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);

function onClick(event: Event):void {
    timer.reset();
    timer.start();
    dice.play();
}

function onTimerComplete(event:TimerEvent):void {
    var roll:int = int(Math.floor(Math.rand()*6))+1;
    dice.gotoAndStop(roll);
}

定时器设置为仅运行一次,持续2000毫秒(即2秒)。当Click发生时,计时器被重置(如果它不是第一次被点击,它将像第一次一样运行)并且启动,并且动画开始了。 2秒后,TIMER_COMPLETE将被计时器触发,我们捕获它并确定骰子的最终编号,然后gotoAndStop到该帧。

我没有尝试编译代码,但它的要点应该适合你。

P.S,骰子是'die'的复数形式:)你正在为我们都想要使用但不能使用的变量名类型跳过一个很好的机会!

答案 2 :(得分:0)

你可以尝试更多这样的东西:

var t:Timer = new Timer(10, 50);
t.addEventListener(TimerEvent.TIMER, timerHandler);
t.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
t.start();

function timerHandler(e:TimerEvent):void {
    gotoRandomFrame();
}

private function timerCompleteHandler(e:TimerEvent):void {
    var finalNum:int = gotoRandomFrame();
    // Using finalNum
}

private function gotoRandomFrame():int {
    var num:int = Math.floor(Math.random() * 6) +1;
    dice.gotoAndStop(num);
    return num;
}

因此,使用gotoAndStop设置框架而不是使用播放