0


私は実際にパックマン(C#コンソール)をコーディングしています。毎秒ゴーストを移動する方法を知りたいのですが、いつでもパックマンを移動できるようにしたいと考えています。

パックマンが何をするにしても、ゴーストが毎秒動き続けてほしいと思います。いつでも好きなときにパックマンを動かすことができ、ゴーストは毎秒移動する必要があります。

私はスレッドシステムを使用する必要があると思いますので、どのように進めなければならないか、スレッドがどのように機能するかを知っているかどうかを知りたいのですが、それに関する情報が見つかりません:s.

4

3 に答える 3

2

ゴーストごとに異なるスレッドを使用する必要はありません。これはすべて、ゲーム ループを使用して 1 つのスレッドで実行できます。

プログラミングの観点から、ゲームの中心的なコンポーネントはゲームループです。ゲームループにより、ユーザーの入力の有無に関係なく、ゲームをスムーズに実行できます。

ほとんどの従来のソフトウェア プログラムは、ユーザー入力に応答し、それなしでは何もしません。たとえば、ワード プロセッサは、ユーザーの入力に応じて単語やテキストをフォーマットします。ユーザーが何も入力しない場合、ワープロは何もしません。一部の機能は完了するまでに時間がかかる場合がありますが、すべての機能は、ユーザーがプログラムに何かを実行するように指示することによって開始されます。

一方、ゲームは、ユーザーの入力に関係なく動作し続ける必要があります。ゲームループはこれを可能にします。擬似コードで非常に単純化されたゲーム ループは、次のようになります。

   while( ユーザーは終了しません )
     ユーザー入力をチェックする
     AIを実行する
     敵を動かす
     衝突を解決する
     グラフィックを描く
     音を鳴らす
   終了する

ゲーム ループは、ゲームの開発が進むにつれて改良および変更される可能性がありますが、ほとんどのゲームはこの基本的な考え方に基づいています。

そのパターンに従えば、ゲームを書くのがはるかに簡単になります。

于 2013-05-08T17:15:28.223 に答える
0

最後に私が必要なものを見つけました:
C#でのスレッドとスレッド同期

于 2013-05-10T04:48:12.853 に答える
0

Console.ReadKey()ブロックしているため、おそらく混乱しているでしょう...ユーザーがキーを押すのを待ってゲームループが動かなくなるのでしょうか? キューに既にキーストロークがある場合は、ReadKey() でキーストロークを取得するだけです。Console.KeyAvailableこれは、キーが既に存在する場合に true を返すで確認できます。このようにして、キーが押されていない場合、ゲームループはループし続けます...しかし、それをトラップして何かをすることができます. この簡単な例を試して、何が起こるか見てみましょう:

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 に答える