質問

Windows 上で非常にうまく動作する MSVC++ を使用して FPS ゲームを作成しました。しかし、今は移植可能にしようとしているので (少なくとも Linux バージョンと Windows バージョンを作成したい)、IDE を Code::Blocks に、フレームワークを wxWidgets に変更することにしました。ただし、仮想キーコードとスキャンコードはシステムによって異なるようです。

以前、仮想キーコードは同じオペレーティングシステムでも異なるかもしれませんが、異なるコンピューター(キャラクターを制御できないことについてのバグレポートを受け取りました(numlock状態、笑、冗談ではありません)。 Virtkeyコードの代わりにscancodesを使用するコード)(編集:wxWidgets では、テンキーの virtkey コードとスキャン コードの両方が、numlock の状態に応じて異なる値になります。

wxWidgets では、wxKeyEvent::GetRawKeyCode と、以前に WM_KEYDOWN の lParam から取得したコードが異なるようです。また、Linux (ubuntu) では GetRawKeyCode からまったく異なるスキャン コードも取得します。

すべてのキーを押して、どのようなコードが表示されるかを確認することで、独自のスキャン コード テーブルを作成できますが、唯一の問題は、私のラップトップで ubuntu を実行することです。ラップトップにはフル キーボードがありません...ただし、コントロール設定を機能させるにはそれらすべてが必要です。

そこで質問:同じキー (より正確には同じ位置にあるキー) に対して同じコードを取得するための標準的かつクロスプラットフォームな方法はありますか?(少なくとも Windows と Linux では)

役に立ちましたか?

解決

まだ検討していない場合は、 SDL を使用できる場合があります。

>

他のヒント

これは FPS なので、使用している低レベルのグラフィックス ツールキットが大きな違いを生みます (wxWidgets で 3D グラフィックスを記述していないことを前提としています)。OpenGL を使用している場合は、次のことを確認しましたか? 過食症 できる?

グルグルキーボード機能 そして グルトスペシャルファンク と組み合わせ glutGetModifiers クロスプラットフォームのキーボード コードには十分である可能性があり、GLUT は他の入力デバイスにも使用できます。

しかし正直に言うと、これが wxWidgets とどのような関係があるのか​​、まだわかりません。

私の意見では、ペースの速い3DゲームをコーディングするためにwxWidgetsを使用するのは完全に間違っていると思います。 " hardcore"ゲーム開発では、エディターやコンバーターなどのサポートツールを開発するために使用する必要があります。

SDL を使用する方法です。それは非常に基本的なように思えるかもしれませんが、SDLの不浄な神に小さな子供を犠牲にし始めると、 SDL_imageのようなもの(多数の画像ファイル形式の読み取りに最適-SDLを使用してJPEGなどの読み取りのみを行う場合)または SDL_mixer (基本的なオーディオの読み取りと再生に必要な唯一のソリューション-OGG、WAVなど)。

だから、SDLに勝るものはありません。 SDL_gfxの使用を開始すると、2Dグラフィックスのサポートも有効です。 SDLは最初は基本的に見えるかもしれませんが、その周りに構築されたすべての追加ライブラリを数え、その周りにいくつかのラッパーをコーディングすると、SDLが最低限必要なものと高度な使いやすさの完璧なバランスを確認できます。

SDLが非常に優れていると思うので、SDLのサポートを喜んでいたします。

ここで見ているものを誤解しているかもしれませんが、生のキーコードが返されたはハードウェア、OS、構成、プラットフォームの違いをもたらすため、 キーイベントによって返される仮想キーコード。

編集: wxWidgets が正しく処理しない場合がある(疑わしい)。 numlockキーの問題は、「強制」です。生のスキャンコードを使用して、この問題を(不十分に)回避する必要があります。

その場合は、行ったことを捨てる必要はありませんが、 SDL を追加すると入力だけのために、 SDL_keysym を返す呼び出しがあります。 「ハードウェアスキャンコードを返すだけで(「修正」については何もできません)、Unicode文字と仮想シンボルにマップすることもできます。うまくいけば、彼らの呼び出しにはこのnumlock修飾子の問題はありません。

SDLを使用したくない場合は、 SFML-シンプルで高速なマルチメディアライブラリ。 マルチプラットフォームであり、本当に簡単に使用できます。たとえば、チュートリアルセクションから:

bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

入力は

const sf::Input& Input = App.GetInput();

SFMLはSDLですが、SDLよりも使用が好きなので、高速で移植可能なコードを作成するために使用する傾向があります。

scroll top