2013-05-23 7 views
0

Я делаю программу, в которой таймер1 должен активировать другой таймер2, а затем останавливаться, в таймере2 снова активировать таймер1 и останавливать таймер2, и поэтому он продолжается, а затем у меня есть текстовый журнал, где он напишите прогресс вниз. И вот проблема: сначала начинается с 2 таймера Timer1, а затем 2 таймера 2, затем он умножается на 2, поэтому его 4 следующий раз тогда 8, затем 16 и так далее, и я просто хочу, чтобы это было 1 таймер1, чем 1 таймер2 то его начинается снова, я не вижу, что случилось.Timer Отметьте больше, чем 1 раз сразу

private void buttonStart_Click(object sender, EventArgs e) 
{ 
    buttonStart.Enabled = false; 
    buttonStop.Enabled = true; 

    timer1.Tick += new EventHandler(timer1_Tick); 
    timer1.Interval = (1000);    
    timer1.Enabled = true;      
    timer1.Start(); 

} 

private void buttonStop_Click(object sender, EventArgs e) 
{ 
    buttonStart.Enabled = true; 
    buttonStop.Enabled = false; 

    timer1.Stop(); 
    timer2.Stop(); 
} 

private void LogWrite(string txt) 
{ 
    textBoxCombatLog.AppendText(txt + Environment.NewLine); 
    textBoxCombatLog.SelectionStart = textBoxCombatLog.Text.Length; 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    LogWrite(TimeDate + "player hit"); 

    timer1.Stop(); 

    timer2.Tick += new EventHandler(timer2_Tick); 
    timer2.Interval = (1000); 
    timer2.Enabled = true; 
    timer2.Start(); 


} 

private void timer2_Tick(object sender, EventArgs e) 
{ 
    LogWrite(TimeDate + "mob hit"); 

    timer2.Stop(); 

    timer1.Tick += new EventHandler(timer1_Tick); 
    timer1.Interval = (1000); 
    timer1.Enabled = true; 
    timer1.Start(); 

} 
+1

Вы должны делать только эти строки timer2.Tick + = новый EventHandler (timer2_Tick); один раз и только один раз (так что удалите их с кнопки, нажмите на загрузку/инициализацию вашей формы. – rene

+0

Возможно, вам захочется взглянуть на [это] (http://stackoverflow.com/questions/16605726/how-to-make -timer-keep-runing-while-loop-wait-for-another-time-result/16606866 # 16606866) ответят на аналогичный вопрос о том, почему обычные таймеры обычно не используются в играх. – nvoigt

+0

Если Interval() для обоих всегда будет одним и тем же, а затем просто используйте один таймер и переключите логическое значение, чтобы указать, кто в данный момент атакует ... –

ответ

2

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

Мой совет вам добавить эти строки в конструктор и удалить эти строки из других функций:

timer1.Tick += new EventHandler(timer1_Tick); 
timer1.Interval = (1000);    
timer1.Enabled = true; 

timer2.Tick += new EventHandler(timer2_Tick); 
timer2.Interval = (1000); 
timer2.Enabled = true; 

Если вы сделаете это, ваши таймеры будут называть всегда только один раз функцию за тик.

+0

это сделало любопытную работу, но есть еще одна проблема tho, она все еще записывает 2 строки все время вместо 1 , я на этот раз поставил Eventhandler в кнопку «Пуск». Не понимаю, почему это так. –

+0

, потому что вы где-то добавили слушателя к функции 'timer1_tick' или' timer2_tick' на 'timer1.tick' или' timer2.tick', поэтому проверьте свой код и убедитесь, что у вас есть только один прослушиватель событий для r каждая функция. – Epsil0neR

+0

Что значит «слушатель»? –

1

Я уверен, что это то, что @ Epsil0neR означает ...

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 

     timer1.Tick += new EventHandler(timer1_Tick); 
     timer1.Interval = (1000); 
     timer1.Enabled = false; 

     timer2.Tick += new EventHandler(timer2_Tick); 
     timer2.Interval = (1000); 
     timer2.Enabled = false; 
    } 

    private void buttonStart_Click(object sender, EventArgs e) 
    { 
     buttonStart.Enabled = false; 
     buttonStop.Enabled = true; 

     timer1.Start(); 
    } 

    private void buttonStop_Click(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     timer2.Stop(); 

     buttonStart.Enabled = true; 
     buttonStop.Enabled = false; 
    } 

    private void LogWrite(string txt) 
    { 
     textBoxCombatLog.AppendText(txt + Environment.NewLine); 
     textBoxCombatLog.SelectionStart = textBoxCombatLog.Text.Length; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     timer1.Stop(); 

     LogWrite(TimeDate + "player hit"); 

     timer2.Start(); 
    } 

    private void timer2_Tick(object sender, EventArgs e) 
    { 
     timer2.Stop(); 

     LogWrite(TimeDate + "mob hit"); 

     timer1.Start(); 
    } 

    private string TimeDate 
    { 
     get { return DateTime.Now.ToString("HH:mm:ss") + ": "; } 
    } 

} 
+0

это именно то, что я имею в виду, thx для написания этой стены кода. – Epsil0neR

+0

Я вижу, но это все еще не изменило проблему, из-за которой он набирал «толчок хита» 2 раза подряд, а «игрок попал» 2 раза подряд, а не просто в одно время –

+0

Я могу опубликовать снимок экрана, чтобы описать, что я имею в виду –

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