在c#中每秒减少一个整数

时间:2016-05-09 19:47:23

标签: c# timer integer int

我正试图弄清楚如何每秒减少一个整数。一切都表明了很多很多行的东西,并且以通用的,可互换的方式解释事物。到目前为止,我已将其设置为......

public int timer = 180;

public Text timerCounterText;

// Use this for initialization
void Start () 
{
    timerCounterText.text = "Time Left: " + timer.ToString();
}

现在我不知道如何让整数每秒减少一次,我不想要任何更好的方法来做到这一点,除非我没有办法从这里做到这一点。

我只想要一个简单的,尽可能少的方法将我的计时器整数每秒减少1,因为我这样做的方式是我理解如何做到目前为止的唯一方法。

很抱歉,如果这个问题太多了,我只想要一个我能理解的剧本,而不仅仅是一个效果最好的剧本,因为我只是一名学生,而不是制作产品。

5 个答案:

答案 0 :(得分:2)

我会建议一个单独的线程减少整数。我会用while循环来做这个

public event SecondHappenedEventHandler SecondHappened;
public delegate void SecondHappenedEventHandler(int second);
private int timer = 180; 

Public Void Start()
{
   timer = 180;
   Thread th = New Thread(New ThreadStart(Monitor);
   th.Start();
}
Private Void Monitor()
{
    While (timer != 0)
    {
         timer--;
         SecondHappened(timer);
         Thread.Sleep(1000); //This is milliseconds
    }
}

我的C#有点生疏,因为我最近在做VB工作。然后在该类中添加一个raiseevent,将整数传递给另一个类。所以你的另一个类会创建这个类的一个实例,并有一个事件让第二个传回并将它显示给最终用户。

public Text timerCounterText;
private TimerClass timer;

// Use this for initialization
void Start () 
{
    timer.Start
}

private void SecondHappened(int timerBack) 
{
   timerCounterText.text = "Time Left: " + timerBack.ToString();
}

答案 1 :(得分:1)

您可以使用.NET中为数不多的 Timer 类之一,以便让您的程序定期执行操作。通常有一种类型的计时器类适用于给定的情况,具体取决于您的应用程序类型(即Windows,控制台,服务等)

由于您是一个简单的例子,您可以查看System.Timers.Timer class

  

在设定的时间间隔后生成一个事件,并提供生成重复事件的选项。

它在控制台应用程序中的使用示例(P.S.如果您有Windows窗体应用程序,您可能不希望以这种方式使用它):

int _countDown = 180;

void Start() 
{
    var timer = new System.Timers.Timer(1000);   // Duration in milliseconds
    timer.Elapsed += async ( sender, e ) => await HandleTimer();
    timer.Start();   
}

void HandleTimer()
{
    _countDown--;
    Console.WriteLine("Time Left: {0}", _countDown);
}

答案 2 :(得分:1)

我在C#中经常使用计时器(很多 HELL - 我曾经为Sports Timing公司开发软件)

有几种方法可以做到这一点。有些比其他更准确。

最简单的 - 你正在看的方式就是这样:

在私人字段中设置总秒数

private int _secondsRemaining = 180; // 3 minutes
存储在私有字段中的

创建计时器

private System.Timers.Timer _countdownTimer;

创建一个StartTimer()方法。初始化_countdownTimer,并为计时器滴答时创建一个事件处理程序 - 当它“到达{{1}时会发生这种情况} / / fires /你想叫它的任何东西:

0

您需要从程序中的某个地方调用public void StartTimer() { _countdownTimer = new System.Timers.Timer(1000); // 1000 is the number of milliseconds // 1000ms = 1 second // Set a handler for when the timer "ticks" // The "Tick" event will be fired after 1 second (as we've set it) // The timer will loop, though and keep firing until we stop it // Or unless it is set to not automatically restart _countdownTimer.Tick += OnTimer_Tick; // Start the timer! _countdownTimer.Start(); } ,否则它将无法启动(显然) - 您可以从构造函数或按钮单击等执行此操作。

现在,在计时器滴答时创建一个事件处理程序。在此,StartTimer()值递减(从1开始);然后将其显示在_secondsRemaining标签中:

timerCounterText

这是制作倒数计时器的好方法。

缺点是,计时器每秒都不会发射,所以你可能会注意到一点漂移。

像我提到的那样;根据您需要的准确性, 我使用的其他方式。这取决于计时器的用途。

等待!还有更多!
// This is what gets fired when the timer "reaches 0" private void OnTimer_Tick(object sender, ElapsedEventArgs e) { _secondsRemaining--; // the same as "_secondsRemaining = secondsRemaining -1" timerCounterText.Text = string.Format("Time Remaining: {0} seconds", _secondsRemaining); } 到达_secondsRemaining以停止计时器时,也会有用(如果需要)。

创建0方法:

StopTimer()

当您想要通过单击按钮或其他任何方式手动停止计时器时,也可以使用此方法。

注意private void StopTimer() { if (_countdownTimer != null) { _countdownTimer.Tick -= OnTimer_Tick; _countdownTimer.Stop(); _countdownTimer.Dispose(); _countdownTimer = null; } } 检查及其中的代码。 null检查仅用于null未初始化等情况下的损坏限制,如果是,则停止程序爆炸。

_countdownTimer检查中的代码取消订阅if事件,停止计时器(显然),然后摆脱Tick - 您不需要;但你需要取消订阅&停止它...
如果我们再次调用_countdownTimer并初始化计时器,我们将添加另一个订阅StartTimer()事件 - 这将导致Tick方法每次调用两次OnTimer_Tick发射(依此类推)。

现在,在_countdownTimer处理程序中,我们减少OnTimer_Tick的值 - 检查之后,如果它小于或等于_secondsRemaining

0

如果检查private void OnTimer_Tick(object sender, ElapsedEventArgs e) { _secondsRemaining--; // decrement the _secondsRemaining as before if (_secondsRemaining <= 0) { StopTimer(); // This will stop the timer when the _secondsRemaining // reach 0 (or go below - it shouldn't) // You can also add in other stuff to happen at 0 // such as "Ending the game", as you described } // Display the time remaining, still - as before timerCounterText.Text = string.Format("Time Remaining: {0} seconds", _secondsRemaining); } ,您还可以为其他事情添加自己的方法 - 例如结束您的游戏,如您在问题中所述:)

我不再详述;我会让你搞清楚 - 但你甚至可以添加_secondsRemaining <= 0方法,这样你就可以再次启动计时器。

我希望这会有所帮助 - 任何问题或任何其他方式来做你需要的计时器;请问。

答案 3 :(得分:0)

使用减量运算符

如果您想在更新值之前减少它,可以使用decrement operator --

void Start () 
{
    // This will decrement the timer by 1
    timer--;
    // Output the value
    timerCounterText.Text = "Time Left: " + timer.ToString();
}

你也可以使用前缀表示法内联完成同样的事情,这会将之前的值更新为使用它:

void Start () 
{
    // Decrement your count and output it
    timerCounterText.Text = "Time Left: " + (--timer).ToString();
}

清理输出

您也可以使用String.Format()方法清理输出:

void Start () 
{
    // Decrement your count and output it
    timerCounterText.Text = String.Format("Time Left: {0}",--timer);
}

或者如果您使用的是C#,则可以利用String Interpolation

void Start () 
{
    // Decrement your count and output it
    timerCounterText.Text = $"Time Left: {--timer}";
}

进行计时器勾选

假设您使用的是Timer课程,则可以将其Tick事件设置为以特定时间间隔触发。这是您用来实际减少值并将其输出给用户的方法:

 // Define a timer
 Timer countDown = new Timer();
 // Sets the timer interval to 1 seconds.
 countDown.Interval = 1000;
 // Call the tick event every second
 countDown.Tick += new EventHandler(Tick);
 // Start your timer
 countDown.Start();

并且您的Tick事件将如下所示:

 private static void Tick(Object myObject,EventArgs myEventArgs)
 {
     // Check if your timer has run out
     if(countDown <= 0)
     {
          // Timer has run out, handle accordingly
          countDown.Stop();
     }
     else 
     {
          // Otherwise output and decrement
          String.Format("Time Left: {0}",--timer);
     }
 }

答案 4 :(得分:0)

如果您使用WF(Windows窗体),我建议使用Timer。创建一个计时器控件,将其间隔设置为1000(毫秒),并在启动函数中启用它:

void Start () 
{
    timer1.Enabled = true;
    timerCounterText.text = "Time Left: " + timer.ToString();
}

现在,双击计时器应创建timer_tick事件。像这样使用它:

void timer_Tick(object sender, EventArgs e)
{
    timerCounterText.text = "Time Left: " + (--timer).ToString();
}

然后它应该每秒将计时器减少1。当然,您应该检查它何时到达0,然后将timer1.Enabled设置为false