![](/img/trans.png)
[英]How can i make that when the player is getting close to a waypoint he will slow down and then will speed up again?
[英]C# timer I can speed up but not slow down
我有一個計時器事件設置,我想通過從文本框中讀取一個數字來更改計時器事件發生的頻率。 如果該框為“ 10”,然后單擊“更新”按鈕,則事件將每10ms觸發一次;然后,如果更改為“ 100”並單擊,則事件將每100ms觸發一次,依此類推。
但是,當我運行程序時,我可以加快事件頻率(例如100ms至10ms),但不能降低事件頻率(例如10ms至100ms)。 這是我單擊時更改計時器的代碼片段:
private void TimerButton_Click(object sender, EventArgs e)
{
getTime = ImgTimeInterval.Text;
bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
label2.Text = isNumeric.ToString();
if (isNumeric)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = false;
timer.Interval = timerMS;
timer.Elapsed += new ElapsedEventHandler(timerEvent);
timer.AutoReset = true;
timer.Enabled = true;
}
}
public void timerEvent(object source, System.Timers.ElapsedEventArgs e)
{
label1.Text = counter.ToString();
counter = (counter + 1) % 100;
}
如果有人知道我在做什么錯,將不勝感激。
此代碼的問題是,每次單擊按鈕時,您都會創建一個新的Timer
。 嘗試在方法之外創建計時器。 您認為它只會運行得更快,而是多個計時器觸發了timerEvent
private System.Timers.Timer _timer;
private void CreateTimer()
{
_timer = new System.Timers.Timer();
_timer.Enabled = false;
_timer.Interval = 100; // default
_timer.Elapsed += new ElapsedEventHandler(timerEvent);
_timer.AutoReset = true;
_timer.Enabled = true;
}
private void TimerButton_Click(object sender, EventArgs e)
{
bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
label2.Text = isNumeric.ToString();
if (isNumeric)
{
_timer.Interval = timerMS;
}
}
public void timerEvent(object source, System.Timers.ElapsedEventArgs e)
{
label1.Text = counter.ToString();
counter = (counter + 1) % 100;
}
確保CreateTimer
被稱為在構造函數/ formload。 您現在也可以在另一個按鈕事件中停止計時器。 使用_timer.Enabled = false;
您總是在創建一個新計時器,而從不停止舊計時器。 當您將其從100更改為10時,您的100毫秒計時器仍然每100毫秒觸發一次,因此每100毫秒兩個計時器幾乎同時觸發。
您需要“記住”舊計時器,以便將其停止。 或者,更好的是,只有一個定時器可以更改間隔。
private System.Timers.Timer timer = new System.Timers.Timer();
public Form1()
{
timer.Enabled = false;
timer.AutoReset = true;
timer.Elapsed += timerEvent;
}
private void TimerButton_Click(object sender, EventArgs e)
{
getTime = ImgTimeInterval.Text;
bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
label2.Text = isNumeric.ToString();
if (isNumeric)
{
timer.Interval = timerMS;
timer.Enabled = true;
}
}
好吧,基本問題是您每次都在構建一個新的。 設置一個私人計時器:
private System.Timers.Timer _timer = new System.Timers.Timer();
然后在單擊按鈕時對其進行修復:
if (isNumeric)
{
_timer.Stop();
_timer.Interval = timerMS;
_timer.Start();
}
然后在.ctor
,執行以下操作:
_timer.Elapsed += new ElapsedEventHandler(timerEvent);
現在,只有一個計時器,您可以在用戶更改文本框中的值時對其進行修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.