mieki256's diary



2016/12/12(月) [n年前の日記]

#1 [ruby][gosu] Windows + Ruby + Gosu でキーボード入力を検出

Windows10 x64 + Ruby 2.2.6 p396 + Gosu 0.10.8 で、キーボード入力を検出してみる。

キーボード入力で画像を動かす。 :

UFO画像をキーボード入力で動かしてみよう。
  • カーソルキーで上下左右に移動。
  • 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 〜 KbZAキー 〜 Zキー
Kb0 〜 Kb90キー 〜 9キー
KbEscapeESCキー
こんな感じで割り当てられてる。

ゲームパッド入力について。 :

リアルタイム2Dゲームの類を作るなら、ゲームパッド(ジョイパッド)入力もサポートしてるほうが望ましい。キーボードでは難しいプレイも、ゲームパッドなら楽々プレイできたりするわけで。キーボードでしかプレイできないリアルタイム2Dゲームなんて、現代技術で新規開発された拷問器具に等しい。

というわけで、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 コントローラに準拠。
自分が動作確認に使ったのは、DirectInput対応のゲームパッドだった。

試しに XInput対応のゲームパッドを使ってみたら…。やっぱり反応した。

手持ちのゲームパッドで動作確認してみたら、以下の結果に。
ELECOM JC-U3613M (XInput)OK (ドライバのインストールが必要)
ELECOM JC-U3613M (DirectInput)NG
ELECOM JC-U2410TWH (DirectInput)NG
BUFFALO BSGP801GY (DirectInput)NG
やはり Ruby + Gosu は XInput にしか対応してないらしい。

更に加えて。

左アナログスティック・右アナログスティック・十字ボタンのどれを使っても、8方向のデジタル入力として扱われるようで。これは…わざわざボタン配置をキッチリ決めた、XInputを使ってる意味が無いのでは…。

そんなわけで、入手しやすい DirectInput対応製品が使えないのはどうなんだろう、しかも XInput をイマイチ活かせてないような、などとモヤモヤしちゃうところもあるのだけれど、でもまあ一応、Ruby + Gosu はゲームパッド入力にも対応、とは言えそうかなと。

各ゲームパッドの製品情報へのリンク。 :

動作確認に使ったゲームパッドの製品情報へのリンクを列挙しておくのです。

_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 上で動作確認。

端末を開いて以下を打ち込んで、ドライバと動作確認ツールをインストール。
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 で使えるかどうかは分かりませんが。

*1: ただ、ゲームアプリによっては、それらのツールを不正ツール扱いする時もあるそうで…。なので、「できたりする時もありますよ」と若干ぼやけた説明に。

以上です。

過去ログ表示

Prev - 2016/12 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project