ユーザーからの入力を取得するためのスレッドと、いくつかのシーンをアニメーション化するための別のスレッドの 2 つのスレッドで動作する単純なゲームを作成しようとしています。Enter キーを押さなくても文字を取得できますが、ユーザーがキーを押すまでアニメーション スレッドでブロックされます。キーボードのノンブロッキングから文字を取得する方法を知っている人はいますか?
2 に答える
少数の特定のキーを調べたい場合はGetAsyncKeyState()
、状態をポーリングするために使用できます。それ以外の場合は、メッセージ ループを実装WM_CHAR
し、アプリケーションでメッセージを処理する必要があります。
環境が必要な win32 関数をまだサポートしていない場合は、次のようなライブラリを使用して生の win32 関数にアクセスできます。
RAA - win32-api @ raa.ruby-lang.org
の関連リンクを次に示しますGetAsyncKeyState()
。
GetAsyncKeyState() @ MSDN
Virtual-Key Codes @ MSDN (GetAsyncKeyState およびその他の関数の値として使用)
メッセージ ループを使用する場合は、アプリケーションのウィンドウをホストするスレッドと同じスレッドに実装する必要があります。簡単な説明はここにあります:
Microsoft Windows のメッセージ ループ @ ウィキペディア
そのリンクに示されているように、メッセージ ループにはそれほど多くはありません。フレームワークには、グラフィックを含むウィンドウをホストするために、バックグラウンドで既に実行されているものがある場合があります。この場合、入力用の 2 番目のスレッドは必要ありません。ただし、そのホスト ウィンドウのウィンドウ メッセージをインターセプトして処理する必要があります。
自分でメッセージ ループを実装する必要がある場合は、wikipedia リンクのスケルトンを使用できます。このDispatchMessage
呼び出しは、ウィンドウ メッセージを適切なウィンドウ ハンドラーに送信します。Ruby フレームワークで一致する Windows メッセージのスタブまたはハンドラーを探し、WM_CHAR
そこから処理する必要があります。
DispatchMessage @ MSDN
WM_CHAR @ MSDN
キーが押された/押されたときに知りたい場合は、WM_KEYUP および WM_KEYDOWN メッセージを処理する必要があります。
WM_KEYUP @ MSDN
WM_KEYDOWN @ MSDN
また、GetAsyncKeyState()
別のアプリケーションがフォアグラウンドにある場合でも、呼び出してキー状態を返すことができることに注意してください。ウィンドウがプライマリ フォアグラウンド ウィンドウであるときにキーの状態のみを気にする場合は、別のウィンドウがアクティブなときにアプリケーションがチェックを無視または延期するように、WM_ACTIVATE
およびWM_SETFOCUS
/メッセージを処理します。WM_KILLFOCUS
これにはrubygameを使用しました。これにより、最小限のコードで関数をキーボード イベントにアタッチすることができます。 RubySDLとGoSuは同様の機能を提供します。
ゲーム関連の宝石でそのルートに行きたくない場合は、IOオブジェクトでデータが利用可能かどうかを確認する方法についてこれを見てください。これは、キーボードをポーリングするために使用できます。