2011-08-23 24 views
6

Estoy haciendo un juego de blackjack donde se debe mostrar una carta un segundo después de la última carta. Lo busqué en Google y vi a Thread.Sleep, pero la gente dijo que los temporizadores serían mejores para eso. ¿Cómo puedo hacer esto con temporizadores? Gracias!Retraso en un juego xna con temporizadores

+2

No use ya sea (* especial * no utilice 'Thread.Sleep'). Acumula 'gameTime.ElapsedGameTime' cuando se invoca' Game.Update'. –

+1

@Andrew Russel +1 Thread.Sleep debe evitarse en el 99.9% de los casos en los que podría estar tentado de usarlo. – MattDavey

+0

¿Puedes dar un ejemplo? – Tom

Respuesta

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

¡Gracias! Muy apreciado :) – 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 
    } 

. 
. 
. 
} 

copié algunos de los bits de código para mostrar el posicionamiento del código añadido ... Además, después de escribir "t.Elapsed + =" presione la tecla TAB dos veces, para crear el controlador de eventos. Si desea detener el temporizador, establezca la propiedad "Activado" en falso. ('t' es un mal nombre de variable)

+0

¿System.Timers.Timer está disponible en el marco compacto? Podría valer la pena que el OP sepa que está sacrificando Xbox y soporte telefónico usándolo ... – MattDavey

+0

Hmm ... No sé si es así ... pero no puedo comentar su pregunta original para notificarlo. (Si ves esto, y quieres soporte por Xbox o por teléfono, usa la sugerencia de Andrew Russel – NBcode

+0

Aunque el OP pidió temporizadores, realmente no es la mejor solución para el desarrollo de juegos. – TJHeuvel