虽然我有一些c#的经验,但这是我在C#中的第一款游戏.我正在尝试建立游戏的最小骨架.我听说这Tick Event
是创建主游戏循环的糟糕方法.
这是我想要实现的主要概念:
Program.cs中
//Program.cs calls the Game Form.
Application.Run(new Game());
Run Code Online (Sandbox Code Playgroud)
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.
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这不起作用,因为while(true)
循环阻止游戏表单初始化.我找到了一些解决方案,通过使用System.Threading.Thread.Sleep(10);
或Application.DoEvents();
,但我没有设法让它工作.
要解释为什么我想要实现此验证码是一个例子使用上面的代码:
可以说,我想我的游戏做到以下几点:
平滑移动100x100 Black colored Square
从点(x1,y1)
到(x2,y2)
和向后,在一个循环,并在显示FPS label1
的上面的代码.考虑到上面的代码,我可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
我使用while(true)
循环的原因是我将获得每台机器上最好的FPS.
帧率与平滑度无关.即使你达到500帧/秒,运动也会变得不稳定或更糟.诀窍是与您的显示器刷新率同步.因此,对于60Hz的显示器,您需要60帧/秒而不是更少.你不能通过在C#中使用循环来做到这一点.您需要DirectX或XNA.这些框架可以使您的绘图与显示器的垂直扫描同步.