2013-04-10 103 views
5

「機器人遊戲」是我開發的第一款基礎遊戲。洋紅色的'#'字符是敵人,它應該在這張地圖上有一個隨機的移動,但是它的隨機移動速度太快了,我嘗試使用線程,但是它影響了所有角色的速度。現在,我需要每隔100毫秒調用一次「Enemy」方法。如何在C#中每隔幾秒調用一次特定的方法?

機器人遊戲圖片: enter image description here

+0

您是否嘗試過這個.. http://stackoverflow.com/questions/10954859/run-function-every-second-visual-c-sharp – 2013-04-10 12:30:26

+0

或這個問題http://stackoverflow.com/questions/2897787/whats-the-most-efficient-way-to-call-a-method-every-20-seconds?rq=1 – 2013-04-10 12:31:12

+0

使用['Timer'] (http://msdn.microsoft.com/en-gb/library/system.timers.timer.aspx)。這是一個基本的[教程](http://www.dotnetperls.com/timer)。 – 2013-04-10 12:29:48

回答

14

您可以使用System.Timer。但是,應該預先警告,這些定時器可能不如您想要的那麼準確。你永遠不會在Windows等非實時操作系統上獲得完全準確的定時器,但如果你想要更好的定時器準確性,Multimedia timer可能會有所幫助。

從MSDN

System.Timer例如:

public class Timer1 
{ 
    private static System.Timers.Timer aTimer; 

    public static void Main() 
    { 
     // Normally, the timer is declared at the class level, 
     // so that it stays in scope as long as it is needed. 
     // If the timer is declared in a long-running method, 
     // KeepAlive must be used to prevent the JIT compiler 
     // from allowing aggressive garbage collection to occur 
     // before the method ends. You can experiment with this 
     // by commenting out the class-level declaration and 
     // uncommenting the declaration below; then uncomment 
     // the GC.KeepAlive(aTimer) at the end of the method. 
     //System.Timers.Timer aTimer; 

     // Create a timer with a ten second interval. 
     aTimer = new System.Timers.Timer(10000); 

     // Hook up the Elapsed event for the timer. 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

     // Set the Interval to 2 seconds (2000 milliseconds). 
     aTimer.Interval = 2000; 
     aTimer.Enabled = true; 

     Console.WriteLine("Press the Enter key to exit the program."); 
     Console.ReadLine(); 

     // If the timer is declared in a long-running method, use 
     // KeepAlive to prevent garbage collection from occurring 
     // before the method ends. 
     //GC.KeepAlive(aTimer); 
    } 

    // Specify what you want to happen when the Elapsed event is 
    // raised. 
    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); 
    } 
} 
+0

我想你可能已經忘記了autoreset = true?我錯了嗎? – Gaspa79 2016-10-11 16:25:24

+1

@ Gaspa79 Timer.AutoReset默認爲true https://msdn.microsoft.com/en-us/library/system.timers.timer.autoreset(v=vs.110).aspx – Kohanz 2016-10-13 02:44:36

+0

是的,你說得對。起初我沒用,因爲我使用了不同的Timer。謝謝=) – Gaspa79 2016-10-13 18:23:01

相關問題