[[目次へもどる>PuyoPuyo]]
* アニメーション(落下編) [#w460fc3f]
#contents

さあ見た目もいい感じになってきてテンション上がってきました.
次は操作ブロックを・・・と言いたいところだが,
その前に連鎖のプロセスを固めてしまおう.

** アニメーション [#l90b84ac]
ついにアニメーションを導入するぞ!

ブロックが消えるときとか落下するときにアニメーションがないと味気ないし,テンポがつかみにくいゲームになってしまう.
というわけで,ブロックにアニメーションの属性を追加した.
#sh(ruby){{
class Block
  def initialize(col)
    @color = col
    @row = -1
    @line = -1
    init_animation
  end
  def init_animation
    @move_x = nil
    @move_y = nil
    @collapse = nil
    @draw_pos = [0,0]
  end
  def set_move_x(from, to, speed)
    @move_x = {
      :from => from,
      :to => to,
      :speed => speed,
      :counter => 0
    }
  end
  def set_move_y(from, to, speed)
    @move_y = {
      :from => from,
      :to => to,
      :speed => speed,
      :counter => 0
    }
  end
  def set_collapse
    
  end
  
  def update_move(param)
    return nil unless param
    pos = param[:from] + param[:counter] + param[:speed]
    param[:counter] += param[:speed]
    if param[:speed] > 0
      (pos = param[:to]; param = nil) if pos > param[:to]
    else
      (pos = param[:to]; param = nil) if pos < param[:to]
    end
    return pos
  end

  def update(block_s)
    x = update_move(@move_x)
    y = update_move(@move_y)
    @draw_pos[0] = x ? x : @row * block_s
    @draw_pos[1] = y ? y : @line * block_s
  end

  def draw(ox,oy,block_s)
    x = ox + @draw_pos[0]
    y = oy - @draw_pos[1]
    screen = GameMain.screen
    screen.render_rect(x, y, block_s, block_s, get_color)
  end
end
}}
長くて意味わからんが要するに以下の三つのアニメーションを定義した.
+ x方向の移動
+ y方向の移動
+ コラプス(消滅)

コラプスについては次のチャプターで追加する予定.

@draw_posは@row,@lineとは独立に,ブロックの描画座標を保持する.

** 移動アニメーション [#r2e967c9]
移動アニメーション属性の概要は以下の通り(x方向を例にとる)
- @move_xがnilならアニメーションしていない
- そうでないなら@move_xには以下の情報をもつハッシュが格納されている
++ from:移動元座標(フィールドの座標を原点とした相対座標)
++ to:移動先座標(フィールドの座標を原点とした相対座標)
++ speed:1フレームにどんだけ進むか
++ counter:今までに進んだ距離

updateメソッドが呼ばれるとその時のアニメーションの状態に応じて描画座標が更新される.

あとはこいつらをフィールドがうまく扱う.
#sh(ruby){{
class Field
  def update_blocks
    @blocklist.each do |block|
      block.update(@block_s)
    end
  end

  def falldown_line(r)
    return unless @table[r].compact!
    @fallen = true
    @table[r].each.with_index do |block, l|
      next if block.line == l
      block.set_move_y(block.line * @block_s, l * @block_s, -4)
      block.line = l
    end
  end
end
}}
毎フレームupdate_blocksをフィールドコントローラーから呼び出し,描画位置を更新する.
そして,スキマスイッチの時に,アニメーションをセットする.

このとき,ブロックの行((block.line))自体はすぐさま更新されている事に注意.
これによりデバックなどでアニメーションをガン無視して次のコネクションチェックに移っても問題ない.

** 実行 [#jb2101d6]
こんなんなる.
#media(PuyoPuyoChap7/PuyoPuyoChap7.flv);


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS