3

私は現在、c# でローグライクに取り組んでいます。世界、プレーヤーなどはコンソール内でレンダリングされます。しかし、コンソールに変更が多すぎると、遅れます。これを回避するために、プレーヤーが押しているキーが押されなくなるまでプログラムを待機させようとしています。誰でもこれを作る方法について考えがありますか? 悪い、のようなものがないことConsole.ReadKeyUp()

while(Console.KeyAvailable){
}

動作しないようです...

ここにちょっとしたコードがあります:

public void move(){
            if(!MainClass.loading){
                switch(Console.ReadKey().Key){
                    case ConsoleKey.NumPad8:
                        //walk up
                        break;
                    case ConsoleKey.NumPad4:
                        //walk left
                        break;
                    case ConsoleKey.NumPad6:
                        //walk right
                        break;
                    case ConsoleKey.NumPad2:
                        //walk down
                        break;
                    case ConsoleKey.NumPad7:
                        //walk left up
                        break;
                    case ConsoleKey.NumPad9:
                        //walk right up
                        break;
                    case ConsoleKey.NumPad1:
                        //walk left down
                        break;
                    case ConsoleKey.NumPad3:
                        //walk right down
                        break;
                    case ConsoleKey.NumPad5:
                        //eat
                        break;
                }

            }

        }

そして、これがどのように見えるかです:

ここに画像の説明を入力

4

1 に答える 1

2

このアプリケーションをイベント ドリブン形式 (メッセージ ループを含む隠しウィンドウなど) にリファクタリングすることなく、WinAPI で利用可能なさまざまな機能を掘り下げるのが最善の策です。このようなものがうまくいくかもしれません:

 [DllImport("user32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 static extern bool GetKeyboardState(byte [] lpKeyState);

この関数を使用して、完全なキーボードの状態を照会できます。これは、キーボードの状態を含む 256 バイトの配列を返します。詳細およびいくつかの例 については、こちらを参照してください。

たとえば、使用して、問題のキーの下位を返すConsole.ReadKey()までブロックすることもできます。GetKeyState()0

 [DllImport("user32.dll")]
 static extern short GetKeyState(VirtualKeyStates nVirtKey);

詳細と例については、こちらを参照してください。

MSDN: GetKeyState ; GetKeyboardState

于 2013-04-08T15:39:39.547 に答える