2014-11-02 234 views
4

即使我在C#中有一些經驗,這是我在C#中的第一場遊戲。我正在嘗試設置遊戲的最小骨架。我聽說Tick Event對於創建主遊戲循環是一個不好的行爲。C#簡單的2D遊戲 - 製作基本的遊戲循環

這是什麼,我想實現的主要概念:

Program.cs的

//Program.cs calls the Game Form. 
Application.Run(new Game()); 

Game.cs現在

public partial class Game : Form 
{ 
    int TotalFramesCount = 0; 
    int TotalTimeElapsedInSeconds = 0; 

    public Game() 
    { 
     InitializeComponent(); 
     GameStart(); 
    } 

    public void GameStart() 
    { 
     GameInitialize(); 

     while(true) 
     {     
      GameUpdate();     
      TotalFramesCount++; 
      CalculateTotalTimeElapsedInSeconds(); 
      //Have a label to display FPS    
      label1.text = TotalFramesCount/TotalTimeElapsedInSeconds; 
     } 
    } 

    private void GameInitialize() 
    { 
     //Initializes variables to create the First frame. 
    } 

    private void GameUpdate() 
    { 
     // Creates the Next frame by making changes to the Previous frame 
     // depending on users inputs.   
    }  

    private void CalculateTotalTimeElapsedInSeconds() 
    { 
     // Calculates total time elapsed since program started 
     // so that i can calculate the FPS.    
    } 

} 

,這不會因爲while(true)循環會阻止Game Form初始化。我找到了一些解決方案,通過使用System.Threading.Thread.Sleep(10);Application.DoEvents();,但我沒有設法使其工作。

解釋我爲什麼要在這裏實現這個代碼在使用上面的代碼的例子
可以說,我想我的遊戲做到以下幾點:
順利動一100x100 Black colored Square從點(x1,y1)(x2,y2)並向後循環,並在上述代碼的label1中顯示FPS。考慮到上面的代碼,我可能會使用TotalTimeElapsedInSeconds變量來設置移動的速度與Time相關,而不是Frames,因爲Frames在每臺機器上都會有所不同。

// Example of fake code that moves a sqare on x axis with 20 pixels per second speed 
private void GameUpdate() 
{ 
int speed = 20; 
MySquare.X = speed * TotalTimeElapsedInSeconds; 
} 

的原因,雖然我的使用while(true)循環的是,我將得到每臺機器上最好的FPS我可以。

  • 我該如何在實際代碼上實現我的想法? (只是基本骨架是我正在尋找)
  • 我怎麼能設置一個最大的,可以說500 FPS使代碼「輕」運行?而不是嘗試生產儘可能多的幀,我懷疑會過度使用CPU(?)
+0

你應該分開在另一個線程中更新你的UI的代碼。檢查此問題的更多信息:http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c – 2014-11-02 21:08:38

+0

@FilipposKarapetis我正在尋找一些明顯更具體的比這個回覆,因爲我從來不需要爲我的程序創建一個線程到目前爲止,因此我沒有如何編碼的經驗。 – dimitris93 2014-11-02 21:14:08

+0

你應該看看圖形引擎的管道(任何圖形引擎都會足夠好),看看他們如何設法實現這種事情。你應該有一個管理這個管道的異步進程。看看「任務」類。這對於創建異步任務非常有用。 – 2014-11-02 21:19:14

回答

6

幀率與平滑度無關。即使你完成500幀/秒的動作也會波濤洶涌或更糟。訣竅是與您的顯示器刷新率同步。所以對於一臺60Hz的顯示器,你需要60幀/秒不多不少。你不能通過在C#中使用循環來做到這一點。您需要DirectX或XNA。這些框架可以使您的繪圖與顯示器的垂直掃描同步。

+0

60FPS如何超過500? – dimitris93 2014-11-02 21:27:54

+0

無論如何,我不認爲這個回覆解決我的問題,它的值得張貼作爲一個有效的答案。我不明白爲什麼你會打擾這張貼作爲我的問題的答案 – dimitris93 2014-11-02 21:37:17

+1

@ Shhiro你說*平穩地移動一個100x100的黑色方塊...... *我回答說你不能這樣做。你需要directX。這就是答案。 – 2014-11-02 21:39:07