もっとすばやく落とそう †ぷよぷよフィーバー以降*1では, ルールによっては上キーを入力することで,下キーよりも高速に落下させることができる. 個人的にこの機能が大好きなので是非実装しよう. まずはこの入力を受け付ける部分を実装しよう. class Human < FieldController def input_momentfall? @ipt_ctrl.press?(:up) end end 瞬間落下の入力を返すメソッド追加.簡単. 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 これも入力をコントロールブロックの更新処理に渡すだけ.簡単. さて,ここで瞬間入力があったときに何をするかを考えよう.
なるほど,これを実現するには瞬間落下の入力があったときにそのコントロールブロックは瞬間落下しかしないようになってしまう. すなわち瞬間落下のフラグをたててしまうのが得策そうである. class ControlBlock attr_accessor :momentfall def clear @postpone = 0 @momentfall = false end end コントロールブロックにフラグを追加. 最後に処理のコア部分を追加しよう. 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の更新を無視する. 簡単に追加できた. こんな風に些細な修正で新しい機能が追加できるのは設計が良い証拠・・・かもしれない. 実行 †おお快適快適. Loading the player ...
|