C# таймеры для движущихся объектов

У меня есть 4 собаки, которые участвуют в гонках, мне нужно перемещать их по форме, но они не двигаются постепенно, они начинают с линии старта и сразу же телепортируются к линии финиша, не двигаясь между ними. С каждым тактом таймера их location.X увеличивается.

Мне нужен один таймер или 4? В настоящее время у меня есть один, и его интервал установлен на 400.

Это соответствующий код:

private void btnRace_Click(object sender, EventArgs e)
{   
    btnBet.Enabled = false;
    timer1.Stop();
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{   while (!isWon)
    {
        for (i = 0; i < Dogs.Length; i++) // there are four dogs
        {                    
            if (Dogs[i].Run()) // Run() returns true if full racetrack is covered by this dog
            {
                Winner = i + 1;
                isWon = true;

                MessageBox.Show("We have a winner! Dog #" + Winner);

                break;
            }
        }
}

И в классе собак:

public bool Run()
{               
    Distance = 10 + Randomizer.Next(1, 4);
    p = this.myPictureBox.Location;
    p.X += Distance ;            
    this.myPictureBox.Location = p;

    //return true if I won the game
    if (p.X >= raceTrackLength)
    {
        return true ;
    }
    else
    {
        return false ;
    }
}

Собаки, кажется, делают только один шаг, а затем сразу же появляются на финишной прямой. Что я делаю неправильно?


person user961627    schedule 05.10.2012    source источник


Ответы (2)


Удалите цикл While из метода timer1_Tick. Этот метод запускается каждые 400 мс, но в вашем случае при первом запуске он ждет, пока выиграет одна собака.

Также вы должны остановить таймер после победы одной из собак.

private void timer1_Tick(object sender, EventArgs e)
{   
    for (i = 0; i < Dogs.Length; i++) // there are four dogs
    {                    
        if (Dogs[i].Run()) // Run() returns true if full racetrack is covered by this dog
        {
            Winner = i + 1;
            isWon = true;
            timer1.Stop();
            MessageBox.Show("We have a winner! Dog #" + Winner);
            break;
        }
    }
}
person Dmitry Dovgopoly    schedule 05.10.2012

Ваш таймер срабатывает только один раз и застревает в этом цикле;

  while (!isWon)
  {
  }

Удалите цикл и дайте таймеру сделать свою работу

Добавьте в конце

 if (isWon) timer1.Stop();
person IvoTops    schedule 05.10.2012