虽然我有一些c#的经验,但这是我在C#中的第一款游戏.我正在尝试建立游戏的最小骨架.我听说这Tick Event
是创建主游戏循环的糟糕方法.
这是我想要实现的主要概念:
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)
循环阻止游戏表单初始化.我找到了一些解决方案,通过使用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; }
我使用while(true)
循环的原因是我将获得每台机器上最好的FPS.
我怎么能在实际代码上实现我的想法?(只是基本的骨架是我正在寻找的)
我怎么能设置最大值,让500 FPS使代码"更轻"运行?而不是试图产生尽可能多的帧,我怀疑它会过度使用CPU(?)
γηράσκω δ' α.. 6
帧率与平滑度无关.即使你达到500帧/秒,运动也会变得不稳定或更糟.诀窍是与您的显示器刷新率同步.因此,对于60Hz的显示器,您需要60帧/秒而不是更少.你不能通过在C#中使用循环来做到这一点.您需要DirectX或XNA.这些框架可以使您的绘图与显示器的垂直扫描同步.
帧率与平滑度无关.即使你达到500帧/秒,运动也会变得不稳定或更糟.诀窍是与您的显示器刷新率同步.因此,对于60Hz的显示器,您需要60帧/秒而不是更少.你不能通过在C#中使用循环来做到这一点.您需要DirectX或XNA.这些框架可以使您的绘图与显示器的垂直扫描同步.