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


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