趣味120%で構成されています。

あほナビあほナビ関係はこちら。 | 古いアプリ公開場はここらへん

XInput

ゴールデンウィークに買ったまま触る機会のなかった
XBOX360 のUSBコントローラ。

WindowsXp に接続することでゲームコントローラーとして使えるんだけども、
この360コントローラー専用のAPIが DirectX9.0 SDK October 2005 より追加された。
それが XInput 。

いままで、DirectX でコントローラーを使おうと思ったら、DirectInput を使って、

  • DirectInputの初期化

  • コントローラの一覧を列挙

  • 列挙中にボタンの数などを確認

  • 使うコントローラーのデバイスIDを記憶

  • ゲームで読み取るたびに、数個の関数を使用

  • コントローラーが外されたりすると、その都度そのコントローラの初期化からやり直し


と、なにかと面倒だった。


んが、この XInput って、初期化は1行。
取得も1行。

つまり2行でデータが全て読み取れる上に、丁寧に認識した順番にIDが0から振られて(現在は最大ID3の4個)、コントローラのLEDもしっかり連動してるし。

あぁ、、、なんか全部360コントローラでいいかなぁ。。とか思ってしまうほど簡単に使えるのがワロスみたいな。
ゲームに関係のないアプリでも対応してしまえるね、これは。。

360PAD
画像は、Windowsで認識したパッドと、360で認識中のパッド。
共にプレイヤー1を示すLED(左上)が光っているのに注目。
(360が2台あるとかいうネタじゃないですw)
また、DirectInput として使用する場合は、LEDは光らない。

あと、XInput を使用しないでいままでの DirectInput で取得すると、デドアラスティックの時に書いたように、アナログL/Rボタンがはやっぱり同時押し認識は出来なかった。
しかし XInput を使うと、360パッドも共に独立したアナログとして認識され、デドアラスティックも同時押しがしっかり認識された。
どうやら XInput は DirectInput の上位ではなく、独立したUSB制御なのかな。

嫌がらせ・・・?
プログラミング | comments (0) | trackbacks (0)

環境構築中2

とりあえずソース互換の無くしたところを修正し終わったところで
最後にリンカエラー。

というか、DirectX SDK のヘッダ内部でコンパイルワーニングってどうよ? どうなのさ!? みたいな。
ま、問題の無いワーニングなのでそれは無視して、問題のリンカエラーは次のとおり。

upnp.obj : error LNK2019: 未解決の外部シンボル "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" (?ConvertStringToBSTR@_com_util@@YGPA_WPBD@Z) が関数 "public: __thiscall _bstr_t::Data_t::Data_t(char const *)" (??0Data_t@_bstr_t@@QAE@PBD@Z) で参照されました。

upnp.obj : error LNK2019: 未解決の外部シンボル "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)" (?ConvertBSTRToString@_com_util@@YGPADPA_W@Z) が関数 "public: char const * __thiscall _bstr_t::Data_t::GetString(void)const " (?GetString@Data_t@_bstr_t@@QBEPBDXZ) で参照されました。

Debug/miniAVG64.exe : fatal error LNK1120: 外部参照 2 が未解決です。


と、見るからに ConvertStringToBSTR やら ConvertBSTRToString の実体リンクミス。
ただ、使ってないんだけどねこの関数達は!

で、渋々とこれらの関数のある comsuppw.lib をソースの中に

#pragma comment(lib,"comsuppw.lib")


てな埋め込みをしてコンパイルをしてみたところ……

comsuppw.lib(comutil.obj) : error LNK2005: "class _variant_t vtMissing" (?vtMissing@@3V_variant_t@@A) は既に comsupp.lib(comutil.obj) で定義されています。


ちょwww
どうやら、別のライブラリが異なる同一関数のライブラリとバッティングを起こしている様子。
で、リンカオプションで comutil.lib を無視に追加することでやっと解決。

さすがマイクロソフト!

で、ソース埋め込みを指定を辞めて
リンカオプションで comsuppw.lib を追加すると無視も指定せずにコンパイルが通りました。

さすがマイクr
プログラミング | comments (0) | trackbacks (0)

環境構築中

DirectXもVC6.0最後の2004から、最新に変更。
これによって、Windows2000での開発互換が無くなったソースになった。

2000は安定としてはいいけど、さすがにいろいろと時代に取り残されているので、今回を持って切り捨てました。
いくら動作が安定してても動かないものが出てきたらダメだね。

てことで、不本意ながらXp用に2000ライブラリを一気にカット。
ついでに XInput を使った開発も出来るようになるしね。

そんないまは miniAVG64 の新環境修正中。
.net2003+DirectX2004SDK から .net2005+DirectX2006 に自動変更してコンパイルを掛けたら、
コアシステム:ワーニング51個 エラー3個。
  カーネル:ワーニング 9個 エラー1個。
テストアプリ:ワーニング 8個 エラー0個。

ヽ(;´д`)ノ
プログラミング | comments (0) | trackbacks (0)

Boost

1年間ほど凍結状態だったメイン開発PCを一気に更新。
まずコンパイラをVC6と.net2003から、.net2005 の導入。

そして、なかなか使う機会がなかった Boost の導入。
なにげに Boost のライブラリ必須コードを使うのって今回が初めてだったりするんよね。

てことで、覚え書き。

まずは WindowsXp の方。

1)とりあえず、Boostを落としてくる
2)適当なインクルードパスに展開

んで、ライブラリを必要とする regex 等を使うために次のを追加。

3)boost-jam もダウンロード
4)適当なところで展開後、.net2005 のコマンドライン環境を実行し次のコマンドでライブラリ作成

C:\...>bjam -sTOOLS=vc-8_0 install

--prefix を付けてなければ C:\Boost 以下にヘッダやライブラリが入る

あぁ、意外と簡単。

Linux への導入はまだ急いでないのでいづれ
プログラミング | comments (2) | trackbacks (0)

おっひさー。

先月末までの契約仕事がひと段落して、やっと自由の身に。
これからはちょくちょく資産プログラムに手をつける予定なので
更新できるかもしれない。

って、もうスパマーしか巡回してなさそうだけどw

そんなわけで、第二期ハジマルヨ!(ナニノ
近況 | comments (2) | trackbacks (0)
1/1