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

#2 [zatta] アレ用の記事にすべきだったかも

思考メモ。

昨日今日書いたGosu関係の記事は、もしかすると _Ruby Game Developing Advent Calendar 2016 用の記事にすべきだった、かも…。ちょっと失敗した、かも…。

「Advent Calendar、今年も相変わらず高度過ぎて、こりゃ自分が参加できそうなレベルじゃないわ…」と思ってたけど。「○○が動いたよ」的なこういう薄い内容のソレでも、さすがにこれだけ長々と書いてあったら質より量みたいな感じで一応アリ扱いになったのでは、などと今頃になって思えてきたりもして。

もっとも、どうも Advent Calendar って自分のソレとはペースが違うんだよな、という感もどこかにあって。

例えばこれが、数ヶ月に1回ぐらいの頻度でキッチリした内容のblog記事をビシッビシッと書くような方々なら、この時期用の記事としてじわじわじっくりネタを集めてタイミングを見計らってドーン、とかできるんだろうけど。自分の場合、「この日はこんなことしてました」的に実験内容をすぐにダラダラとWeb日記にメモして終わり、てな感じで公開するのが当たり前になっていて。

なので、その日やったことをずっとこっそり隠しておいて後でまとめてドーン、期日が来たタイミングでババーン、というスタイル自体が結構なストレスになるというか…。自分、隠し事(?)が大の苦手で…。 *1

自分の中では、作業内容・実験内容の公開云々なんてもんは、もやもやとストレスを感じながらやるもんでもないだろう、仕事じゃないんだし、趣味なんだし、無料で公開してるんだし、という(甘えた)気持ちもあったりして。てなわけで、Advent Calendar の類はどうもビミョーに参加しづらい…。

それ以前に自分がやってることはどれもこれも低レベル過ぎてそもそも参加できないわけですけど(木亥火暴)

「インターネットは毎日天下一武道会が開かれてるようなもん」と誰かが言ってたけど、特にこの時期はソレが更に強化されてるような。かめはめ波だか魔貫光殺砲だかが飛びまくってる中に狼牙風風拳で飛び込めるのか、っていう…。 *2

まあ、自分が試したアレコレはこうしてWeb日記上でまるっと公開してるわけだし。隠してるならともかく誰でも見れる場所に公開してるという点では違いは無いはずで。故にその手のイベントに参加できなくても大目に見てもらいたい…てのはダメでしょうかって一体誰に許しを請うているのだか。

思考メモでした。
*1: 考えてみたら、時々日記のアップロードが滞るのはソレだな…。まとめてドーン、に近づいていくとストレスになってアップロードが億劫に…。
*2: ドラゴンボールってほとんど見てないんですけど、こういう喩えで合ってます?

#3 [nitijyou] 某所に行ってきた

電動自転車で某所まで。AM9:10-12:00まで作業。詳細はGRPでメモ。

帰宅途中で夜食等を購入。 :

久々にカワチに寄って夜食等を購入。そういえば、近所にヨークベニマルができてからというもの、カワチにはほとんど足を運ばなくなってしまった…。

以上、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