Heliodor 2019/01/28 21:10

ジョイスティック

プログラム話です。


突然ですが、私がゲームを作り始めた頃は右も左も分からなかったので、DirectX の入門書に書いてあった事に忠実に従って入力処理には Direct Input を使っていました。

ところが、とあるゲームを作った時に格闘ゲーム用の本格的なコントローラが認識されないという報告がありました。詳細は忘れてしまったのですが、調べてみたところ Direct Input では使えないゲームコントローラーが一部存在するということでしたので、「Direct Input ではなく Win32 API を使う」というマニアックな設定項目をオプション画面に追加したことがありました。

わざわざ Direct Input と Win32 API の両方で実装したわけですが、プログラム的には Win32 API のジョイスティック関数だけを使うのがシンプルで簡単なんですよね。なぜ Direct Input を使い続けたのかと考えてみたところ、「フォースフィードバックできるから」という、結局全く使う事の無かった機能のために選択した結果だったことを思い出し、次回作からは迷わず Win32 API だけを使うように変更しました。

余談ですが、プログラム的には普通のゲームパッド(ファミコンみたいな単純なものから、アナログスティックつきの豪華なものまで)はすべてジョイスティックコントローラーとして扱います。ファミコンのコントローラーのような明らかにアナログ入力できないものでも、倒したか倒していないかの2通りしかないアナログスティックとして扱います。数あるゲームライブラリでもコントローラからの入力を扱う部分には Joystick と名前がついている場合がほとんどですので、もしプログラマーが「ジョイスティック」とか言っていたらそれは普通にゲームパッドの事だと思ってください。

そんなわけで、プログラム的にはあくまでもガチのジョイスティックを基本にしているので、ゲームコントローラの処理関数とかには必ず「ハットスイッチの向き」を調べるものがあります。しかしハットスイッチなんてフライトシミュレーターで使うような本格的なジョイスティックにしか付いていないマニアックなボタン、ぐらいにしか思っていなかったので、使うことはないだろうと完全に無視してました。少なくとも自分が持っていた安物のゲームコントローラやテストプレイをお願いした人の環境ではそれで問題なかったのです。

で、ヴィータ大脱出をリリースしてからしばらくたった時、プレイステーションのコントローラが使えないという苦情が着ました。よく聞いてみると、PSコントローラーのアナログスティックでは操作できるが十字キーで操作できない、という事でした。その時になって初めて、アナログスティックと十字キーが両方ある場合は十字キーがハットスイッチとして働くという事を知りました。

試しにアナログスティックが付いている割と豪華なゲームパッドを買ってみて初めて気が付いたのですが、十字キーとアナログスティックのどちらががハットスイッチでどちらがアナログ方向キーになるのか、というのはゲームパッド側の設定で変えられるんですね。それがPSのパッドだとハットスイッチ固定になっていたという話で。

なので、ハットスイッチとアナログ軸の入力を両方調べて、絶対値の大きなほうを採用するようにし、一件落着しました。
(入力軸ごとに絶対値の大きなほうを見ているだけなので、例えば十字キーで上を入力し、アナログスティックで右を入力した場合は右上の入力として扱います。キーボードとゲームパッドで同時に操作した場合も同様です)

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索