[[目次へもどる>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);