为了挑战和获得教育,我目前正在尝试在控制台窗口中制作一个简单的游戏 。我这样使用非常原始的“锁定”帧率系统:
using System.Threading;
// ...
static private void Main(string[] args)
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
Timer timer = new Timer(Update);
timer.Change(0, GameSpeed);
autoEvent.WaitOne();
}
因此,计时器每隔GameSpeed
毫秒进行一次滴答,并调用方法Update()
。
到目前为止,我了解控制台窗口中输入的方式如下:
控制台应用程序具有一个“队列”,其中将任何键盘输入存储为元数据和一个ConsoleKey
枚举的实例。用户可以随时将其添加到此队列。如果用户按住,例如说A,它将在每个计算机框架上添加A。也就是说,计算机可以实际完成的最快数量,而不是我正在使用的锁定帧。
调用Console.Readkey()
将删除并返回此列表中的第一个元素。 Console.KeyAvailable
返回一个布尔值,指示列表是否为空。
如果GameSpeed
设置为大于400的任何值,则表示一切正常。下图显示了一些Console.WriteLine()
调试消息的结果,这些消息给出了使用以下代码在此锁定/自定义框架中检测到的键盘输入量:
int counter = 0;
while (Console.KeyAvailable) { counter++; Console.ReadKey(true); }
Console.WriteLine(counter);
我只使用A键。我握了一段时间,然后再次释放。 GameSpeed
设置为1000。正如预期的那样,前几帧的编号较低,因为我可能会开始将一半压入帧中,最后几帧也是如此,因为我可能会提前释放A。
Now, the exact same experiment but with a GameSpeed of only 200
如您所见,我用黄色标记了我开始按下的位置。它总是完美地获得第一帧。但是然后有一个,两个或三个帧,就好像没有输入任何信号,但是在这些帧之后就很好了,并且每帧获得大约7个输入。
我知道您不应该在控制台窗口中进行游戏。并非针对此类情况。但是,这并不能消除我可能能够解决的一些特定的,逻辑上的原因。因此,具体而言,问题是:任何人都可以提供一些有关为什么会发生这种情况的知识/想法吗?
如果需要计算机规格,请在评论中说出这些,然后我将其添加。
修改: 我想我已经找到了此错误的原因,这是Windows键盘重复延迟。虽然您可以在控制面板中更改此设置,但我在网上搜索并没有找到有关如何在c#应用程序中更改它的示例。然后问题归结为:如何更改Windows键盘重复延迟?