2011-08-23 18 views
6

Sto facendo un gioco di blackjack in cui una carta deve essere mostrata un secondo dopo l'ultima carta. L'ho cercato su google e ho visto Thread.Sleep, ma la gente ha detto che i timer sarebbero stati migliori per quello. Come posso farlo con i timer? Grazie!Ritarda un gioco xna con timer

+2

Si consiglia di non utilizzare (* soprattutto * non utilizzare 'Thread.Sleep'). Accumula il 'gameTime.ElapsedGameTime' quando viene chiamato' Game.Update'. –

+1

@Andrew Russel +1 Thread.Sleep dovrebbe essere evitato nel 99,9% dei casi in cui potresti essere tentato di usarlo! – MattDavey

+0

Puoi fare un esempio? – Tom

risposta

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(); 
     } 
    } 
} 

o

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

Grazie! – 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 
    } 

. 
. 
. 
} 

ho copiato alcuni dei bit di codice per mostrare il posizionamento del codice aggiunto ... Inoltre, dopo aver digitato "t.Elapsed + =" premere TAB due volte, per creare il gestore di eventi. Se si desidera interrompere il timer, impostare la proprietà "Abilitato" su falso. ('t' è un nome di variabile cattivo)

+0

System.Timers.Timer è disponibile nel framework compatto? Potrebbe valere la pena di lasciare che l'OP sappia che sta sacrificando Xbox e il supporto telefonico, usando il telefono .. – MattDavey

+0

Hmm .. Non so se lo è .. ma non posso commentare la sua domanda originale per avvisarlo. (Se vedi questo, e vuoi il supporto per Xbox o telefono, usa il suggerimento di Andrew Russel – NBcode

+0

Eventhough l'OP ha richiesto i timer, non è davvero la soluzione migliore per lo sviluppo del gioco – TJHeuvel

Problemi correlati