#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. Да! Это решило проблему! Таймер останавливается, как только я этого захочу, прямо сейчас. Большое спасибо 🙂