アニメーション(落下編) †さあ見た目もいい感じになってきてテンション上がってきました. 次は操作ブロックを・・・と言いたいところだが, その前に連鎖のプロセスを固めてしまおう. アニメーション †ついにアニメーションを導入するぞ! ブロックが消えるときとか落下するときにアニメーションがないと味気ないし,テンポがつかみにくいゲームになってしまう. というわけで,ブロックにアニメーションの属性を追加した. 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
長くて意味わからんが要するに以下の三つのアニメーションを定義した.
コラプスについては次のチャプターで追加する予定. @draw_posは@row,@lineとは独立に,ブロックの描画座標を保持する. 移動アニメーション †移動アニメーション属性の概要は以下の通り(x方向を例にとる)
updateメソッドが呼ばれるとその時のアニメーションの状態に応じて描画座標が更新される. あとはこいつらをフィールドがうまく扱う. 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をフィールドコントローラーから呼び出し,描画位置を更新する. そして,スキマスイッチの時に,アニメーションをセットする. このとき,ブロックの行*1自体はすぐさま更新されている事に注意. これによりデバックなどでアニメーションをガン無視して次のコネクションチェックに移っても問題ない. 実行 †こんなんなる. Loading the player ...
|