ご報告ありがとうございます
Unicode版では Unicode用の DirectInput を使用しているのにデバイス情報を受け取る
API にマルチバイト用の構造体を渡していたのが原因でした
修正版をアップしましたので、よろしければお使いください m(_ _;m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
接続されているパッドが XInput に対応しているかどうかを取得するための関数も
追加しましたので、よろしければお使いください
// 指定の入力デバイスが XInput に対応しているかどうかを取得する
// 戻り値 TRUE:XInput対応の入力デバイス FALSE:XInput非対応の入力デバイス -1:エラー
// 接続されていないパッドの番号が指定された場合や、DX_INPUT_KEY や DX_INPUT_KEY_PAD1 など
// キーボードが絡むタイプを InputType に渡すとエラーとなり -1 を返します
int CheckJoypadXInput( int InputType ) ;
> DXライブラリのソースコードを拝見するに
> XInput利用時にはXInputの状態を従来のDirectInput(GetJoypadInputStateで取得出来るかたち)に
> 置き換える処理がされていますが、現在の状況的には逆の方が良いのではないでしょうか。
Xbox360 Controller 以外のコントローラーはアナログスティックの無いもの、
あってもアナログ、デジタルで切り替えられるもの、L2, R2 がアナログになっているもの、
デジタルになっているもの、Xbox360 Controller での A,B,X,Y に当たるボタンがあるもの、ないもの、
あっても順番がコントローラー毎に違ったり、そもそもPS1から始まる
ABXY(×○□△)ボタン+L1R1L2R2+2スティックの形態ではないファミコン型コントローラなど、様々です
なので、Xbox360 Controller の形態を仮想的なコントローラーの形態にしても、
Xbox360 Controller 以外は Xbox360 Controller とは殆どの場合ボタン配置が異なるので
結局 GetJoypadDirectInputState を使用して入力をチェックする必要が発生します
また、ライブラリ利用者の方がすべからく Xbox360 Controller を想定して
ゲームを作成していればDXライブラリ側が用意する仮想 Xbox360 Controller 型コントローラの
ボタン設定に割り当てる関数を使用して便利に使うことができますが、
そうではない場合は現状と同じく自前で仮想コントローラ構造体を用意することになります
現時点で GetJoypadInputState で若干仮想コントローラ的なことをしているので、
その仕様を変更する、若しくは関数を無くすと GetJoypadInputState を使用している
既存のプログラムが動作しなくなる為 Xbox360 Controller 型の仮想コントローラ機能を
追加する場合は新たに別の関数を追加することになりますが、前述の理由で
使用する方がどのくらい居るか分からない状態では無駄に関数が増えるだけになる
可能性があり、躊躇するところです
> 現行のint GetJoypadInputState( int InputType )の返値から
> ビット演算で単に該当ボタンが押下されているかだけをチェックする形式に対して
>
> ボタン毎にint型などで情報を持つカウンタ方式を採用して戴けたらなとおもいます。
押され続けた場合にカウンタがインクリメントされるとのことですが、
インクリメントされるタイミングは何時でしょうか?
DXライブラリ自身は『ゲームの処理が1フレーム経過した』かどうかを検出する
ことができないので、『前のフレームでボタンが押されていたが、今回のフレームでは
ボタンが押されていない』などの処理を行うことができないんです
> さらに図々しくの提案なのですが
> 現在では、パッド識別子 DX_INPUT_KEY_PAD1 において
> パッドのボタンに対してキーボードのキーを一つ割り当てることで
> パッドとキーボードの両方同時チェックを実現していますが、
> これも逆にされてはどうでしょうか。
仰る通り上下左右の入力にテンキーの8246や方向キー、WSADキーなど複数対応できるのは良さそうです
ただ、現状では前述の通りの状況なので、仮想系の機能は抜本的な変更をしない限りは
今の仮想系の機能に追加しても意味があまりないかなと思っています
まだ電器店には Xbox360 Controller 以外のコントローラーも売っていますし、
XboxOne も発売されれば Xbox360 Controller にあった STARTボタンと BACKボタンは
使えなくなるなど、Xbox360 Controller 自体も古いものになっていきます
というか、個人的には XInput が、色々なコントローラーを想定している
DirectInput の進化版のような仕様だったら DirectInput の代わりに
XInput を使えたのに・・・と思っています
( 例えば DirectInput には一つしかない方向入力情報が複数あって、POVや回転軸情報などに
割り当てなくても複数の軸入力に対応できて、且つPOVをPOVとして、回転軸情報を回転軸情報として
使用するデバイスにも対応できるようにPOVや回転情軸報なども残してあるなど )
現状では XInput でしか取得できない情報や、DirectInput でしか取得できない情報が
混ざっているので、全てのデバイスに対応したい場合に結局どちらも使うしかない状態です・・・
なので、本格的に対応したいと思われた方は恐らくだみあんさんのように XInput と
DirectInput の情報をどちらも取得して独自の入力システムを作成すると思いますので、
中途半端な仮想コントローラ機能を追加するのはやめておいたほうが良いかな、と思っています
直ぐには動けないと思いますが、自分の中でもモヤモヤしている入力関係について
考えることができました、ありがとうございます