0


我实际上正在编写一个 pacman(C# 控制台),我想知道如何每秒移动我的 ghost,但我也希望能够随时移动我的 pacman。

无论吃豆人做什么,我都希望我的幽灵每秒钟都在移动,我应该能够随时移动吃豆人,而幽灵只需要每秒钟移动一次。

我想我必须使用 Thread 系统,所以我想知道您是否知道我必须如何进行以及线程如何工作,找不到有关该系统的任何信息:s。

4

3 回答 3

2

您不需要为每个幻影使用不同的线程。这一切都可以使用游戏循环在一个线程上完成

从编程的角度来看,任何游戏的核心组件都是游戏循环。游戏循环允许游戏流畅地运行,而不管用户的输入或缺乏输入。

大多数传统的软件程序都会响应用户输入并且没有它什么都不做。例如,文字处理器将文字和文本格式化为用户类型。如果用户不键入任何内容,文字处理器将不执行任何操作。有些功能可能需要很长时间才能完成,但所有功能都是由用户告诉程序做某事而启动的。

另一方面,无论用户的输入如何,游戏都必须继续运行。游戏循环允许这样做。一个高度简化的游戏循环,在伪代码中,可能看起来像这样:

   而(用户不退出)
     检查用户输入
     运行人工智能
     移动敌人
     解决冲突
     绘制图形
     播放声音
   结束时

游戏循环可能会随着游戏开发的进行而改进和修改,但大多数游戏都是基于这个基本思想。

遵循这种模式,您的游戏将更容易编写。

于 2013-05-08T17:15:28.223 回答
0

终于找到了我需要的东西:
C#中的线程和线程同步

于 2013-05-10T04:48:12.853 回答
0

你可能会因为阻塞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());
            }
        }
    }
}
于 2013-05-08T19:30:21.070 回答