# <とりかさんのコルノートvol_2:コルの基本:モーションとアニメーションとあたり判定>
# CoRにおける基本のスプライトの移動とアニメ動作、あたり判定についてまとめました。
#
# モーションとアニメーションはリファレンスの中でも特別分けて書かれている通り、
# CoRでのゲーム制作に重要な部分を占めるので使いこなしてほしいですー。
# 当たり判定はいわずもがな。
# リファレンス内ではより詳しい設定を可能とするメソッドが数多くあるので、
# 必要な処理があるならまずリファレンスの設定可能内容と相談しましょう。
# コルノートvol_1での解説内容は省略しております。
# なおどこがどんな処理なのかをコメントで書いておくと色々と便利。
# <Check!>
# draw_collision_mode() メソッド
# 衝突判定のオブジェクトを描画します。gameクラスには動作確認用のメソッドが多く、
# テストプレイ時には常にオンにしておくと便利です。
# 衝突判定オブジェクトは赤い枠で表示されます。
game.draw_collision_mode true
# ゲームに使用する画像のローディング
game.loading do |loader|
loader.add :window, :system => "window"
loader.add :gui_item, :system => "gui_item"
loader.add :human_image, 53
end
# ゲームの初期化
game.on_init do
set_window_image :window
set_gui_image :gui_item
# オープニングのシーンへ
scene_change :start_scene
end
# オープニングシーン
scene :start_scene do |scene|
scene.on_init do
# スプライトの追加
# <Check!>
# :center_position => [x, y] でスプライトを表示する際の中心座標が指定できる。
# 中心座標の設定はテンプレート内で設定可能で画像の真ん中でない設定も可能。
# これを指定しなかった場合 :position => [0,0] が入っているものと同じになる。
# :position => [x, y] はスプライトを表示する際に画像の左上位置を指定する。
# すなわち :center_position 指定なしだと、
# 画面右上に画像の右上座標をそろえたものが表示される。
# なお、追加機能は多岐にわたるので詳しくはリファレンスで調べてほしい。
sp = scene.add :image, :template => :human, :center_position => [16, 16]
# <Check!>
# event(指定動作)メソッド
# インスタンスに対して指定動作が実行されたときに呼び出されます。
# 今回は :on_click なので human をタップしたときです。
sp.event :on_click do |event|
# モーション変更
event.target.change_motion :stop
speak "こんにちわ!"
speak("ソースファイルに今回のコードの詳しい説明とかありますー。")
# ゲーム終了
game.change_project "start_menu"
end
# <Check!>
# speak文の最中でもスプライトはアニメーションしたり、動作したりし続けます。
# ただし文字を読み飛ばす際にクリック必須なのでその他の入力関係とは相性が悪いです。
speak("CoR animation now!!")
speak("移動しているキャラクターをタップしてね!")
end
end
# 表示する人間のテンプレート
sprite_template :human do |st|
st.texture :human_image
# src_size アニメーションで使う
st.src_size 32, 32
st.dest_size 64, 64
# center_offset(a) には中心座標への表示に使われる中心位置を設定できる。
# 設定しない場合中心位置は [0, 0] つまり画像の左上になる。
st.center_offset 32/2, 32/2
# <Check!>
# collision() メソッド
# 当たり判定情報の設定を行うメソッドです。形状は四角か丸が選べます。
# リファレンスを見た方がいろいろとわかりやすいです。
# インスタンスの座標に追従してくれるのでとっても便利。
# テンプレート同士のぶつかり合いも設定できます。
st.collision :rect, :position => [0, 0], :width => [64, 64]
# <Check!>
# animation(アニメーションの呼出名) メソッド
# アニメーション用のコマンドリストを定義します。
# コマンドリストはスプライトテンプレートで定義される処理の記述方法で、低負荷。
# アニメーションは画像の表示を行い、RPGの爆発や歩行アニメなどをサポートします。
# 内部に何もなくてもエラーは出ないです。
st.animation :down do |commands|
# loop(true or false) メソッド
# アニメーションがループするかどうかの設定。
# true でループ、false でループしない。設定しなかった場合は true になる。
# つまりなくても動作はする。
commands.loop true
# <Check!>
# copy_rect() メソッド
# :flame => x には表示するフレーム数が設定できる。
# 設定するだけで表示するには別のメソッドが必要。
# :src => [x, y] テンプレートの src_size で画像を区切った際、
# [横番号, 縦番号] の位置にある画像を利用する。なお番号は 0 から始まる。
commands.copy_rect :frame => 16, :src => [0, 0]
# <Check!>
# wait_animation() メソッド
# 現在設定されているアニメーションの完了を待つメソッドです。
# これがないとアニメーションが始まる前に次のアニメーションが始まるため、
# 思い通りのアニメーションをさせる際は必須になります。
commands.wait_animation
commands.copy_rect :frame => 16, :src => [1, 0]
commands.wait_animation
end
st.animation :up do |commands|
commands.loop true
commands.copy_rect :frame => 16, :src => [0, 3]
commands.wait_animation
commands.copy_rect :frame => 16, :src => [1, 3]
commands.wait_animation
end
st.animation :left do |commands|
commands.loop true
commands.copy_rect :frame => 16, :src => [0, 1]
commands.wait_animation
commands.copy_rect :frame => 16, :src => [1, 1]
commands.wait_animation
end
st.animation :right do |commands|
commands.loop true
commands.copy_rect :frame => 16, :src => [0, 2]
commands.wait_animation
commands.copy_rect :frame => 16, :src => [1, 2]
commands.wait_animation
end
# <Check!>
# motion(モーションの呼出名) メソッド
# モーション用のコマンドリストを定義します。
# コマンドリストはスプライトテンプレートで定義される処理の記述方法で、低負荷。
# モーションは、スプライトの動きを指します。
# 縦に移動する、回転するというような動作を記述します。
# モーションもアニメーションも呼出名を default にすると初期状態の設定が可能です。
# 初期状態の設定がない時にアニメ・モーション状態を変更しない場合には、
# 当然ぴくりともうごかないので注意してくださいー。
st.motion :default do |commands|
# loop(true or false) メソッド
# モーションがループするかどうかの設定。
# true でループ、false でループしない。設定しなかった場合は false になる。
# アニメーションとは逆。なくても動作はするけど毎回きちんと設定するのが吉。
commands.loop true
# <Check!>
# proc_call() メソッド
# コマンドのリストではなく、プログラムで制御したい場合に使うメソッドです。
# コマンドリストで使うことができるメソッド(move_to)で制御するよりも低速ですが、
# 自由度が高いため複雑な制御をする場合に使うといいです。
# ここではスプライトのアニメーション状態の設定を行っています。
# 歩行アニメを作るためには必須だったりします。
commands.proc_call do |sprite|
# <Check!>
# change_animation(アニメーション名) メソッド
# アニメーションの実行コマンドリストを変更します。アニメーション名を指定してね。
sprite.change_animation :down
end
# <Check!>
# move_to_v(x, y, s) メソッド
# 指定した場所に、指定した速度で移動します。
# x, y には移動先の座標、s には1フレーム当たりの移動速度が入ります。
# なお移動系のメソッドは数種類あるのでお好みの処理をどうぞ。
commands.move_to_v 0, 450 - 64, 4
# <Check!>
# wait_motion() メソッド
# 現在設定されているモーションの完了を待つメソッドです。
# これがないとモーションが始まる前に次のモーションが始まるため、
# 思い通りのモーションをさせる際は必須になります。
commands.wait_motion
commands.proc_call do |sprite|
sprite.change_animation :right
end
commands.move_to_v 800 - 64, 450 - 64, 4
commands.wait_motion
commands.proc_call do |sprite|
sprite.change_animation :up
end
commands.move_to_v 800 - 64, 0, 4
commands.wait_motion
commands.proc_call do |sprite|
sprite.change_animation :left
end
commands.move_to_v 0, 0, 4
commands.wait_motion
end
# 移動停止状態
st.motion :stop do |commands|
commands.loop false
commands.move_to_v 400, 200, 4
commands.wait_motion
commands.proc_call do |sprite|
sprite.change_animation :down
end
end
end