スターターキットのサンプルを拡張してみる

前に作ったアニメ管理クラス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