我正试图弄清楚如何每秒减少一个整数。一切都表明了很多很多行的东西,并且以通用的,可互换的方式解释事物。到目前为止,我已将其设置为......
public int timer = 180;
public Text timerCounterText;
// Use this for initialization
void Start ()
{
timerCounterText.text = "Time Left: " + timer.ToString();
}
现在我不知道如何让整数每秒减少一次,我不想要任何更好的方法来做到这一点,除非我没有办法从这里做到这一点。
我只想要一个简单的,尽可能少的方法将我的计时器整数每秒减少1,因为我这样做的方式是我理解如何做到目前为止的唯一方法。
很抱歉,如果这个问题太多了,我只想要一个我能理解的剧本,而不仅仅是一个效果最好的剧本,因为我只是一名学生,而不是制作产品。
答案 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
。