2013-04-10 101 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

相关问题