hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
小ワザ/ジョイスティック - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

ジョイスティック

 ゲームに欠かせないゲームパッド(ジョイスティック)入力を手軽に便利に使用するモジュールを作ってみます。

 HSP3にはヘルプブラウザには載っていないモジュールいくつかパッケージに含まれており、非常に便利そうな命令が豊富に隠れているようです。(プログラミング・マニュアル1のプログラミングガイド、HSP3支援モジュールの項目を参照。)
さて、この中にmod_joystick.as(MIAさん作成)というゲームパッドを使用可能にするモジュールが含まれているのですが そのままではちょこっとだけ使いにくいので、今回はこれを拡張したものを作成してみました。


モジュール(stick互換) [hsp3]

このモジュールでは次の特徴があります。

  • stick命令と同じ感覚で使用することが出来ます。 → stick命令については「小ワザ/stick命令の使い方」を参照してください。
  • 返り値はstick命令で得られるものに追加する形なので、キーボード入力とゲームパッドのボタン入力は重なりません。 ただし方向キーは重なります。
  • キー配置の変更が出来ます。
  • ジョイスティックID = コントローラID -1

そのまま実行すれば実行サンプルを見ることが出来ます。ゲームパッドを接続して実行してみてください(実行中に接続してもOKです)。

+  ジョイスティック情報取得モジュール


モジュールの使い方はスクリプト内のコメントを参照してください。


改訂版モジュール
このモジュールから、バグを取り除き、機能の追加とヘルプを追加したパッケージを作成しました。
モジュールの中のことはともかく、ジョイスティックに対応したい方。
サンプルを参考に作ってみたけど、バグに悩ませられている方。
は、こちらをご利用ください。
PAD設定さん:http://homepage3.nifty.com/ghpk/dl/dl11.htm

ボタン配置

 同じような形、同じようなボタン配置のゲームパッドでもメーカーによってはボタン1〜の配置順番が異なっていることがあるようです。
また、PS/PS2コントローラをパソコンに接続するコンバータもメーカーによってボタン配置がことなってしまうようです。
またさらに、ゲームパッドによってはボタン配置場所そのものがことなるものが多数出回っています。(PSやサターンなどのようなタイプ)

 このような理由からPCでのゲーム開発の場合、デフォルトのキー配置以外にユーザーがキー配置を変更する余地を残しておくことが必要でしょう。
もちろんゲームパッドを持っていないキーボードユーザーへの配慮も必要です。



ジョイスティックID

ジョイスティックIDとは…

  • APIのjoyGetPosEx?、joyGetPos?関数で指定するパラメータuJoyIDのこと。(JOYSTICKID1, JOYSTICKID2で指定すると書かれています。)
  • 0〜(ドライバにサポートされるジョイスティック数-1)の整数値。
  • PCに接続されているゲームパッドにはそれぞれ重複しない0以上のジョイスティックID(番号)がつけられている。
  • ジョイスティックIDの割り振りはOSによって動作が異なる。
    • Win98,ME,2kではコントローラID(=ジョイスティックID+1)として確認、変更が可能である。
    • WinXP以降のOSでは確認することは出来ないかわりに、優先的にジョイスティックIDを小さい番号にする設定は可能。
  • プログラムではこのID番号で使用するジョイスティックを指定することになる。(APIのjoyGetPosEx?、joyGetPos?関数)

と、このようなものです。
しかし、このジョイスティックIDという呼び名は一般的ではないらしく検索しても出てきません。どなたか一般的な呼び名をご存知でしたら教えてください。

さてジョイスティックIDは普段ユーザーは気にしないでいい値です。そのため、今自分が使っているジョイスティックのIDが何番か?ということも知らなくて当然です。
またジョイスティックを1つしか使っていなくてもIDが0とは限りません。そのためプログラミングする際には何らかの配慮が必要になってきます。
例えば、使えるジョイスティックIDを自動検出して指定するか、使えるジョイスティックIDからユーザーに選択させる方法が考えられます。


