[[目次へもどる>PuyoPuyo]] * ControlBlock(着地編) [#g4220240] #contents 現状では落下してちゃんと止まるけど,ずっとそのままなので ちゃんと着地させて次のフェーズに進めるようにしよう. ** 着地について [#r1541eae] ぷよぷよはブロックの落下が止まってしばらくすると着地する. これはコントロールブロックにタイマー@postponeを用意することで実現した. コントロールブロックをセットしたときにタイマーもセットしておく. ブロックの落下がとまるとタイマーが減少し,0になったら着地する. 0になる前なら左右に移動したりできるが,減ったタイマーは戻らない. 着地の処理だが,これはコントロールブロックが持っているブロックをそのまま ブロックの位置に基づいてテーブルに追加すれば良い. #sh(ruby){{ class ControlBlock def set(pivot, *belongs, postpone) @pivot = pivot @belongs = belongs @postpone = postpone end def update_postpone @postpone -= 1 end def postpone?; @postpone > 0; end end }} #sh(ruby){{ class Field def update_control_block return true if @ctrl_block.move_y? if @ctrl_block.can_falldown?(@table) @ctrl_block.falldown(-1, @block_s) else if @ctrl_block.postpone? @ctrl_block.update_postpone else control_block_land return false end end return true end def control_block_land @active_blocks.concat @ctrl_block.blocks @ctrl_block.blocks.each do |block| @table[block.row][block.line] = block end @ctrl_block.clear end end }} ** フェーズの進行 [#i0938ee1] ブロックが着地したらフェーズを:falldownにする. また,落下フェイズは落下が終わると消去フェイズへ進むが, 消去フェイズから次のフェイズへは + 一つも消えたブロックが無ければ:control_blockフェイズ + ブロックが消えればもう一度:falldownフェイズ~ へと進む. これで連鎖が進行する. #sh(ruby){{ class FieldController def update_control_block active = @field.update_control_block @phase.change :falldown unless active end def update_eliminate eliminated = @field.eliminate @phase.change eliminated ? :falldown : :control_block end end }} ** 実行 [#x6637b84] ブロックの操作はできないがとりあえずブロックが積まれていく. #media(PuyoPuyoChap11/PuyoPuyoChap11.flv);