Проблема с использованием таймеров

Я написал таймер, чтобы показать пользователю, сколько он / она находится в этой текущей сцене:

timer_txt.x = 352;
timer_txt.y = 705;
var nCount: Number = 0;
var myTimer: Timer = new Timer(50, nCount);

timer_txt.text = "Time: " + nCount.toString();
myTimer.start();

function countUp(e: TimerEvent): void {
   nCount++;
   timer_txt.text = "Time: " + nCount.toString();
   if (nCount > 60) {
      var formattedTime =
        ((Math.floor(nCount / 60)) + ":" + (nCount % 60 >= 10 ? "" : "0") + (nCount % 60));
      timer_txt.text = "Time: " + formattedTime.toString();
   }
}

У меня есть кнопка reset для сброса других объектов на сцене, но не timer.

Мои проблемы:

  1. Каждый раз, когда я нажимаю кнопку reset, timer становится все медленнее и медленнее, и я не знаю почему, пока я не делаю никаких изменений в таймере. У меня на сцене много flags и много child. Когда пользователь щелкает / касается кнопки reset, все flags будут равны 0, а все child снова будут removed и add на сцену.

  2. Когда пользователь переходит в другую сцену (таймер должен перестать работать, а текущее значение таймера необходимо сохранить в переменной) и когда пользователь снова возвращается в эту сцену, этот таймер должен работать следующим образом: previous value + counting the time.

  3. Когда я открываю его в мобильном телефоне, скорость его работы отличается от скорости ПК. Есть ли какое-то решение, чтобы закодировать его, чтобы он был совместим с синхронизацией собственного устройства? это функция, которую я написал:

    function timerAtoB(firstColor: int): void {
       lineColor = firstColor;
       //GRID;
       //Path A to B
       var PathAB: Grid;
       PathAB = new Grid(4, 35, 20, 22, canvas, lineColor);
       this.addChild(PathAB);
    }
    

Эта функция предназначена для соединения размера A с размером B. Связь между A и B будет построена с использованием класса Grid - этот класс должен найти кратчайший путь между A и B и установить связь между ними (что я не хочу проходить через это больше, чем это, поскольку он сложнее).

и я вызываю эту функцию с некоторой задержкой:

delayCallFunctions(1000, timerAtoB, wireColor);

Когда я запускаю его на своем мобильном телефоне, эта задержка будет работать правильно, но не в правильное время. Например, я написал 1000ms означает выполнение функции примерно через 1 sec, но в моем мобильном телефоне для выполнения функции требуется больше 1 sec.

Заранее благодарим за ваше время и помощь.


person mazName    schedule 16.06.2017    source источник
comment
Для второй проблемы я использовал класс переменных. Каждый раз, когда этот пользователь покидает сцену, текущее значение будет посылаться классу, а когда пользователь вернется в ту же сцену, класс передаст переменную в сцену. но, очевидно, он не работает должным образом!   -  person mazName    schedule 16.06.2017
comment
У тебя нет слушателя на твоем таймере   -  person BadFeelingAboutThis    schedule 16.06.2017


Ответы (1)


Вероятно, ваша проблема заключается в том, что каждый раз, когда вы повторно посещаете фрейм, содержащий этот опубликованный вами код, создается еще один экземпляр таймера.

var nCount: Number = 0;
var myTimer: Timer = new Timer(50, nCount);

Этот код сбрасывает ваш nCount на 0 и создает новый таймер каждый раз, когда вы посещаете фрейм.

Скорее всего, вы хотите:

//just declare the vars
var nCount:Number;
var myTimer:Timer;

//assign them a value only if they are empty
if(nCount === NaN) nCount = 0;
if(!myTimer) myTimer = new Timer(50, 0);

Вы также захотите делать myTimer.stop(); каждый раз, когда покидаете сцену.

Разница в скорости между вашим настольным / мобильным компьютером, вероятно, связана с производительностью, поскольку задержка в 50 мс - это не так много времени для выполнения каких-либо сложных вычислений, и мобильное устройство может не успевать и, следовательно, будет работать медленнее. подумайте об увеличении этой задержки до 100 мс или даже 250 мс, чтобы посмотреть, поможет ли это. Кроме того, избавьтесь от formattedTime var, так как он не нужен, и будет ли таймер работать лучше без него.

Подсказка: вам не нужна nCount var, так как сам таймер имеет свойство currentCount, которое отслеживает, сколько раз он тикал с момента последнего timer.reset()

person BadFeelingAboutThis    schedule 16.06.2017
comment
Спасибо за подсказки и хороший ответ. Вторая проблема решена, но первая и третья проблемы остаются, даже если я назначаю таймеру «1000 мс». - person mazName; 17.06.2017
comment
Если вам нужна помощь по пункту 1 вашего вопроса, отредактируйте свой вопрос, включив в него соответствующий код (независимо от того, какой код срабатывает ваша кнопка сброса). Для пункта 3, может быть, объясните немного больше о том, что происходит и как вы определяете, есть ли разница в скорости? - person BadFeelingAboutThis; 19.06.2017
comment
Я отредактировал вопрос и дал больше информации по своим вопросам. Пожалуйста, дайте мне знать, если потребуется дополнительная информация. - person mazName; 21.06.2017