SDLUdon Advent HitoriSumotori 3

2日目の記事はudnonkobillyさんによる http://d.hatena.ne.jp/udonkobilly/20131202 でした!
RubySDLゲームライブラリ、SDLUdon(仮名) ver 0.0.2 download(Dropboxの共有リンクへ飛びます) )

もはや実装に解説が完全に追いつけ追い越せのチキンレースの模様を呈しておりますが、今回はマウス入力のお話。

Input#mouse_

Input.mouse_x
Input.mouse_y
Input.mouse_up?(sym=:btn_name)   # ボタンが離された時にtrue
Input.mouse_down?(sym=:btn_name) # ボタンが押されている間にtrue
Input.mouse_push?(sym=:btn_name) # ボタンが押された瞬間にtrue
Input.mouse_moving?
Input.mouse_wheel

[ x, y ]はマウスの座標の取得。

up down push は前回のキー入力と同じ要領で、第一引数にボタンシンボル、

[ :lbtn ](左クリック)、[ :mbtn ](中クリック)、[ :rbtn ](右クリック)を渡す事で、該当するボタンの状態を確認する事が出来ます。


[ moveing? ]はマウスを動かしている間は[ true ]を、止まっている間は[ false ]を返します。


[ wheel ]はマウスホイールを手前に回すと[ 1 ]を、奥へ回すと[ -1 ]を、何もしていない間は[ 0 ]を返します。

マウス入力でアクターの位置を動かしてみる。

actor = Actor.load("sample.png")
Game.loop(title: "Mouse Sample", fps: 30) { |game|
  if Input.mouse_moving?
    actor.x = actor.x + (Input.mouse_x - actor.x) * 0.02
    actor.y = actor.y + (Input.mouse_y - actor.y) * 0.02
  end
  
  if Input.mouse_push?(:lbtn)
    actor.x = Input.mouse_x
    actor.y = Input.mouse_y
  end
  game.screen.draw(actor, actor.x, actor.y)
}

マウスを動かしてる間はアクターがマウス座標に向かって行き、左クリックするとその場所に一気に飛んで来ます。


向かっていくアクターの動きの処理を行っているのが、「 actor.x + (Input.mouse_x - actor.x) * 0.02 」であり、これを「イージング」と呼び、
物体(ここではアクター)が、ある地点まで移動する際の動かし方を指定(あるいは自分で定義)して表現する事が可能になり、
上記の例では、座標に機械的に貼り付くのではなく、意志を持って追いかけてくるような特徴付けを持たせるために使われています。
(正確には、始まりと終わりの間の変化の補間なので、移動に限らず回転や拡大縮小など、時間によって状態が変わる何にでも、幅広く適用されます)
1日目の記事でタイムラインを扱った際、「 actor.tl.move_by(300,300,60) 」という式を扱いましたが、
この中の[ move_by ]においても、内部でイージングを使うことで動きを計算して作っています。


ちなみに前回は引数を3つまでしか使いませんでしたが、本来は4つ目が存在し、それが今説明したイージングの種類の指定となります。
とことで、次回へヒキつつ、短いですが今回はここまで。