目次へもどる

ControlBlock?(着地編)

現状では落下してちゃんと止まるけど,ずっとそのままなので ちゃんと着地させて次のフェーズに進めるようにしよう.

着地について

ぷよぷよはブロックの落下が止まってしばらくすると着地する. これはコントロールブロックにタイマー@postponeを用意することで実現した. コントロールブロックをセットしたときにタイマーもセットしておく. ブロックの落下がとまるとタイマーが減少し,0になったら着地する. 0になる前なら左右に移動したりできるが,減ったタイマーは戻らない.

着地の処理だが,これはコントロールブロックが持っているブロックをそのまま ブロックの位置に基づいてテーブルに追加すれば良い.

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
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

フェーズの進行

ブロックが着地したらフェーズを:falldownにする. また,落下フェイズは落下が終わると消去フェイズへ進むが, 消去フェイズから次のフェイズへは

  1. 一つも消えたブロックが無ければ:control_blockフェイズ
  2. ブロックが消えればもう一度:falldownフェイズ
    へと進む. これで連鎖が進行する.
    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
    

実行

ブロックの操作はできないがとりあえずブロックが積まれていく.

Loading the player ...

添付ファイル: filePuyoPuyoChap11.flv 617件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-30 (金) 22:10:42 (3904d)