蛇足ですが…
joyGetPosEx?、joyGetPos?関数のマニュアルではJOYSTICKID1, JOYSTICKID2としか書かれていません。が、実際には上記のような整数値なので0以上の値を指定して使います。
ちなみに変数の中身はJOYSTICKID1=0, JOYSTICKID2=1となっている。マニュアルを鵜呑みにするとID=1まで、ジョイスティック2個しか使えないことに…なんでこんな書き方なんでしょうね。


XPより前のジョイスティックID

ジョイスティックIDはドライバをインストールされた(認識された)ジョイスティックごとに割り振られ、USBを抜き差ししてもそのジョイスティックのジョイスティックIDは変更されません。
コントロール パネルからIDの確認と変更が可能です。

ジョイスティックを1つしか持たないユーザは通常ID=0がそのジョイスティックのIDになります。
しかし、ゲームパッドを買い換えた(買い足した)ユーザーは、新規に接続したジョイスティックにID=1が割り振られることになります。さらに新規ジョイスティックを接続するとID番号は増えていきます。
このためジョイスティックIDを0で固定してゲームを作ると、ジョイスティックが使えないユーザーが出てくることになります。
このようにせっかくゲームパッドに対応したゲームを作成しても、ゲームパッドを使えないユーザーが出てきてしまうことがあります。(設定変更すればいいということに気付かないユーザーは少なくないでしょう。)

XP以降のジョイスティックID

 詳細未確認のためこの解説は推測です。XPでのジョイスティックIDの挙動の詳細はこれを書いている私にはよくわかりません。(XPユーザではないため)
 ジョイスティックが接続されると自動的に小さい番号のIDが割り振られるようです。
接続したジョイスティックに対するジョイスティックIDは固定ではなく、変動するようです。(IDが飛び飛びになることもなく、番号はつめて配布されるらしいです。)

優先デバイスの設定がされていなければ、接続されたジョイスティックが1個だけなら、ジョイスティックIDは常に0となるようです。


ジョイスティックIDを調べる

XPより古いOSで調べる

XPより古いOSではジョイスティックIDは固定(USBを抜き差ししてもジョイスティックID番号が変わらない)となっています。
各ジョイスティックに割り振られたジョイスティックIDは、コントローラID(=ジョイスティックID+1)として確認・変更が可能です。
確認・変更するには、ゲームパッドを接続した状態で、[スタート] ボタンから、「設定」→「コントロール パネル」→「ゲーム オプション」→「詳細」タブまたは「コントローラ ID」タブとすることで確認できます。
またこのダイアログでIDの割り振りを変更できます。ただし

コントローラID = ジョイスティックID + 1
ジョイスティックID = コントローラID - 1

コントローラIDは1〜
ジョイスティックIDは0〜
であることに注意してください。

XP以降のOSで調べる

XP以降のOSでは「ゲームコントローラ」でのコントローラIDの確認はできません。 その代わり、ジョイスティックが接続されると使っていない一番小さいID番号を割り振るようになっているようです。
優先デバイスの設定がされていなければ接続されたジョイスティックが1個だけなら、ジョイスティックIDは常に0(コントローラIDは常に1)ということになります。

コントローラ変換コネクタ

ゲーム機用のジョイスティックをパソコンへ接続するUSB変換コネクタというものがあります。使い慣れたゲーム機用ジョイスティックをパソコンで使えるという便利なものです。しかし、使用には多少の注意が必要になります。

  • 同じジョイスティックを使っていても変換コネクタによっては、ボタン番号(配置)が変わったりすることがある。
  • 2個以上のジョイスティックを接続できるもののなかには、実際にはジョイスティックを1つしか接続していなくても2つ接続していると認識されてしまうことがある。
    変換コネクタ自体をジョイスティックと認識しているようです。つまり変換コネクタに何もつながなくてもジョイスティックを検出する。

ジョイスティックの性能を取得 [hsp3]

APIのjoyGetDevCaps?関数を使用するとジョイスティックの性能情報を取得できます。
構造体からの情報取得方法を間違っていたことが判明したので修正しました。
しかし…szRegKey?とszOEMVxDの意味がさっぱりわかりません。orz

