SDLUdon Advent HitoriSumotori 2

1日目の記事はudnonkobillyさんによる http://d.hatena.ne.jp/udonkobilly/20131201 でした!
では早速、今回は前回やりそこねたInputモジュールの説明です。まずはキーボードの入力を。なおマウスはまだ未実装、今気付きました…。

Inputモジュール

Input.key_up?(sym=:key_name)   # キーが離された時にtrue
Input.key_down?(sym=:key_name) # キーが押されている間にtrue
Input.key_push?(sym=:key_name) # キーが押された瞬間にtrue
Input.keys?(type, :key_sym1, :key_sym2, ...)

引数のキーはキー名をシンボルにしたものを渡します([ a ]であれば[ :a ])。
ただし数字キーに関しては[ :_1 ]のように数字の前にアンダーバーが付随します。これが些細ながらとても悔しい…。

keys?は複数キーの同時判定を行うメソッドで、第一引数に上から3つ(up | down | push)のどれかを指定し、
第二引数以降に判定したいだけのキーを並べていきます。


もうちょい重複記述の削減と、コマンド入力なんかを簡単にしたいので、その辺の拡張が今後加わる予定です。

キーボード入力でアクターの位置を動かしてみる。

Game.loop(title: "Input Sample", fps: 30) { |game|
  game.set_and_run do |scene|
    actor = Actor.load("sample.png")
    # イマココ!
    actor.event.add(:enterframe) {
      actor.x += 1 if Input.key_down?(:right)
      actor.x -= 1 if Input.key_down?(:left)
      actor.y -= 1 if Input.key_down?(:up)
      actor.y += 1 if Input.key_down?(:down)                  
    } 
    # ココマデ!
    scene << actor
}

「actor.event.add」を使う事で、ゲーム内で発生する各種イベントの際のリアクションを登録する事が出来、
ここでは引数に「:enterframe」を指定することで、毎フレームの度に行う処理(キーボード入力)を記述しています。
「actor.x(y) +(-)=」によってアクターの位置を変化させています。なお、これは「actor.x = actor.x +(-) 1」と同じ意味を持ちます。


本来はaddされたリアクションを実行するには、対応するイベントの発生地点から[ torriger ]メソッドを呼び出す必要があるのですが、
前回のtl.update同様、sceneに登録する事で自動化(シーンが呼び出しを肩代わりしてくれる)しています。
eventの詳細な使用方法に関しては、またイベントクラスの解説の際に。


なお、もっと簡単に試す場合は、

actor = Actor.load("sample.png")
Game.loop(title: "Input Sample", fps: 30) { |game|
  actor.x += 1 if Input.key_down?(:right)
  actor.x -= 1 if Input.key_down?(:left)
  actor.y -= 1 if Input.key_down?(:up)
  actor.y += 1 if Input.key_down?(:down)   
  
  game.screen.draw(actor, actor.x, actor.y)
}

という形でも可能です。game.screen.draw(actor, x位置, y位置) によって、アクターが画面に表示されます。
……こっちの形式の説明の方が先だったかもしれない。