Если то, что я вывел относительно того пользовательского класса Timer, которое вы используете, является правильным, то оно:
- имеет конструктор, который принимает делегат, который должен вызываться каждый интервал
- забирает у вас объект и передает его вам каждый раз, когда он помечается
- не уверен, для чего нужна цифра 1, избегайте магических c чисел в вашем коде
- , предполагая, что 1000 - это интервал в миллисекундах. Опять же, избегайте использования в коде простых чисел без комментариев или константной переменной с именем
- работает синхронно вне своего конструктора, даже не будучи запущенным
, поскольку он предоставляет один и тот же объект возвращаясь к вам все время, вам нужно будет немного изменить свой код, чтобы передаваемый объект не являлся типом значения; если вы этого не сделаете, вы уменьшите int в CountTimer, но ничего не изменится, потому что вы не будете изменять данные, на которые указывает исходная ссылка. Вы, вероятно, не можете просто добавить ключевое слово ref, потому что пользовательский таймер не будет запрограммирован на вызов с ним. Итак, давайте настроим его так, чтобы вместо этого мы передавали массив int:
public static void CountTimer(object time)
{
var x = (int[])time;
x[0]--;
Console.WriteLine($"TimeLeft: {x[0]}");
//Thread.Sleep(1000); you don't need to sleep for a second; it will make your timer count every two seconds!
}
public static void Main(string[] args)
{
int[] numberOfSeconds = new int[1];
numberOfSeconds[0] = input();
Timer t = new Timer(CountTimer, numberOfSeconds, 1, 1000);
Thread.Sleep(1000);
t.Dispose();
}
Как уже отмечалось, все это зависит от вашего класса Timer, поскольку существует некоторый пользовательский, который принимает имя метода для вызова каждые x миллисекунд и продолжает снабжать его тем же объектом. Нигде не уменьшалось время, которое у вас есть, поэтому просто повторялось 30 раз. Мы не можем просто привести time
к вашему значению int и уменьшить его, потому что это не приведет к изменению исходного int, удерживаемого Timer. Если вместо этого мы сделаем так, чтобы объект, удерживаемый Таймером, представлял собой массив int, то сам объект массива никогда не изменится, но значение, сохраненное в первом слоте, может быть уменьшено
FWIW, я думаю, что это довольно сложный способ просто создать таймер обратного отсчета, и это также блокирует пользователя от каких-либо других действий. Если это подходит для вашей игры, тогда хорошо, но если вы ожидаете, что они сделают ход в течение 30 секунд, я думаю, у вас возникнут проблемы с этим классом Timer, который вы используете