2011-08-23 79 views
6

我正在制作一个二十一点游戏,其中一张牌需要在最后一张牌之后第二秒显示。 我已经使用它并看到Thread.Sleep - 但人们说定时器会更好。 我如何用定时器来做到这一点? 谢谢!用定时器延迟xna游戏

+2

你不应该使用(*特别*不要使用'Thread.Sleep')。当调用Game.Update时累加'gameTime.ElapsedGameTime'。 –

+1

@Andrew Russel +1 Thread.Sleep在99.9%的情况下应该避免使用它! – MattDavey

+0

你能举个例子吗? – Tom

回答

10
float WaitTimeToShowCard = 0; 


public void Update(GameTime gametime) 
{ 

    if (HasToShowCard()) 
    { 
     WaitTimeToShowCard = 1; 
    } 

    if (WaitTimeToShowCard >0) 
    { 
     WaitTimeToShowCard -= (float) gametime.Elapsed.TotalSeconds; 
     if (WaitTimeToShowCard <=0) 
     { 
      WaitTimeToShowCard = 0; 
      ShowCard(); 
     } 
    } 
} 

public class Timer 
{ 
    public Action Trigger; 
    public float Interval; 
    float Elapsed; 

    Timer() {} 

    public void Update(float Seconds) 
    { 
     Elapsed+= Seconds; 
     if (Elapsed>= Interval) 
     { 
      Trigger.Invoke(); 
      Destroy(); 
     } 
    } 

    public void Destroy() 
    { 
     TimerManager.Remove(this); 
    } 

    public static void Create(float Interval, Action Trigger) 
    { 
     Timer Timer = new Timer() { Interval = Interval, Trigger = Trigger } 
     TimerManager.Add(this); 
    } 
} 


public class TimerManager : GameComponent 
{ 
    List<Timer> ToRemove = new List<Timer>(); 
    List<Timer> Timers = new List<Timer>(); 

    public static TimerManager Instance; 

    public static void Add(Timer Timer) { Instance.Timers.Add(Timer); } 
    public static void Remove(Timer Timer) { Instance.ToRemove.Add(Timer); } 

    public void Update(GameTime gametime) 
    { 
     foreach (Timer timer in ToRemove) Timers.Remove(timer); 
     ToRemove.Clear(); 
     foreach (Timer timer in Timers) timer.Update((float) gametime.Elapsed.Totalseconds); 

    } 
} 


public class Game 
{ 
    public void Initialize() { Components.Add(new TimerManager(this);} 
    public Update() 
    { 
      if (HasToShowCard(out card)) 
      { 
       Timer.Create(1,() => card.Show()); 
      } 
    } 
} 
+0

非常感谢:) – Tom

0
using System.Timers; 
. 
. 
.  
public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 
    Timer t = new Timer(1000); 
    //The number is the interval in miliseconds 

    public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content"; 
     t.Elapsed += new ElapsedEventHandler(t_Elapsed); 
     t.Enabled = true; 
    } 

    void t_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     //code 
    } 

. 
. 
. 
} 

我复制了一些代码位,显示添加的代码的定位... 此外,键入“t.Elapsed + =”按TAB键两次后,创建事件处理程序。 如果您想停止计时器,请将“启用”属性设置为false。 ( 'T' 是一个糟糕的变量名)

+0

System.Timers.Timer是否在紧凑框架中可用?可能值得让OP知道他是通过使用它来牺牲Xbox和手机支持的。 – MattDavey

+0

嗯..我不知道它是不是..但我不能评论他的原始问题以通知他。 (如果你看到这个,想要Xbox或手机支持,请使用Andrew Russel的建议 – NBcode

+0

尽管OP要求定时器,但它确实不是游戏开发中的最佳解决方案。 – TJHeuvel