(有)胡桃沢製作所 made in "naha"

トップページ > Ruby > level3



イベント処理


add_event(イベント・タイプ){イベント発生時の処理}

引数(イベント・タイプ)が発生した時に、後ろの処理を行います
イベント・タイプには次のようなものがあります
イベント・タイプ 条件
:mouse_button_down マウス・ボタンを押したとき
:mouse_button_up マウス・ボタンを離したとき
:mouse_motion マウスを動かしたとき
:key_down キーボードを押したとき
:key_up キーボードを離したとき

キー入力

押されている間は反応

上のイベント処理では、「キーが押されたこと」は分かっても、「何が押されたか」は分かりません
なので、キーの検出には次のメソッドを使います

 key_pressed?(Key::キー定数)

設定したキー定数が押されたときにtrueを返します
キー定数には次のものがあります

キー定数 対応キー
ESCAPE エスケープ
SPACE スペース
K0~K9 0~9
A~Z a~z
UP
DOWN
RIGHT
LEFT

押された瞬間のみ反応

Wave.playなどは、上のメソッドを使うとエラーが起こります(理由は講座資料を参照)
よって、新規に押されたキーを検出する必要があります

new_key_pressed?(Key::キー定数)

キーが押されて無い状態から、押された状態に切り替わった瞬間だけtrueを返します

メイン・ループ


基本ループ

自分でループ処理を書く場合、次のようにします


main_loop do
 ループ内の処理
end

do~endの間で「描画等の処理 → 破棄 →再描画」を繰り返します

例
main_loop do

Image.render("sample.bmp")

end


オブジェクトを使ったループ

Image.newのようなオブジェクト化は、メイン・ループの外で行わなければなりません
つまり


img = Image.new("sample.bmp")

main_loop do

img.render

end

こうなるわけです

ループの周期

デフォルトでは、、1秒間に60フレーム(回)のループ処理が行われますが、
この周期は変更が出来ます

main_loop(30) do

      ループ内の処理

end

「main_loop」の後ろに、ループ周期を指定します

(注)ループ回数が多いほど、処理落ちが発生しやすくなります

アニメーション

まずはこの画像を見てください

思い切り拝借品ですが、今回はこれを使って、3カウントを取りたいと思います

画像サイズの設定

今回の画像は1パターン「100×100」ドットなので、画像の描画サイズを
「100×100」に設定します

img = Image.new("animation.bmp", :w => 100, :h => 100

アニメーションの設定

アニメーション機能を使うには、アニメーション・パターンを登録する必要があります
その際、画像オブジェクトに対して「add_animation」メソッドを使います

img.add_animation(:roll => [20, [0,1,2] ])

:rollはアニメーションの名前で、:roll以外の名前でも問題ありません
その後ろに切り替え時間(フレーム)とパターン番号を列挙します
(パターン番号は、左上から順に設定したサイズ分画像を取って、取れなくなった時点で1段下がってまた左順に取って行きます)

パターンのフォーマットは、次のようなルールになっています

[切り替え時間, [パターン1, パターン2・・・], ジャンプ先(省略可)]

複数のアニメーション・パターンがある場合、それぞれのアニメーションにジャンプ出来ます
ジャンプ先(アニメーションの名前)を設定すると、アニメーション再生後に設定したアニメーションを続けて再生出来ます
ジャンプ先を省略すると、今のアニメーションを繰り返し再生します

アニメーションの開始

それでは、登録したアニメーションを再生させましょう
再生には「start_animation」メソッドを使います

img.start_animation :roll

前に使った画像オブジェクト、後ろにアニメーションの名前を渡します
なお、アニメーションには「update」メソッドが必須です

img.update

これがメイン・ループ内に無いと、アニメーションが更新(正常作動)されません
もちろん、img.renderも忘れずにupdateの下に書き加えてください
今回のアニメーションはジャンプ先を設定していないので、20フレーム毎に「1,2,3,1,2,3・・・」を繰り返します
なお、アニメーションメソッドはメイン・ループの外で定義してください

メソッド


メソッドの定義

さて、ここまで来ると「オリジナルのメソッドが欲しいな」と思う頃です
Rubyでのメソッドの定義はこのように行います

def メソッド名(引数)

    メソッドが行う処理

end

メソッド名は英数字とアンダースコアが使えますが、先頭に数字は使えません

メソッドを呼び出す

呼び出すのは簡単です

例
def puts_Hello

puts "Hello"

end


puts_Hello

こんな感じで、定義後にメソッド名を書くだけで完了です
もちろんCと同じで、定義は呼び出す前に書いてください

引数を受け取るメソッド

これもそう難しくはありません

def puts_number(a)

puts "#{a}が入力されました"

end


puts_number(2)


[実行結果]

2が入力されました

先ほどの一般例のように、括弧内に引数を渡せばOKです
カンマ(,)で区切れば、複数の引数も受け取れます

def add_number(a,b,c)

puts a+b+c

end


add_number(3,2,5)


[実行結果]

10

添付ファイル