2016/12/12(月) [n年前の日記]
#1 [ruby][gosu] Windows + Ruby + Gosu でキーボード入力を検出
Windows10 x64 + Ruby 2.2.6 p396 + Gosu 0.10.8 で、キーボード入力を検出してみる。
◎ キーボード入力で画像を動かす。 :
UFO画像をキーボード入力で動かしてみよう。
_input_test1.rb
使用画像は以下。
_tmp_ufo.png
ruby input_test1.rb で実行。
動きました。
少し解説。
キーが押されたか判別するには、button_down?(キー種類)を使う。そのキーが押されっぱなしだと true が返ってくる。
それと、Gosu::Window を継承したクラスの中で、def button_down(id) 〜 end を書いておくと、何かキーが押された時にそのメソッドが呼ばれるようになる。
キー種類は、 _ドキュメント を眺めれば予想できるかなと。KbXXXX がキー種類。
例えば、ゲームで使いそうなキーをいくつか列挙してみると…。
こんな感じで割り当てられてる。
- カーソルキーで上下左右に移動。
- Zキーで拡大縮小。
_input_test1.rb
require 'gosu' class MyWindow < Gosu::Window # コンストラクタ def initialize super 640, 480, false self.caption = "Input Test" @img = Gosu::Image.new("tmp_ufo.png", :tileable => true, :retro => true) @x = 320 @y = 240 @scale = 1.0 end # 更新処理 def update spd = 6 # 座標の変化量 # キー入力、またはゲームパッド入力に応じて座標を増減させる # 左キーが押された? if button_down?(Gosu::KbLeft) or button_down?(Gosu::GpLeft) @x -= spd end # 右キーが押された? if button_down?(Gosu::KbRight) or button_down?(Gosu::GpRight) @x += spd end # 上キーが押された? if button_down?(Gosu::KbUp) or button_down?(Gosu::GpUp) @y -= spd end # 下キーが押された? if button_down?(Gosu::KbDown) or button_down?(Gosu::GpDown) @y += spd end # Zキー or ボタン1 が押された? if button_down?(Gosu::KbZ) or button_down?(Gosu::GpButton0) @scale += (8.0 - @scale) * 0.1 else @scale += (1.0 - @scale) * 0.3 end end # 描画処理 def draw x = @x - (@img.width / 2) * @scale y = @y - (@img.height / 2) * @scale @img.draw(x, y, 0, @scale, @scale) end # キーボードチェック def button_down(id) # ESCキーが押されたらウインドウを閉じて終了する # Gosu::Window.close() を呼ぶとウインドウが閉じる close if id == Gosu::KbEscape end end window = MyWindow.new window.show
使用画像は以下。
_tmp_ufo.png
ruby input_test1.rb で実行。
動きました。
少し解説。
キーが押されたか判別するには、button_down?(キー種類)を使う。そのキーが押されっぱなしだと true が返ってくる。
それと、Gosu::Window を継承したクラスの中で、def button_down(id) 〜 end を書いておくと、何かキーが押された時にそのメソッドが呼ばれるようになる。
キー種類は、 _ドキュメント を眺めれば予想できるかなと。KbXXXX がキー種類。
例えば、ゲームで使いそうなキーをいくつか列挙してみると…。
KbLeft | カーソルキー左 |
KbRight | カーソルキー右 |
KbUp | カーソルキー上 |
KbDown | カーソルキー下 |
KbA 〜 KbZ | Aキー 〜 Zキー |
Kb0 〜 Kb9 | 0キー 〜 9キー |
KbEscape | ESCキー |
◎ ゲームパッド入力について。 :
リアルタイム2Dゲームの類を作るなら、ゲームパッド(ジョイパッド)入力もサポートしてるほうが望ましい。キーボードでは難しいプレイも、ゲームパッドなら楽々プレイできたりするわけで。キーボードでしかプレイできないリアルタイム2Dゲームなんて、現代技術で新規開発された拷問器具に等しい。
というわけで、Ruby + Gosu でもゲームパッド入力ができるのか調べてみたのだけど、これが若干悩ましい部分があって。
ゲームパッド入力は、キーボード入力と同様、button_down?(ボタン種類) で判別できる。GpXXXX がボタン種類。例えば…。
割り当てはこんな感じ。
ところが。Windows10 x64 + Ruby + Gosu 上で、いつも使ってるUSB接続ゲームパッドを持ち出してきて動作確認してみても全く無反応で。
変だな、Windows上ではゲームパッド入力をサポートしてないのかな? と思ったけれど、ふと気が付いた。もしかして XInput にしか対応してないんじゃないか…?
Windows PC で使えるUSB接続ゲームパッドには、大別すると2種類あって。
試しに XInput対応のゲームパッドを使ってみたら…。やっぱり反応した。
手持ちのゲームパッドで動作確認してみたら、以下の結果に。
やはり Ruby + Gosu は XInput にしか対応してないらしい。
更に加えて。
左アナログスティック・右アナログスティック・十字ボタンのどれを使っても、8方向のデジタル入力として扱われるようで。これは…わざわざボタン配置をキッチリ決めた、XInputを使ってる意味が無いのでは…。
そんなわけで、入手しやすい DirectInput対応製品が使えないのはどうなんだろう、しかも XInput をイマイチ活かせてないような、などとモヤモヤしちゃうところもあるのだけれど、でもまあ一応、Ruby + Gosu はゲームパッド入力にも対応、とは言えそうかなと。
というわけで、Ruby + Gosu でもゲームパッド入力ができるのか調べてみたのだけど、これが若干悩ましい部分があって。
ゲームパッド入力は、キーボード入力と同様、button_down?(ボタン種類) で判別できる。GpXXXX がボタン種類。例えば…。
GpLeft | 十字ボタン左 |
GpRight | 十字ボタン右 |
GpUp | 十字ボタン上 |
GpDown | 十字ボタン下 |
GpButton0 〜 GpButton15 | ボタン0 〜 15 |
ところが。Windows10 x64 + Ruby + Gosu 上で、いつも使ってるUSB接続ゲームパッドを持ち出してきて動作確認してみても全く無反応で。
変だな、Windows上ではゲームパッド入力をサポートしてないのかな? と思ったけれど、ふと気が付いた。もしかして XInput にしか対応してないんじゃないか…?
Windows PC で使えるUSB接続ゲームパッドには、大別すると2種類あって。
- DirectInput … 旧規格。若干お値段が安い。製品種類が豊富。ボタン数・配置は製品毎にバラバラ。
- XInput … 新規格。若干お値段が高い。製品種類がほとんど無い。ボタン数・配置は Xbox 360 コントローラに準拠。
試しに XInput対応のゲームパッドを使ってみたら…。やっぱり反応した。
手持ちのゲームパッドで動作確認してみたら、以下の結果に。
ELECOM JC-U3613M (XInput) | OK (ドライバのインストールが必要) |
ELECOM JC-U3613M (DirectInput) | NG |
ELECOM JC-U2410TWH (DirectInput) | NG |
BUFFALO BSGP801GY (DirectInput) | NG |
更に加えて。
左アナログスティック・右アナログスティック・十字ボタンのどれを使っても、8方向のデジタル入力として扱われるようで。これは…わざわざボタン配置をキッチリ決めた、XInputを使ってる意味が無いのでは…。
そんなわけで、入手しやすい DirectInput対応製品が使えないのはどうなんだろう、しかも XInput をイマイチ活かせてないような、などとモヤモヤしちゃうところもあるのだけれど、でもまあ一応、Ruby + Gosu はゲームパッド入力にも対応、とは言えそうかなと。
◎ 各ゲームパッドの製品情報へのリンク。 :
動作確認に使ったゲームパッドの製品情報へのリンクを列挙しておくのです。
_Xinput対応ゲームパッド ELECOM JC-U3613MBK
_10ボタン配列USBゲームパッド ELECOM JC-U2410T
_レトロ調USBゲームパッド 8ボタンタイプ - BUFFALO BSGP801GY
Ruby + Gosu で使えたのは、JC-U3613MBK だけ、かつ、別途ドライバをインストールしないと使えなかった、とメモ。
それにしても、ELECOM製品ばかりだな…。値段が安いので、つい選んでしまう…。
_Xinput対応ゲームパッド ELECOM JC-U3613MBK
_10ボタン配列USBゲームパッド ELECOM JC-U2410T
_レトロ調USBゲームパッド 8ボタンタイプ - BUFFALO BSGP801GY
Ruby + Gosu で使えたのは、JC-U3613MBK だけ、かつ、別途ドライバをインストールしないと使えなかった、とメモ。
それにしても、ELECOM製品ばかりだな…。値段が安いので、つい選んでしまう…。
◎ ツールを使う手もありますね。 :
Ruby + Gosu に限った話じゃないけれど。キーボード入力にしか対応してないゲームアプリでも、
_JoyToKey
、
_NanJoy
、
_JoyAdapter
等のツールを使えばゲームパッドで操作できたりする時もありますよ、と一応言及しておくのです。
*1
◎ Ubuntu Linux 16.04 LTS上でも試した。 :
ググってみたら、Ubuntu Linux もゲームパッドは使えるらしい。
_Ubuntuでゲームパッドを使う | レンズの向こう
_ubuntuでゲームパッドを使用する方法: suzukikenzouのブログ
だったら試してみるか…。VMware Player + Ubuntu 16.04 LTS 上で動作確認。
端末を開いて以下を打ち込んで、ドライバと動作確認ツールをインストール。
今回は、DirectInputタイプのUSB接続ゲームパッド ELECOM JC-U2410TWH を接続してみた。
jstest-gtk を実行したところ、ちゃんと入力に反応している模様。スンナリ動くんだな…。素晴らしい。
前述の Gosu のスクリプトも動かしてみた。これまた反応してしまった。Windows上で動作確認した時よりもスンナリと確認できちゃった。素晴らしい。
ということで、Windows + Ruby + Gosu は XInput にしか対応してないのに、Linux + Ruby + Gosu は DirectInput に対応してるという。なんだかずるい。
_Ubuntuでゲームパッドを使う | レンズの向こう
_ubuntuでゲームパッドを使用する方法: suzukikenzouのブログ
だったら試してみるか…。VMware Player + Ubuntu 16.04 LTS 上で動作確認。
端末を開いて以下を打ち込んで、ドライバと動作確認ツールをインストール。
sudo apt-get install joystick jstest-gtk
今回は、DirectInputタイプのUSB接続ゲームパッド ELECOM JC-U2410TWH を接続してみた。
jstest-gtk を実行したところ、ちゃんと入力に反応している模様。スンナリ動くんだな…。素晴らしい。
前述の Gosu のスクリプトも動かしてみた。これまた反応してしまった。Windows上で動作確認した時よりもスンナリと確認できちゃった。素晴らしい。
ということで、Windows + Ruby + Gosu は XInput にしか対応してないのに、Linux + Ruby + Gosu は DirectInput に対応してるという。なんだかずるい。
◎ Macはどうなんでしょうね。 :
Macは持ってないから確認のしようもないけれど。そもそも Mac はUSB接続ゲームパッドって使えるのでしょうかね…。
_Macでゲームパッド(Logicool F310r)を使う - Paalonのブログ
_【Macでも使えた】ゲームパッド・ゲームコントローラー・ジョイパッド
使えるみたいではありますな。Gosu で使えるかどうかは分かりませんが。
_Macでゲームパッド(Logicool F310r)を使う - Paalonのブログ
_【Macでも使えた】ゲームパッド・ゲームコントローラー・ジョイパッド
使えるみたいではありますな。Gosu で使えるかどうかは分かりませんが。
*1: ただ、ゲームアプリによっては、それらのツールを不正ツール扱いする時もあるそうで…。なので、「できたりする時もありますよ」と若干ぼやけた説明に。
[ ツッコむ ]
以上です。