我实际上正在编写一个 pacman(C# 控制台),我想知道如何每秒移动我的 ghost,但我也希望能够随时移动我的 pacman。
无论吃豆人做什么,我都希望我的幽灵每秒钟都在移动,我应该能够随时移动吃豆人,而幽灵只需要每秒钟移动一次。
我想我必须使用 Thread 系统,所以我想知道您是否知道我必须如何进行以及线程如何工作,找不到有关该系统的任何信息:s。
我实际上正在编写一个 pacman(C# 控制台),我想知道如何每秒移动我的 ghost,但我也希望能够随时移动我的 pacman。
无论吃豆人做什么,我都希望我的幽灵每秒钟都在移动,我应该能够随时移动吃豆人,而幽灵只需要每秒钟移动一次。
我想我必须使用 Thread 系统,所以我想知道您是否知道我必须如何进行以及线程如何工作,找不到有关该系统的任何信息:s。
您不需要为每个幻影使用不同的线程。这一切都可以使用游戏循环在一个线程上完成
从编程的角度来看,任何游戏的核心组件都是游戏循环。游戏循环允许游戏流畅地运行,而不管用户的输入或缺乏输入。
大多数传统的软件程序都会响应用户输入并且没有它什么都不做。例如,文字处理器将文字和文本格式化为用户类型。如果用户不键入任何内容,文字处理器将不执行任何操作。有些功能可能需要很长时间才能完成,但所有功能都是由用户告诉程序做某事而启动的。
另一方面,无论用户的输入如何,游戏都必须继续运行。游戏循环允许这样做。一个高度简化的游戏循环,在伪代码中,可能看起来像这样:
而(用户不退出) 检查用户输入 运行人工智能 移动敌人 解决冲突 绘制图形 播放声音 结束时游戏循环可能会随着游戏开发的进行而改进和修改,但大多数游戏都是基于这个基本思想。
遵循这种模式,您的游戏将更容易编写。
终于找到了我需要的东西:
C#中的线程和线程同步
你可能会因为阻塞Console.ReadKey()
而感到困惑......所以你的游戏循环会卡在等待用户按下一个键对吗?如果队列中已经有一个,您所做的只是使用 ReadKey() 获取击键。如果密钥已经存在,可以使用 which 返回 true 来检查。这样,如果没有按下任何键,游戏循环就会一直循环......但你仍然可以捕获它并用它做一些事情。试试这个简单的例子,看看会发生什么:Console.KeyAvailable
class Program
{
static void Main(string[] args)
{
while (true)
{
System.Threading.Thread.Sleep(250);
Console.Write(".");
if (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey(true); // read key without displaying it
Console.WriteLine("");
Console.WriteLine("Key Pressed: " + key.KeyChar.ToString());
}
}
}
}