2

C または Java (どちらか簡単な方) を使用してジョイスティック入力をキャプチャする必要があります。

同様の質問に対する回答がありますが、それらはすべて C++ または C# を使用しています。

プログラムは、ジョイスティックを傾ける方向と量を取得するだけで済みます。私は Windows7 を使用しているため、ここで説明されているように、おそらく winmm.dll を使用する必要があります。
誰かがCまたはJavaでそうする方法を説明していただければ幸いです。

4

5 に答える 5

2

両方の言語用の既製のライブラリがあります。より重要な質問は、使用しなければならない言語、または主にどの言語を好むかです。そのような機能を Java プログラムに追加するためだけに C コードを追加することは必ずしも意味がありません。同様に、ジョイスティック入力を取得するためだけに、C から Java を呼び出したくないでしょう。

「Java ジョイスティック」の Google での最初のヒットはこれでした。まだ試していません。

C++ コード (そしてほとんどの場合 C# も) については、純粋な Windows API コードであると仮定すると、同じコードを C で使用できるはずです (C にもあるため)。したがって、これらの適応に問題はないはずです。

編集:あなたがリンクした答えについて:Cでこのソリューションを1:1で使用できるはずです(Javaでは、本質的に同じことをするコードを書く必要があります)。しかし、自分ですべてを宣言する代わりに、#include <windows.h>(C で) 準備ができている必要があります。

于 2012-01-28T10:04:09.680 に答える
1

C# ソリューションは、まさに純粋な Windows API コードです。Cでは、あなた#include <windows.h>の代わりに. 次の例は、それを明確にする必要があります。[DllImport("winmm.dll")] winmm.lib

void printJoystickData()
{
   // The captured data will be written to the following struct:
   //typedef struct joyinfo_tag {
   //   UINT wXpos;
   //   UINT wYpos;
   //   UINT wZpos;
   //   UINT wButtons;
   //} JOYINFO,*PJOYINFO,*LPJOYINFO;
   JOYINFO joystickInfo;

   // The ID of the joystick you are using. If there is only one joystick use JOYSTICKID1.
   UINT joystickId = JOYSTICKID1;

   MMRESULT errorCode = joyGetPos(joystickId, &joystickInfo);
   switch(errorCode)
   {
       case JOYERR_NOERROR: // No error. joystickInfo now contains contains the captured data.
       {
           printf("The X position (left/right tilt) is %u\n", joystickInfo.wXpos);
           printf("The Y position (up/down tilt) is %u\n", joystickInfo.wYpos);
           printf("The Z position (usually the throttle) is %u\n", joystickInfo.wZpos);
           // These values range from 0 to 65536. 32768 is the centre position.

           // Test button 1. You can do the same for JOY_BUTTON2, JOY_BUTTON3 etc.
           // wButtons is a UNINT that is the OR of all pressed button flags.
           if(joystickInfo.wButtons & JOY_BUTTON1)
               printf("Button 1 was pressed.");

           break;
       }
       case JOYERR_PARMS: fprintf(stderr, "Invalid parameters to joyGetPos."); break;
       case JOYERR_NOCANDO: fprintf(stderr, " Failed to capture joystick input."); break;
       case JOYERR_UNPLUGGED: fprintf(stderr, "The joystick identified by joystickId isn't plugged in."); break;
       case MMSYSERR_NODRIVER: fprintf(stderr, "No (active) joystick driver available."); break;
   }
}

Simple Directmedia Layer ライブラリ (blahdiblah が提案) も有望に見えますが、私が必要としていたことについては、上記のコードの方が簡単だと思います。

Java の場合、Mario が提案するCentral Nexus Device APIを使用します。ダウンロードにはドキュメントが含まれています。

于 2012-01-28T22:44:47.357 に答える
1

純粋な C ソリューションには、 Simple Directmedia Layer ライブラリをお勧めします。このライブラリは快適に使用でき、ドキュメントとコード例は優れています。

SDL_Joystick *joy;

// Initialize the joystick subsystem
SDL_InitSubSystem(SDL_INIT_JOYSTICK);

// Check for joystick
if(SDL_NumJoysticks()>0){
  // Open joystick
  joy=SDL_JoystickOpen(0);
  ...
于 2012-01-28T11:03:40.977 に答える
0

リンク先のサンプルは、実際にはオブジェクト指向を使用していません。つまり、C に簡単に移植できます。

C はstructC# と同じ (スタックに割り当てられる) をサポートするため、基本的にはコピー アンド ペーストです。

つまずく可能性があるのは[DllImport]属性です。この属性の目的は、マネージ C# コード内からアンマネージ DLL を p/invoke (プラットフォーム呼び出し) することです。ここではextern、Windows API にアクセスするために使用します。

于 2012-01-28T10:05:19.760 に答える