+  ジョイスティック性能取得テスト

ジョイスティックの接続状態を取得する [hsp3]

XPってジョイパッドIDがどんなふうに割り当てられているのか分からなくて困りますね。これを使えば少しは解決するでしょうか?
ジョイスティックの接続状態を取得するサンプルです。接続されている全てのジョイパッドのIDと名前を取得して表示します。
PCにジョイスティックを接続した状態で実行してみてください。実行中に接続してもダメです。

+  ジョイスティックの接続状態を取得するサンプル

キーボードのキーロールオーバー

 ゲームを作っていて、キーの同時押しが認識されない!と気付いたことはありませんか?

 キーボードのキーを何個まで同時に押して認識できるかをあらわす言葉をキーロールオーバーといいます。
例えば3キーロールオーバーならキーを3つまで同時押ししても認識してくれます。
また、nキーロールオーバーならどのキーをどれだけ同時押ししても全ての押したキーを認識してくれます。
nキーロールオーバーは一部の高級キーボードだけが対応しており、一般ユーザーは3キー〜擬似nキーロールオーバーのキーボードを使用しています。

 このようなキーボードの性能の制約によりほとんどの一般ユーザーのキーボードは同時押しを認識しません。
キーボード操作のゲームを作るときは、複数キーの同時押しが必要なルールにならないよう注意しましょう。

どうしても同時押しが必要なゲームを作りたいときは、キーボードではなく、標準で全キー同時押し可能であるジョイスティックを利用することをお勧めします。
ユーザーにnキーロールオーバー対応キーボードを買わせるよりはずっと安く済みます。

コメント

