今回はJavaでWiiリモコンを使ってみたいと思います。
日本語文献が少ないうえに古いので、新しい文献として使っていただければなと思います。
注意
WiiリモコンをPCにBluetoothデバイスとしてペアリングしなければ動作しません。
必ずペアリングしてから実行してください。
環境
Windows 10 Home Edition
Eclipse 4.6
Java 1.8
ライブラリの調達
Mavenとかではなく普通のプロジェクトとして進めていきます。
WiiuseJ
https://code.google.com/archive/p/wiiusej/downloads のWiiusej 0.12a.zip
プロジェクトのセットアップ
リソースフォルダ内にWindowsならwiiuse.dllとWiiUseJ.dll、Macユーザならlibwiiuse.soとlibWiiuseJ.soを入れましょう。
ライブラリを弄る
とりあえずWiiリモコンを探す
Wiiリモコンが見つかった場合にはwiimote変数にWiiリモコンのオブジェクトが入ります。
example.java
import com.github.awvalenti.wiiusej.WiiusejNativeLibraryLoadingException;
import wiiusej.WiiUseApiManager;
import wiiusej.Wiimote;
public class MainAccessPoint {
private Wiimote wiimote;
private Wiimote[] wiimotes;
public MainAccessPoint() throws InterruptedException {
try {
System.out.println("Finding wiimotes...");
while(wiimotes == null) {
/*2019/8/5 ミスがありました。getWiimotes(1);ではなく、getWiimotes(1, true);でした。またWiiUseApiManagerへはstaticアクセスでした。*/
wiimotes = WiiUseApiManager.getWiimotes(1, true);
if(wiimotes != null && wiimotes.length > 0) {
wiimote = wiimotes[0];
System.out.println("Wiiリモコンが見つかりました。 Id: " + wiimote.getId());
break;
}
wiimotes = null;
continue;
}
} catch (WiiusejNativeLibraryLoadingException e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws InterruptedException {
MainAccessPoint main = new MainAccessPoint();
}
}
LEDを変えてみる
1番目の引数から左から順番にbooleanで指定します。
wiimote.setLeds(true, false, false, false);
Wiiリモコンにリスナを登録する
以下のリスナをwiimoteに登録します。
リスナ
Listener.java
import wiiusej.values.GForce;
import wiiusej.wiiusejevents.physicalevents.ExpansionEvent;
import wiiusej.wiiusejevents.physicalevents.IREvent;
import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent;
import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent;
import wiiusej.wiiusejevents.utils.WiimoteListener;
import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent;
import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent;
public class Listener implements WiimoteListener {
public Listener() {
}
// ボタン押下時に発火。どのボタンかはメソッド名でわかると思います。
@Override
public void onButtonsEvent(WiimoteButtonsEvent arg0) {
if(arg0.isButtonHomeJustPressed()) {
} else if(arg0.isButtonHomeJustReleased()) {
} else if(arg0.isButtonPlusJustPressed()) {
} else if(arg0.isButtonPlusJustReleased()) {
} else if(arg0.isButtonMinusJustPressed()) {
} else if(arg0.isButtonMinusJustReleased()) {
} else if(arg0.isButtonOneJustPressed()) {
} else if(arg0.isButtonOneJustReleased()) {
} else if(arg0.isButtonTwoJustPressed()) {
} else if(arg0.isButtonTwoJustReleased()) {
} else if(arg0.isButtonAJustPressed()) {
} else if(arg0.isButtonAJustReleased()) {
} else if(arg0.isButtonBJustPressed()) {
} else if(arg0.isButtonBJustReleased()) {
} else if(arg0.isButtonRightJustPressed()) {
} else if(arg0.isButtonRightJustReleased()) {
} else if(arg0.isButtonLeftJustPressed()) {
} else if(arg0.isButtonLeftJustReleased()) {
} else if(arg0.isButtonUpJustPressed()) {
} else if(arg0.isButtonUpJustReleased()) {
} else if(arg0.isButtonDownJustPressed()) {
} else if(arg0.isButtonDownJustReleased()) {
}
}
// Wiiリモコンが動いた時に発火。
@Override
public void onMotionSensingEvent(MotionSensingEvent arg0) {
// 3軸加速度センサの値が1~-1の範囲で返ってきます。
GForce force = arg0.getGforce();
System.out.println("X: " + force.getX());
System.out.println("Y: " + force.getY());
System.out.println("Z: " + force.getZ());
}
@Override public void onStatusEvent(StatusEvent arg0) {}
@Override public void onDisconnectionEvent(DisconnectionEvent arg0) {}
@Override public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) {}
@Override public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) {}
@Override public void onExpansionEvent(ExpansionEvent arg0) {}
@Override public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) {}
@Override public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) {}
@Override public void onIrEvent(IREvent arg0) {}
@Override public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) {}
@Override public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) {}
}
リスナをwiimoteに登録
wiimote.addWiiMoteEventListeners(new Listener());
モーションリスナを有効化する
モーションを取得するには以下のコードを書く必要があります。
wiimote.activateMotionSensing();
また何かわかったら追記します。
わからないこと等あればコメントでお願いします。