即使我在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(?)
你應該分開在另一個線程中更新你的UI的代碼。檢查此問題的更多信息:http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c – 2014-11-02 21:08:38
@FilipposKarapetis我正在尋找一些明顯更具體的比這個回覆,因爲我從來不需要爲我的程序創建一個線程到目前爲止,因此我沒有如何編碼的經驗。 – dimitris93 2014-11-02 21:14:08
你應該看看圖形引擎的管道(任何圖形引擎都會足夠好),看看他們如何設法實現這種事情。你應該有一個管理這個管道的異步進程。看看「任務」類。這對於創建異步任務非常有用。 – 2014-11-02 21:19:14