2015-03-05 1 views
0

Предполагается, что это простая игра, в которой вы теряете 1 жизнь каждый раз, когда принимаете больше, чем время, разрешенное для каждого вопроса, на который вы отвечаете. Я искал код для настройки своего таймера, нашел несколько способов сделать это и в итоге использовал тот, который приведен ниже.Таймер тикает два раза в секунду, а затем трижды, когда я его повторно использую (я никогда не меняю интервал).

Сначала я заметил timer_Tick() пробегов дважды каждую секунду, а не только один раз. Поэтому мне пришлось увеличить ElapsedTime по 0.5f вместо 1f для правильного истекшего времени. Он отлично работает, пока не перезагрузите таймер (когда я загружаю новый вопрос). Когда я это делаю, timer_Tick() пробегает три раз в секунду вместо двух .. Это означает, что счетчик секунд уменьшается на 1.5f вместо 1f каждую секунду. Я хотел бы знать, что вызывает это и как я могу это исправить. Заранее спасибо.

public void Start_timer(float Interval) 
{ 
    ElapsedTime = 0f; 
    timer.Tick += timer_Tick; 
    timer.Interval = TimeSpan.FromSeconds(Interval); 
    bool enabled = timer.IsEnabled; 
    timer.Start(); 
} 

void timer_Tick(object sender, object e) 
{ 
    ElapsedTime += 0.5f; //I had to set this to 0.5f to get the correct reading as timer_Tick runs 2 times per second.. 
    TimeT.Text = "Time: " + Convert.ToString(QTime - ElapsedTime); 
    if (ElapsedTime >= QTime && Lives == 0){ 
     timer.Stop(); 
     AnswerTB.IsEnabled = false; 
     //GameOver 
    } 
    else if (ElapsedTime >= QTime && Lives != 0) 
    { 
     ElapsedTime = 0f; 
     Lives--; 
     LivesT.Text = "Lives: " + Convert.ToString(Lives); 
     timer.Stop(); 
     LoadQuestion(); //This includes a Start_timer(1) call and I never change the 1 second interval. 
    } 
} 
+5

Каждый раз, когда вы запускаете таймер, вы добавляете дополнительное событие по этой строке: 'timer.Tick + = timer_Tick;', поэтому в первый раз, когда он будет работать нормально, во второй раз, когда вы вызываете метод, у вас будет два подписанных события и и так далее - я полагаю, это проблема. Укажите событие и интервал только при создании таймера. – Romasz

+0

Что происходит, когда вы отлаживаете код ... – MethodMan

+0

@Romasz Я довольно новичок в C#, но я вижу, что вы, вероятно, правы, я сейчас попытаюсь его исправить. Благодарю. –

ответ

1

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

timer.Tick += timer_Tick; 

часть кода, в котором вы создаете таймер. Затем вы сможете остановить и запустить таймер без нескольких событий.

Смежные вопросы