+  ログ1
  • 久しぶりの修正作業。性能取得のサンプルを修正。解説も修正。ふとNキーロールオーバー対応キーボードいくらするのか調べてみたんですが、1万円以上はするようですね。しかもPS/2接続じゃないとNキーロールオーバーにならないようで、USB接続では6キーロールオーバーらしいです。本格的にFPSやる人とかが買うんでしょうか…。 -- GENKI? 2007-11-19 (月) 00:15:46
  • そういえば最近はアナログ対応コントローラが店頭に増えてきましたね。一方で2ボタンとか4ボタンとか古いデザインのものも出てきてますが。 そろそろアナログ取得にも対応しようかな・・・。問題は未入力状態の設定か。 -- GENKI? 2007-11-19 (月) 00:21:32
  • 良かれと思い、数点レイアウトを変更しました。主に見出しの変更です。
    ジョイスティックID=モジュールで独自に定義した概念 という理解で良いのでしょうか? -- eller 2007-12-03 (月) 07:40:00
  • ありがとうございます。すごく見やすくなりましたー。 [bsmile2] ジョイスティックIDってのは…検索してもほとんど出ませんね。呼び方違うのかな?
    ここでいうジョイスティックIDとは…
    APIのjoyGetPosEx、joyGetPos関数で指定するパラメータuJoyIDのこと。JOYSTICKID。
    0〜(ドライバにサポートされるジョイスティック数-1)の整数値。
    PCに接続されているゲームパッドにはそれぞれ重複しない0以上のジョイスティックID(番号)がつけられている。
    Win98,ME,2kではコントローラID(=ジョイスティックID+1)として確認、変更が可能である。
    WinXP以降のOSでは確認することは出来ないかわりに、優先的にジョイスティックIDを小さい番号にする設定は可能。
    とまあこんな感じです。この呼び方は検索しても出てこないので独自といえば独自なのかも…、でも概念はjoyGetPos?関数のそれなので独自ではないです。 -- GENKI? 2007-12-03 (月) 22:42:13
    • 回答ありがとうございます。ジョイスティックIDで検索してもほとんどヒットしないので独自だろうかと考えていました。 -- eller 2007-12-04 (火) 07:30:00
  • コントローラIDが主になっていた文章をジョイスティックIDが主になるように修正しました。あ上のコメントのジョイスティックIDとは…を本文に入れるの忘れた。明日入れよう…。 -- GENKI? 2007-12-04 (火) 00:53:05
  • つまりnキーロールオーバーはソフトウェアで回避不可能ってことですかね? -- 2007-12-08 (土) 01:31:33
    • そうです。HSPに限らず回避する方法を見かけたことがありません。 -- GENKI? 2007-12-08 (土) 14:23:10
  • 個人サイトのほうで開発中のジョイスティックモジュールのβ版を公開中です。気の向いた方はご意見ください。β版ダウンロード  …宣伝失礼。 [ojigi] -- GENKI? 2007-12-27 (木) 01:04:14
    • 試してみました。joyp_test02.hspのサンプルスクリプトで、実際に押しているかどうかにかかわらず↑キーが押されっぱなしの状態になります。ジョイスティックを接続していない状態では問題ありません。環境はVista&ELECOM「JC-U923WH」です。
      使い勝手は良好です。サンプルスクリプト以上の動作確認はできていません。 -- eller 2007-12-29 (土) 09:42:43
    • 動作確認ありがとうございます!↑キーが押されっぱなし>うーん、こちらでは現象確認できません。キーボードに何か接触してませんでしたか?(↑キーとかテンキーの8付近とか…)キーボード入力も受け付けてるからそれが原因かもしれません。 -- GENKI? 2007-12-29 (土) 23:44:56
    • もちろん何も触れていない状態です。XPでも上記異常動作を確認しました。
      アナログ入力値は正常に取得できているようです。 -- eller 2007-12-30 (日) 10:18:21
    • 状況を確認したいので少し教えて下さい。異常動作が起きているとき、次のことを確認していただけないでしょうか。
      • 何も押していないときの「アナログ L」の数値はいくつと表示されてますでしょうか。(出来ればスティックの左上、右下の時の値がもらえると助かります。)
      • 「次のボタンが押されています。」の下に「↑:上ボタン」が表示されているのでしょうか。 -- GENKI? 2007-12-30 (日) 15:46:59
      • 何も押していないときの「アナログ L」の数値→(32511,32511)
        左上→(0,0)
        右下→(65535,65535)
        「↑:上ボタン」→表示されています。黒丸も描画されています。 -- eller 2007-12-30 (日) 15:58:31
  • ありがとうございます。POVキー(ハットスイッチ)キーの上(0度)を検出か。JC-U812はハットスイッチないので検出しないはずなのにー。むしろこの辺が原因なのかな…joyp_test03.hspと比較しつつ調べてみます。 -- GENKI? 2007-12-30 (日) 19:15:56
    • ごめんなさい、後で確認してみますがjoyp_test03.hspでも発生したはずです。 -- eller 2007-12-31 (月) 00:08:17
    • てことは、念のため…。コントロールパネルからゲームコントローラを開いて、問題のゲームパッドのプロパティを見てもらえませんでしょうか。ここでパッドの動作確認が出来るんですが、ハットスイッチ(POV)が入りっぱなしになってませんでしょうか。(本来ならハットスイッチの項目も表示されないはずですけど。)もしそうなら設定タブで調整を行ってみてください。お手数かけます。年末忙しいと思いますのでひまなときで結構です…。というか私も明日から数日何も出来ませんので。 [worried2] -- GENKI? 2007-12-31 (月) 17:09:00
  • こちらのモジュールをお借りしたのですが、ジョイスティックを挿していないと、キーボードの入力も受け付けなくなります [sad2] ジョイスティックを挿してなくてもキーボードの入力を受け付けるようにするには、どの部分をどう修正すればいいのでしょうか? [ojigi] -- sumomo? 2009-05-25 (月) 17:29:25
    • むむ、私の環境でもテストしてみましたが現象確認できませんでした。とりあえずここのに修正やら何やらを追加したものがこちらにありますので、付属のサンプルで確認してみてください。 -- GENKI? 2009-05-26 (火) 00:48:38
    • 素早い返信ありがとうございます。早速ダウンロードさせていただきました。サンプルを試したところ、ジョイスティックを挿してない状態でのキーボードからの入力にもちゃんと反応しました。内容を理解できるかまだ不安ですが、マニュアルをじっくり読んでモジュールを活用できるよう頑張りたいと思います。ありがとうございましたm(_ _)m -- sumomo? 2009-05-26 (火) 02:18:33
    • 解決してよかったです。しかし、自分で作っといて原因が思い当たらない…。中身だいぶ忘れてるなー。 [worried2] -- GENKI? 2009-05-26 (火) 23:26:06
  • 上記の件の続きなのですが、そのキーボードの反応がどうもおかしいのです。例えば矢印キーの←、↑、→、↓を押すとそれぞれジョイスティックのボタン1、2、3、4の値として出力されている(Z,X,C,Vキーもそれぞれボタン5,6,7,8の値が出力されます)ようで、これはキーボードの問題なのでしょうか?キーボードはこちらhttp://www.ec-current.com/shop/g/g4900849809948を使用しています -- sumomo? 2009-06-01 (月) 22:26:19
    • もし、padset.iniファイルがあったらこれを削除してからもう一度確認してみてください。padset.iniに変な設定が残ってるのかもしれません。ちなみにどのサンプルで試してみた結果でしょうか? キーボードのほうは極普通のもののようなので問題ないと思います。 -- GENKI? 2009-06-02 (火) 23:54:36
    • padset.iniファイルは見当たらず、キーボード入力が出力されるサンプル1,4,5で同様の結果になりました。しかしサンプル2のみ、十字キーそれぞれで1-2-4-8と出力、またZ~Vを押しても反応がありませんでした。いかがでしょうか。 -- sumomo? 2009-06-04 (木) 23:46:33
    • サンプル2のキーボードはただのstick命令なのでそれは正常に動いているようです。(z〜vが反応しないのは正常)
      モジュール内でキーボードの情報取得はstickとgetkeyでやっているので、本来問題はないはずなのですが…。難しいですね、何だろう。
      古いモジュールのファイルがcommonなどに残っているとか…いったん全部残らず確実に消したのを確認してから最新版を入れてみるといいかもしれません。
      すみませんちょっと原因特定が難しいです。 -- GENKI? 2009-06-05 (金) 00:56:13
    • ダウンロードし直してサンプルを試してみましたが、やはり同じ症状のままでした。原因不明なのは残念ですが、コントローラは問題なく使えますしコンフィグ機能も便利なので、このまま利用させていただこうと思います。ありがとうございました。 -- sumomo? 2009-06-07 (日) 14:34:13
  • 古い話で申し訳ないのですが、↑キーが押されっぱなしになる件は解決されているのでしょうか? -- 初心者? 2009-09-13 (日) 10:58:48
  • 上記の続き。ELECOMのパッドを使っているのですが同じ症状で、プロパティを確認しましたが、POVキーは検出されませんでした。とりあえずソース中の「POV(ハット)キーも方向キーとして扱う」以下5行を削除したところ正常に動作しました。この使い方で問題ないでしょうか? -- 初心者? 2009-09-13 (日) 11:07:15
    • こちらのモジュールセットを使ってみてください。このページで紹介している内容+αをまとめたものです。「↑キーが押されっぱなし」問題は修正済みです。
      中がどうなっているかはだいぶ時間がたって忘れてしまったので、詳しくはこれのスクリプトを見てください。あ、使うだけならスクリプトなんか見なくていいですよ。hsもついてますので。 -- GENKI? 2009-09-15 (火) 21:35:37
  • GENKIさんありがとうございます [bsmile2] !…というかすみませんでしたー。すでに解決+αされていたのですね。ありがたく使わせていただきます! [ojigi] -- 初心者? 2009-09-16 (水) 00:00:04
    • すみません。ちゃんと本文で誘導してませんでした。 いましがた本文でも誘導文入れてきました。 -- GENKI? 2009-09-16 (水) 00:29:03

  • URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

    添付ファイル:
    filejoy003.hsp
    864件 [詳細]
    トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
    Last-modified: 2009-09-16 (水) 00:29:03 (1544d)