Трудно понять класс ActionScript 3 Timer - PullRequest
0 голосов
/ 07 марта 2011

Я пытаюсь сделать игру в кости во 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 ]

2 голосов
/ 07 марта 2011

Объект таймера имеет три свойства:

  • delay, или как часто событие должно запускаться
  • repeatCount, или сколько раз событие должно запускаться
  • currentCount, или сколько раз событие таймера сработало до настоящего времени

Вы создаете таймер с помощью new Timer(10, 50), который устанавливает delay в 10 и repeatCount в50. Это означает, что после вызова timer.start() таймер будет запускать TimerEvent.TIMER каждые 10 миллисекунд.Каждый раз, когда он срабатывает, он добавляет 1 к currentCount.Когда currentCount больше или равно repeatCount (50), он прекращает цикл таймера.

После того, как ваш таймер остановился, при повторном вызове timer.start() событие будет запущено только один раз., поскольку currentCount не был сброшен в ноль и по-прежнему >= repeatCount.

Если вы вызываете timer.reset() перед вызовом timer.start(), он установит это значение в ноль, и все должно работать так, как ожидается.

1 голос
/ 07 марта 2011
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 секунды). Когда происходит щелчок, таймер сбрасывается (так что, если он щелкается не первый раз, он запускается, как в первый раз) и запускается, и анимация запускается хорошо. Через 2 секунды TIMER_COMPLETE будет запущен таймером, и мы поймаем его и определим окончательное число для кубика, затем перейдем к AndStop для этого кадра.

Я не пытался скомпилировать код, но суть его должна работать для вас.

P.S., игра в кости - это множественное число от 'die' :) вы упускаете прекрасную возможность для типа имен переменных, которые мы все хотим использовать, но не можем!

0 голосов
/ 07 марта 2011

Вы можете попробовать что-то более похожее на это:

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, чтобы установить свой кадр, вместо использования play

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...