アナログスティック入力

Twitterで@iMAKOPiさんからアナログスティック入力対応パッチを頂いた。スティック2本とPOVをデジタル入力する機能だったので、それをベースにアナログ入力メソッドを追加してみた。

require 'dxruby'

font = Font.new(32)
Window.loop do
  x, y, z, rx, ry, rz = Input.pad_axis
  Window.draw_font(640*x, 480*y, "L-Stick", font)
  Window.draw_font(640*z, 480*rz, "R-Stick", font)
end

DirectInputがサポートするアナログスティック入力はx、y、zの3軸傾きと、rx、ry、rzの3軸回転となっている。他に十字ボタンを割り当てたハットスイッチ(POV)と、UV軸のスライダー、ボタンなど。デジタル方向パッドの場合はxとyに値が入ってくるからそれを使っていたが、アナログ入力になると話が急にややこしくなる。
まず、上記入力であるからして、スティック2本に対応していない。パッドのスティック2本はxy軸で、あわせて4軸となる。左スティックはxyを使うが、右スティックは便宜的にどこかに強引に割り当てる必要がある。どこに割り当てるかはデバイスのメーカー次第である。
さっきのサンプルコードを見ていただければわかると思うが、うちのパッドでは左スティックはxとy、右スティックはzとrzに割り当たっていた。これはどうやらPS3などのコントローラの割り当てらしい。エレコムみたいなメーカーはこの割り当てでデバイスを作っており、「DirectInput対応」と謳っているので、これがいわゆるDirectInputバイス業界標準となっていると考えられる。
また、XBOX360コントローラは割り当てが違っていて、左スティックはxとy、右スティックはrxとryになるらしい。LトリガとRトリガがzとrzだ。このタイプのデバイスはメーカーのサイトを見ると「XInput対応」と表現されている。XInput対応デバイスDirectInputでも使えるが、入力される項目がいわゆるDirectInput対応デバイスと異なる。両対応で切り替え可能なものもロジクールなどが作っているようだ。想像するに入力項目を切り替えているのではないかと思う。それ以外に「対応」という言葉を使う意味が無いからだ。

さて、そういうデバイスの状態なので、これらはかなり厄介な問題となる。なぜなら、どこに右スティックの値が入力されてくるかわからないからだ。単純に6軸返すメソッドを作っても、ライブラリを使う人はそれのどれを使えばいいのかがわからない。
世の中のゲームは遊ぶ人が設定できるようなコンフィグ機能が必須という状況らしい。そりゃそうだ。しかしDXRubyでゲーム作る人にまでそれらを完備しろと言うのもアレだ。ライブラリ標準でそのような設定画面を作るかというと、それも微妙だ。
方向性として、とりあえずはDirectInput対応デバイスに対応したアナログ入力メソッドを作っておいて、XInputデバイスの人はドライバなりユーティリティなりでなんとかしてください、という感じか。コンフィグ機能をサポートするような論理キーの仕組みも欲しいところだが。うーん。悩ましい。