2012-01-28 10 views
3

CまたはJavaを使用してジョイスティック入力をキャプチャする必要があります。CまたはJavaでのジョイスティック入力のキャプチャ

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

プログラムは、ジョイスティックを傾ける方向と量を取得するだけです。 私はWindows7を使用していますので、おそらくwin32.dllを使用する必要があります(here)。
誰かがCやJavaでこれを行う方法を説明できるのであれば、私は感謝します。

+0

あなたが受け入れる答えの中で指し示されている関数がC関数であることに気が付きましたか? – Mat

答えて

2

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

"java joystick"についてGoogleで最初にヒットしたのはthis oneでした。まだ試していない。

C++コード(とC#もそうです)では、純粋なWindows APIコード(C言語でも同じです)を想定して、Cで同じコードを使用できるはずです。だから、あなたはこれらの問題に適応するべきではありません。

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

+0

ありがとう!私はいくつかのサンプルCコードを与えることによってこの答えを以下に展開しました。 – Richard

0

あなたは

Cがスタックに割り当てられた(C#などstructの同じC.

にそれを非常に簡単にポートをサポートできることを意味しますが、実際にはオブジェクト指向のものを使用していないためにリンクされているサンプル、 )、それは基本的にコピー・ペーストです。

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

1

純粋なCソリューションにはSimple Directmedia Layer libraryをお勧めします。ライブラリを使用するように快適で、そして彼らのdocumentation and code examplesは素晴らしいです:

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); 
    ... 
0

C# solutionが実際に純粋な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; 
    } 
} 

(blahdiblahによって提案された)Simple DirectMedia Layerをライブラリも有望に見えるが、私が行うために必要なもののために私は上記のコードは単純だと思います。

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

0

Gamepad.cおよびGamepad.hファイルについては、このURLを参照してください。 https://github.com/elanthis/gamepad

オープンジョイスティック構造定義

STATE.fd = open(STATE.device, O_RDWR|O_NONBLOCK); 

を使用して:

STATEは、構造物です。 // Gamepad.hファイルにあります

open returns -1が失敗しました。 正常に開くと、フラグ値(ジョイスティックの変数を宣言するときに定義されます)を設定します。

 (read(STATE[gamepad].fd, &je, sizeof(je)) > 0) 

構造体定義を使用して、ジョイスティックの入力を読む: JEは、今では更新されjoystick.h

JEである//構造オブジェクト です。 je.typeは、joystick.hヘッダーファイルに記載されている3つのうちの1つです。 ボタンが押された場合、je.numberは製造元が指定したボタン番号を示すintです。スティックが動かされた場合、je.numberは製造元の軸指定を示します。 マグニチュードはスティックの対応する変数に応じて割り当てられるje.valueにあります。

関連する問題