[[目次へもどる>PuyoPuyo]]
* もっとすばやく落とそう [#g15a75f3]
#contents

ぷよぷよフィーバー以降((ぷよぷよ7から))では,
ルールによっては上キーを入力することで,下キーよりも高速に落下させることができる.
個人的にこの機能が大好きなので是非実装しよう.

まずはこの入力を受け付ける部分を実装しよう.
#sh(ruby){{
class Human < FieldController
  def input_momentfall?
    @ipt_ctrl.press?(:up)
  end
end
}}
瞬間落下の入力を返すメソッド追加.簡単.
#sh(ruby){{
class FieldController
  def update_control_block
    inputs = [input_move_row?,input_rotate?,
              input_fastfall?,input_momentfall?]
    active = @field.update_control_block(*inputs)
    @phase.change :falldown unless active
  end
  def input_momentfall?; false; end
end
}}
これも入力をコントロールブロックの更新処理に渡すだけ.簡単.

さて,ここで瞬間入力があったときに何をするかを考えよう.
- 落下速度をものすごく上げる
- それ以降は回転処理を受け付けない
- 着地したとき,postponeは無視される

なるほど,これを実現するには瞬間落下の入力があったときにそのコントロールブロックは瞬間落下しかしないようになってしまう.
すなわち瞬間落下のフラグをたててしまうのが得策そうである.
#sh(ruby){{
class ControlBlock
  attr_accessor :momentfall
  def clear
    @postpone = 0
    @momentfall = false
  end
end
}}
コントロールブロックにフラグを追加.

最後に処理のコア部分を追加しよう.
#sh(ruby){{
class Field
  def update_control_block_rotate(ir)
    return true if @cbm.ctrl_block.rotate?
    return false if @cbm.ctrl_block.momentfall
    rotate = @cbm.ctrl_block.can_rotate?(ir, @table, @row_s)
    return false unless rotate
    @cbm.ctrl_block.rotate(rotate, 8)
  end
  def update_control_block_move_y(iff,imf)
    fall_y = @cbm.ctrl_block.can_falldown?(@table, @block_s)
    if fall_y > 0 # fall
      speed = iff ? 6 : 0.8
      speed = imf || @cbm.ctrl_block.momentfall ? 64 : speed
      @cbm.ctrl_block.momentfall = true if imf
      @cbm.ctrl_block.falldown(fall_y > speed ? speed : fall_y)
    elsif fall_y < 0 # dent
      @cbm.ctrl_block.fix_dent(-fall_y)
    else # postpone or land
      if !iff && @cbm.ctrl_block.postpone? && !@cbm.ctrl_block.momentfall
        @cbm.ctrl_block.update_postpone
      elsif !@cbm.ctrl_block.rotate?
        control_block_land
        return false
      end
    end
    return true
  end
end
}}
瞬間落下フラグが立っているときは回転できないようにして,
瞬間落下の入力があるか,瞬間落下フラグが立っているときはやたら落下速度の限界を上げる.
そして瞬間落下フラグが立っているときはpostponeの更新を無視する.

簡単に追加できた.
こんな風に些細な修正で新しい機能が追加できるのは設計が良い証拠・・・かもしれない.

** 実行 [#dc08daf2]
おお快適快適.
#media(PuyoPuyoChap21/PuyoPuyoChap21.flv);


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