Mac OS X, Xcode4.6, Objective-CでHID(ゲームパッドとかジョイスティック)を使う(備忘録)
来月頭、とある大きな展示会にMacを使ったゲームを出す(いや、仕事とはあんまり(全く?)関係ないけど成り行き上、、、)。
でゲームと言えばゲームパッドかジョイスティックだろう、ということでゲームパッドを使うことにしたのだが、、、
だがどうやって動かすか最初全く分からなかった。ググっても初心者がわかるようなものがないし、、、(そもそもちょっと前の制御と、IOKitが出てからの制御が違うのでよけいに混乱)
で最終的にできるようになったのだが、その備忘録を。Objective-Cはど素人なので変なことを書いている可能性も高いが、、、
☆HIDってのはUSBの規格の中に含まれているHuman Interface Deviceのこと。キーボード、マウス、ジョイスティック、ハンドルとかいろいろ含まれる。
とにかく情報としては
が全て。
①Linked Frameworks and Librariesに"IOKit.framework"を追加する。
②ライブラリ集として、サンプルプログラムのHID Config Save
https://developer.apple.com/library/mac/samplecode/HID_Config_Save/Introduction/Intro.html
にある、HID Utilitilesをフォルダごと自分のプロジェクトに追加する。
Add FILES to "***"で、Copy items into destination group's folderにチェックを入れ(入れなくてもいいけど)、FolderはCreate groups for any added folders.
このHID Config Saveが唯一の頼りになる例だった。が、HIDのマニュアルと結構違うことを書いていて大混乱。
③.hファイルに、#import "HID_Utilities_External.h"を追加する。
これで準備OK。
④今回のゲームパッドはElecomのこれを使った。
⑤では実際のプログラムはこちら。.mと.hをまとめて一本に。
キーの設定は以下のコードの繰り返し。
// X AXIS
searchHIDInfo.device.vendorID = (uint32_t)vendorID;
searchHIDInfo.device.productID = (uint32_t)productID;
searchHIDInfo.device.locID = (uint32_t)locID;
searchHIDInfo.device.usagePage = 0x01;
searchHIDInfo.device.usage = 0x04;
searchHIDInfo.element.usagePage = 0x01;
searchHIDInfo.element.usage = 0x30;
searchHIDInfo.element.cookie = 0x11;
IOHIDDeviceRef outIOHIDDeviceRef = NULL;
IOHIDElementRef outIOHIDElementRef = NULL;
HIDFindDeviceAndElement(&searchHIDInfo, &outIOHIDDeviceRef, &outIOHIDElementRef);
// if the calibration parameters haven't been set yet…
double_t granularity = IOHIDElement_GetCalibrationGranularity(outIOHIDElementRef);
if (granularity < 0) {
// … do it now
HIDSetupElementCalibration(outIOHIDElementRef);
}
IOHIDValueRef tIOHIDValueRef;
if (kIOReturnSuccess ==
IOHIDDeviceGetValue(IOHIDElementGetDevice(outIOHIDElementRef), outIOHIDElementRef, &tIOHIDValueRef))
{
actionRecs[kActionXAxis].fValue = [self calibrateElementValue:tIOHIDValueRef];
actionRecs[kActionXAxis].fOldValue = actionRecs[kActionXAxis].fValue;
}
actionRecs[kActionXAxis].fDeviceRef = outIOHIDDeviceRef;
actionRecs[kActionXAxis].fElementRef = outIOHIDElementRef;
このデバイス固有のパラメータを変えたらエレコム以外にも使える。
あとコールバック関数だが、、、
static void Handle_InputValueCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDValueRef inIOHIDValueRef) {
// call the class method
[(__bridge HIDAppDelegate *) inContext inputValueResult:inResult sender:inSender value:inIOHIDValueRef];
}
__bridgeというものを使わないとエラーに。それもよくわからんが、とりあえずつけると動く。
ビルドするとlongとuinit32_tの型が違うとかHID Utilities内でいっぱいwarning出るけど気にしないで(私は全部直したものを使ってますが)。
で動かすと、X, Y, 1,3,12ボタンを押すと、ログ画面に押された値がでる。
動いた!
もっとシューティングゲームみたいなタイミングが重要なものにはQueueを使えばいいが、
私のアプリには今回のコードで十分。
Queueを使うときも今回のプログラム+HID Config Saveのコピペで大丈夫と思う。
---
ということでこれだけのことをやるのに、仕事の合間にちょっとずつ進めて1カ月くらいかかっちゃった。初心者に優しくないなあ、、、ということで私と同じ初心者がちょっとでも早く動かせるように備忘録として公開しました。
---
関連リンク:
« AKBじゃんけんは、パーを出し続けた松井珠理奈さんが優勝- FORTRANを思い出したり。 | トップページ | ピサの斜塔がポータブルの3Dスキャナで内部をスキャンされた。思っている以上に傾いてる、、、 »
「パソコン・インターネット」カテゴリの記事
- JavaScriptの数値計算ライブラリmathjsを使う(11)バーニングシップフラクタルを描いてみる。このココログでも計算できるようにした。(2023.01.31)
- JavaScriptの数値計算ライブラリmathjsを使う(10) リーマンゼータ関数(Riemann Zeta function)を計算、3次元化してPlotlyでぐりぐり動かす。(2023.01.27)
- JavaScriptの数値計算ライブラリmathjsを使う(9) 仏陀のお姿のフラクタル Buddhabrot(ブッダブロ)を描く。このココログでも計算できるようにしてみた。(2023.01.26)
- JavaScriptの数値計算ライブラリmathjsを使う(8) 4段4次のルンゲクッタ法でローレンツ方程式を計算。このココログでもPlotlyで3次元でぐりぐり動かせるようにしてみた。 (2023.01.25)
- JavaScriptの数値計算ライブラリmathjsを使う(7) マンデルブロ集合を描く。このココログでも計算して図示できるようにしてみた。(2023.01.16)
« AKBじゃんけんは、パーを出し続けた松井珠理奈さんが優勝- FORTRANを思い出したり。 | トップページ | ピサの斜塔がポータブルの3Dスキャナで内部をスキャンされた。思っている以上に傾いてる、、、 »
コメント