2011-08-23 11 views
6

के साथ एक xna गेम विलंब करें मैं एक ब्लैकजैक गेम बना रहा हूं जहां कार्ड को अंतिम कार्ड के बाद दूसरा दिखाया जाना चाहिए। मैंने इसे गुमराह किया है और थ्रेड देखा है। सो जाओ - लेकिन लोगों ने कहा कि टाइमर इसके लिए बेहतर होगा। मैं टाइमर के साथ ऐसा कैसे कर सकता हूं? धन्यवाद!टाइमर

+2

आप उपयोग नहीं करना चाहिए या तो (* विशेष रूप से * का प्रयोग नहीं करते 'Thread.Sleep')। 'Game.Update' को कॉल करते समय' gameTime.ElapsedGameTime' जमा करें। –

+1

@ एंड्रयू रसेल +1 थ्रेड। 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 + =" टैब दबाएं बाद। यदि आप टाइमर को रोकना चाहते हैं, तो "सक्षम" संपत्ति को गलत पर सेट करें। ('टी' एक बुरा चर नाम है)

+0

सिस्टम है। टिमर्स.इमर कॉम्पैक्ट फ्रेमवर्क में उपलब्ध है? ओपी को यह बताते हुए लायक हो सकता है कि वह इसका उपयोग करके Xbox और फोन समर्थन का त्याग कर रहा है .. – MattDavey

+0

हम्म .. मुझे नहीं पता कि यह है .. लेकिन मैं उसे सूचित करने के लिए अपने मूल प्रश्न पर टिप्पणी नहीं कर सकता। (यदि आप इसे देखते हैं, और Xbox या फोन समर्थन चाहते हैं, तो एंड्रयू रसेल – NBcode

+0

द्वारा सुझाव का उपयोग करें, ओपी ने टाइमर के लिए पूछा, यह वास्तव में गेम विकास में सबसे अच्छा समाधान नहीं है। – TJHeuvel