Таймер Actionscript 3 не идентифицирован, как мне это исправить?

#actionscript-3 #flash #timer

#actionscript-3 #flash #таймер

Вопрос:

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

 public function memory():void
{
      levelDuration = 10;
      gameTime = levelDuration;
      var gameTimer:Timer = new Timer(1000,levelDuration);
      gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
      gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired);
      gameTimer.start();
}

function updateTime(e:TimerEvent):void // what happens when the time runs out
    {
        // your class variable tracking each second, 
        gameTime--;
        //update your user interface as needed
        timeText.text = "Tijd : "   String(gameTime); //gameTime is defined before the public function memory

    }

function timeExpired(e:TimerEvent):void
    {
        var gameTimer:Timer = e.target as Timer;
        gameTimer.removeEventListener(TimerEvent.TIMER, updateTime);
        gameTimer.removeEventListener(TimerEvent.TIMER, timeExpired);
        finalScore = score;
        musicchannel.stop();
        gameTimer.stop();

        MovieClip(root).gotoAndStop("gameover");
    }
  

Теперь это работает нормально. Таймер отсчитывает время, и когда оно истекает, вы попадаете на экран управления игрой. Однако, когда вы заканчиваете игру ДО истечения времени, таймер не останавливается. Он вернет вас к экрану перехода к игре, когда решит, что он закончился, даже если вы запустили новую игру.

Я пытался исправить это, поместив GameTimer.stop() в другие функции, которые выводят вас на экран управления игрой, но затем возникла другая проблема. Это произошло при попытке остановить таймер в других функциях, таких как эта (кнопка остановки во время воспроизведения):

 function stopplaying(event:MouseEvent){
    gameTimer.stop();
    finalScore = score;
    musicchannel.stop();
    MovieClip(root).gotoAndStop("introduction");
}
  

Это выдаст мне ошибку компиляции 1120: доступ к неопределенному свойству GameTimer.
Я понимаю, что на таймер игры обычно можно влиять только внутри функции, если эта функция прослушивает TimerEvent, но я не вижу никаких вариантов сделать это каким-либо другим способом.

Я пытался сделать GameTimer общедоступной переменной, но это не позволит мне сделать это в основной функции памяти. Кроме того, когда я пытаюсь определить его как общедоступную переменную из функции, но внутри класса, таймер все равно будет отсчитывать время. Но когда он истекает, он просто выдает случайное большое число взамен и не переходит на экран управления игрой.

Я надеюсь, что объяснение моей проблемы не было слишком расплывчатым и что вы можете мне с этим помочь. Это школьный проект, и он должен появиться довольно скоро! Кроме того, я не могу разобраться в этом самостоятельно, используя только Интернет: (Несколько попыток только ухудшили ситуацию, я боюсь облажаться теперь, когда я зашел так далеко.

Ответ №1:

Вероятно, вы делали это правильно, объявив его как общедоступную переменную .. но где вы его объявили?

В AS (все версии) у вас есть область действия функции. Это означает, что если вы объявляете свою переменную внутри функции, эта переменная «существует» (доступна) только внутри этой функции. Проверьте, где вы объявляете свою переменную:

 public function memory():void
{
      levelDuration = 10;
      gameTime = levelDuration;
      var gameTimer:Timer = new Timer(1000,levelDuration); // <-
      gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
      gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired);
      gameTimer.start();
}
  

Это означает, что ваша переменная «GameTimer» является локальной для функции memory () . Вы не сможете использовать свою переменную где-либо за пределами этой функции, потому что она существует только внутри memory() . Чтобы решить эту проблему, вы должны переместить его за пределы функции:

 private var gameTimer:Timer;

public function memory():void
{
      levelDuration = 10;
      gameTime = levelDuration;
      gameTimer = new Timer(1000,levelDuration);
      gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
      gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired);
      gameTimer.start();
}
  

Это решит все ваши проблемы.

Комментарии:

1. Да! Это решило проблему! Таймер останавливается, как только я этого захочу, прямо сейчас. Большое спасибо 🙂