Эта проблема может быть результатом перезапуска класса Timer при каждом изменении свойства задержки.
Из документов Adobe:
Если вы установите интервал задержки во время работы таймера, таймер перезапустится с той же итерацией repeatCount.
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/Timer.html#delay
Это в основном означает, что таймер перезапускается с 0, но запоминает, сколько раз он повторялся. Я понял, что мой ответ становится длинным, поэтому я добавил ссылку внизу.
РЕШЕНИЕ : используйте flash.utils.getTimer () вместо объекта Timer.
http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#getTimer()
Функция getTimer () возвращает целое число, представляющее количество миллисекунд, прошедших с момента запуска файла .swf. Если вы проверяете это число каждый кадр, вы можете увидеть, сколько времени прошло с предыдущего кадра. Просто продолжайте добавлять количество миллисекунд, которые прошли каждый кадр, пока это число не достигнет вашего порога, затем вызовите функцию рисования линий и сбросьте счетчик.
При проверке, чтобы увидеть, нажата ли клавиша, уменьшите новую переменную myDelay вместо свойства Timer.delay.
var ms:int;
var timeStamp:int = flash.utils.getTimer();
var myDelay:Number;
onEnterFrame() {
// Track how much time has passed since the last frame
ms += flash.utils.getTimer() - timeStamp;
if (ms > myDelay)
{
// DRAW THE ROAD LINES
drawLines();
// RESET THE COUNTER
ms = 0;
}
//other stuff
// Record the timestamp of this frame so you can see the difference next frame
timeStamp = flash.utils.getTimer();
}
ОБЪЯСНЕНИЕ СБРОСА ТАЙМЕРА:
ПРИМЕЧАНИЕ. Я предполагаю, что вы проверяете нажатия клавиш каждую секунду. Если вы изменяете свойство задержки таймера каждый кадр (например, 24 раза в секунду) и ваш таймер срабатывает реже, чем 24 раза в секунду, он будет сброшен до того, как получит возможность отправить событие для вызова своего обработчика функция для создания линий.
Если вы посмотрите на приведенный ниже пример, запуск и остановка события - это единственный способ предотвратить его сброс, но даже в этом случае функция обработчика события таймера будет вызываться только тогда, когда задержка меньше времени между изменения в задержке. Поскольку среднее значение SWF составляет 24 кадра в секунду, это означает, что задержка должна быть меньше, чем 41,6 миллисекунды для вызова, прежде чем следующий кадр изменит значение еще раз.
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* ...
* @author
*/
public class Main extends Sprite
{
var timer:Timer;
var keyPressed:Boolean = false;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
timer = new Timer(50);
timer.addEventListener(TimerEvent.TIMER, function ():void { trace (timer.delay); } );
timer.start();
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp );
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
function onEnterFrame (e:Event)
{
if (keyPressed)
{
timer.stop();
timer.delay -= 1;
timer.start();
}
}
function keyDown (e:KeyboardEvent):void { keyPressed = true; }
function keyUp (e:KeyboardEvent):void { keyPressed = false; }
}
}