Таймер обратного отсчета для игры на время

У меня есть игра, в которой цель состоит в том, чтобы подстрелить как можно больше (случайно сгенерированных) вражеских кораблей, но я хочу добавить 30-секундный таймер, обратный отсчет до нуля, чтобы добавить ограничение по времени, но я не уверен, как бы я это сделал Это? У меня есть несколько AS-файлов со всем моим кодом для создания кораблей разного размера с разной скоростью и так далее, поэтому, если нужны фрагменты кода, я добавлю их.

Я пытался сделать это так, и это не сработало:

var gameTime:Number = 30;
var gameTimer:Timer;
static var timeText:TextField = new TextField();

timeText = new TextField();
timeText.x = 560;
timeText.y = 0;
timeText.text = gameTime.toString();
addChild(timeText);

gameTimer = new Timer(30000, gameTime);
gameTimer.addEventListener(TimerEvent.TIMER, gameTimeCount);
gameTimer.start();

function gameTimeCount(e:TimerEvent):void
{
    gameTime--;
    timeText.text = gameTime.toString();
}

Но счет остается на уровне 30 и не уменьшается.

Что у меня есть сейчас:


person David    schedule 25.04.2013    source источник
comment
У вас установлен таймер на 30000 миллисекунд за тик. Это 30 секунд. вы хотите, чтобы это было 1000, что составляет 1 секунду. Вот как часто вы должны обновляться.   -  person prototypical    schedule 26.04.2013
comment
вы не обновляете свой timeHeader. Я прокомментировал в обработчике updateTime //update your user interface as needed. Попробуйте добавить эту строку в этот обработчик -- timeHeader.text = "Time : " + String(gameTime); -- У меня это отлично работает.   -  person prototypical    schedule 26.04.2013
comment
Я просто вырезал/вставил код, который у вас есть выше, и он работает безупречно. Насколько широка ваша страница? Возможно ли, что у вас есть это текстовое поле timeText, расположенное за пределами сцены? Какова ширина вашей сцены?   -  person prototypical    schedule 26.04.2013
comment
Я просмотрел ваш файл, и это была проблема с тем, как вы устанавливали форматы шрифтов для этого текстового поля, из-за чего текст исчезал. Счетчик работает нормально. Используйте timeText.defaultFormat = scoreFormat; ДО того, как вы изначально установите текст. Пожалуйста, примите мой ответ, так как он отлично работает. Если у вас есть дополнительные проблемы с форматированием, просто откройте новый вопрос по этой теме.   -  person prototypical    schedule 27.04.2013


Ответы (1)


Вот один из способов сделать это:

// in class variable declarations
public var gameTime:int;
public var levelDuration:int;

// where you want to start it 
levelDuration = 30;
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
{
    // your class variable tracking each second, 
    gameTime--;
    //update your user interface as needed

}

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

    // do whatever you need to do for game over
}

Этот код отлично работает, вам нужно сделать так, как предлагает комментарий к функции updateTime:

//update your user interface as needed

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

function updateTime(e:TimerEvent):void
{
    trace(gameTime);
    // your class variable tracking each second, 
    gameTime--;
    //update your user interface as needed
    timeHeader.text = "Time : " + String(gameTime);

}

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

person prototypical    schedule 25.04.2013
comment
Я отредактировал это для обратного отсчета. Не уверен, как еще я могу вам помочь, это сработает. - person prototypical; 26.04.2013
comment
Обновленный ответ для использования gameTime, как у вас. Я неправильно понял и подумал, что вы хотите отслеживать, сколько секунд истекло. - person prototypical; 26.04.2013
comment
Хм, я пробовал это, но он просто запускал таймер с 0, а не с 30? - person David; 26.04.2013
comment
Я изменил его, вы получили последнюю версию? Вы устанавливаете для gameTime значение продолжительности уровня в начале? - person prototypical; 26.04.2013
comment
Посмотрите на код в моем ответе — gameTime = levelDuration; и строку перед ней, levelDuration = 30; Если у вас есть обе эти строки, как можно установить для gameTime значение 0? - person prototypical; 26.04.2013
comment
Вам нужно будет опубликовать свой текущий код или что-то в этом роде, вам что-то не хватает в моем ответе. - person prototypical; 26.04.2013
comment
Я использовал ваш обновленный код, и он отлично работает, но вы не обновляете свой пользовательский интерфейс. Я обновил свой ответ, чтобы выделить то, что вы не замечаете. - person prototypical; 26.04.2013
comment
Я вставил это, и теперь происходит то, что он показывает Time: 30 в верхнем углу, но затем, через секунду или две, 30 исчезает, но в окне вывода во Flash отображается обратный отсчет времени (показывается как 30, 29, 28 и т.д. отдельными строками) - person David; 26.04.2013
comment
Вы можете опубликовать именно то, что у вас есть сейчас. Я использовал то, что вы опубликовали, но с тех пор удалил и добавил одну строку, и это сработало отлично. Трассировка просто показывает вам, что содержит переменная. Вы, должно быть, скопировали что-то неправильно - person prototypical; 26.04.2013
comment
если вы хотите отправить мне электронное письмо по адресу [email protected], мы можем сделать это быстро. Я думаю, что вы либо неправильно копируете, либо неправильно понимаете какой-то аспект. Код, опубликованный в этом ответе, работает безупречно, если у вас есть текстовое поле timeHeader. Какие бы проблемы у вас ни возникли с этим кодом, они связаны с фактическим обновлением текста в вашем текстовом поле. - person prototypical; 26.04.2013
comment
Написал вам ([email protected]) - person David; 26.04.2013
comment
код отлично работает для меня, какова ширина вашей сцены? единственное, о чем я могу думать, это то, что у вас есть это текстовое поле, расположенное за сценой. - person prototypical; 26.04.2013