Как уменьшить частоту тиков таймера winforms? - PullRequest
0 голосов
/ 05 декабря 2018

Я пишу простую игру, в которой анимация выполняется с использованием таймера.Скорость таймера изначально установлена ​​на 200, но за каждые 1000 очков, которые получает игрок, я хочу, чтобы таймер работал быстрее, поэтому я подумал, что могу просто уменьшить интервал

if (score > 0 && score % 1000 == 0)
     {
         GameTimer.Interval -= 20;
     }

Но когда я наберу 1000 баллов, winform вылетаетсо следующей ошибкой в ​​строке, указанной выше:

System.ArgumentOutOfRangeException: 'Значение' 0 'не является допустимым значением для интервала.Интервал должен быть больше 0. Имя параметра: Интервал

Как правильно уменьшить частоту интервала?(или заставить мою программу работать быстрее любым другим способом)

Редактировать: приведенный выше фрагмент кода был помещен в событие тика, что вызвало выполнение оператора if несколько раз

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Частота тиков не может быть меньше или равна 0.

Вы можете просто добавить оператор if, чтобы проверить, что:

if (GameTimer.Interval <= 20) {
    GameTimer.Interval = 1;
} else {
    GameTimer.Interval -= 20;
}

Однако это означает, что интервал таймера будетдостичь предела после достижения определенного балла.Кроме того, экран не может обновляться так быстро (1000 раз в секунду).Вероятно, вам следует поддерживать частоту кадров 30 кадров в секунду.

Поэтому, чтобы анимация появлялась быстрее, выполняйте большую часть анимации в каждую секунду.Например, чтобы переместить что-то на 1000 пикселей вправо, не перемещайте это на 1 пиксель каждые 1/1000 секунды.Вместо этого перемещайте его на 50 пикселей каждую 1/20 секунды.

Из вашего комментария:

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

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

Чтобы исправить это, вы можете поместить код в установщик счета.

0 голосов
/ 05 декабря 2018

интервал таймера будет уменьшаться до тех пор, пока он не достигнет нуля "0", что является вашей ошибкой

вы можете использовать

int x = (score/1000)*20  
if (x < 200)
    GameTimer.Interval = (200 - x);
0 голосов
/ 05 декабря 2018

Ошибка указывает, что значение интервала достигло нуля.

Таким образом, эти строки выполняются несколько раз, пока не произойдет сбой:

 if (score > 0 && score % 1000 == 0)
 {
     GameTimer.Interval -= 20;
 }

И это потому, что условие выполняется в каждоминтервал после того, как таймер пройдет условие один раз.

Определите свою логику вне кода таймера, и все будет в порядке:

 void Score(int value){

      score += value;
      if (score <= 0) return;

      if(score % 1000 == 0)
      {
          GameTimer.Interval -= 20;
          //if(GameTimer.Interval <= 0) I suppose level is already finished...
      }
 }

отредактировано

mjwills указал на эту проблемучто интервал все еще может достигнуть нуля.Таким образом, вы должны написать свой код таким образом, чтобы устранить этот риск.

нелинейное сокращение имеет больше смысла в этом случае:

 void Score(int value){

      score += value;
      if (score <= 0) return;

      if(score % 1000 == 0)
      {
          GameTimer.Interval *= .9f;
          if(GameTimer.Interval <= 0) GameTimer.Interval = 1;
      }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...