スターターキットのサンプルを拡張してみる
前に作ったアニメ管理クラスAnimationを使ってみようと思い、DXRubyスターターキットのサンプルが絵はあるのにアニメーションしてなかったなあ、と思い出したのでアニメーションさせてみた。
require 'dxruby' # シンプルなアニメ管理クラス class Animation attr_accessor :loop, :count def initialize @arr = [] @count = 0 @total = 0 @loop = true end # アニメパターン追加。 def add(image, count) @arr.push([image, count]) @total += count self end # 現在のカウントのイメージデータ取得 # loopがtrueならループする。 def image @count = @count % @total if @loop if @total <= @count then @count = @total return @arr.last[0] end temp = 0 @arr.each do |data| temp += data[1] if temp > @count then return data[0] end end end end x = 0 # x座標の変数 y = 0 # y座標の変数 count = 0 # アニメーションのカウント Window.bgcolor = [255, 255, 255, 255] # 背景色設定 image = Image.loadToArray("character.png", 4, 4) # 画像を4*4分割読み込み&配列化 # アニメーションオブジェクトを生成 downanime = Animation.new.add(image[0], 20).add(image[1], 20).add(image[2], 20).add(image[3], 20) rightanime = Animation.new.add(image[4], 20).add(image[5], 20).add(image[6], 20).add(image[7], 20) upanime = Animation.new.add(image[8], 20).add(image[9], 20).add(image[10], 20).add(image[11], 20) leftanime = Animation.new.add(image[12], 20).add(image[13], 20).add(image[14], 20).add(image[15], 20) anime = downanime # アニメーションオブジェクトのどれかが入る Window.loop do break if Input.keyDown?(K_ESCAPE) # Escキーで終了 # 移動とアニメーションオブジェクトの選択 if Input.padDown?(P_LEFT) then x -= 4 anime = leftanime end if Input.padDown?(P_RIGHT) then x += 4 anime = rightanime end if Input.padDown?(P_UP) then y -= 4 anime = upanime end if Input.padDown?(P_DOWN) then y += 4 anime = downanime end anime.count = count + 1 # カウントを進める count = anime.count Window.draw(x, y, anime.image) # data.bmpを座標の位置に表示 end
正直言って、こんなクラス使わずに自分でアニメーション処理書いたほうが簡単だったかもしれない。
今回の場合は、切り替えのタイミングを4方向で共有しようとしたこと、アニメーションさせるキャラが1つしかないことが、その原因だろう。
あと、このクラスは絵ごとに切り替えタイミングを変えれるところがミソだ。
だから使って効果の高いのは、フレームワークに組み込んで自動で移動&アニメーションさせるとか、コードを書くのが面倒なタイミングが複雑に変化する単発のアニメーションとか、そういう感じになるのかもしれない。
ちなみにAnimationクラスを使わないとこんな感じになる。
もっといい書き方があるのかもしれないが、俺も初心者ではないがたいしたことないのでこんなもんだ。
require 'dxruby' x = 0 # x座標の変数 y = 0 # y座標の変数 count = 0 # アニメーションのカウント anime = 0 Window.bgcolor = [255, 255, 255, 255] # 背景色設定 image = Image.loadToArray("character.png", 4, 4) # 画像を4*4分割読み込み&配列化 Window.loop do break if Input.keyDown?(K_ESCAPE) # Escキーで終了 # 移動と配列番号の先頭選択 if Input.padDown?(P_LEFT) then x -= 4 anime = 12 end if Input.padDown?(P_RIGHT) then x += 4 anime = 4 end if Input.padDown?(P_UP) then y -= 4 anime = 8 end if Input.padDown?(P_DOWN) then y += 4 anime = 0 end count += 1 count = 0 if count >= 80 Window.draw(x, y, image[anime + (count / 20)]) # data.bmpを座標の位置に表示 end