PuyoPuyoChap9
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[目次へもどる>PuyoPuyo]]
* フェーズ管理を便利にしよう [#t0aa84a6]
#contents
アニメーションもできてなかなか良くなってきた.
が,ここで現状のフェーズ管理について考えてみる.
まず現在フェーズは:falldownと:eliminateの二つがあり,
それぞれ次のフェーズに移るには
+ すべてのブロックの落下アニメーションが終わっているか
+ すべてのブロックのコラプスが終わっているか
この条件を満たさなければならない.
また,次のチャクターでは操作ブロックを導入するが,これの...
これらをまとめると,フェーズの遷移には次の項目が予想され...
+ フェーズが遷移した時の開始処理
+ フェーズが遷移するための条件(満たさない場合は満たすまで...
+ フェーズが遷移する時の終了処理
これらの処理を,フェーズ遷移メソッドを呼ぶだけで全部やっ...
そんな人いるのかと思ったら作ればよい.
#sh(ruby){{
class Phase
def initialize
@start_handler = {} # call method when phas...
@end_handler = {} # call method before ph...
@trans_condition_handler = {} # call method of phase ...
@phase = nil # present phase
@next_phase = nil # next phase
end
def add_start_handler(phase, method)
@start_handler[phase] = method
end
def add_end_handler(phase, method)
@end_handler[phase] = method
end
def add_condition_handler(prephase, nextphase, cond)
@trans_condition_handler[[prephase,nextphase]] = cond
end
def phase
@next_phase ? :phase_trans : @phase
end
def trans_condition_check
cond = @trans_condition_handler[[@phase,@next_phase]]
return if cond && !cond.call
@phase = @next_phase
@next_phase = nil
# start handler
method = @start_handler[@phase]
method.call if method
end
def change(phase)
# end handler
method = @end_handler[@phase]
method.call if method
# set next_phase
@next_phase = phase
# trans condition check
trans_condition_check
end
end
}}
Phaseクラスはフェーズとその遷移を管理するクラスである.
@start_handlerはフェーズ名から開始処理メソッドへのハッシ...
@end_handlerはフェーズ名から終了処理メソッドへのハッシュ...
@trans_condition_handlerは遷移元フェーズ名と遷移先フェー...
もし,条件メソッドがfalseを返した場合はひとまずフェーズを...
#sh(ruby){{
class FieldController
def init_phase
@phase = Phase.new
# added :control_block handler
@phase.add_start_handler(:control_block,
method(:start_control_block))
# added :falldown handler
@phase.add_condition_handler(:falldown,
:eliminate,
method(:falldown_elimina...
# added :elimiate handler
@phase.add_condition_handler(:eliminate,
:falldown,
method(:eliminate_falldo...
@phase.change :falldown
end
def update
update_blocks
draw_field
return if update_wait
case @phase.phase
when :phase_trans
@phase.trans_condition_check
when :control_block
update_control_block
when :falldown
update_falldown
when :eliminate
update_eliminate
end
end
def update_falldown
fallen = @field.falldown
@phase.change :eliminate
end
def update_eliminate
eliminated = @field.eliminate
@phase.change eliminated ? :falldown : :control_block
end
def falldown_eliminate_cond
# wait fall animation
!@field.blocks_move?
end
def eliminate_falldown_cond
# wait collapse animation
!@field.blocks_reasonable_collapse?
end
end
}}
これでフェーズの管理が容易になった.
必然的に開始処理や終了処理が分割され,かつフェーズの遷移...
終了行:
[[目次へもどる>PuyoPuyo]]
* フェーズ管理を便利にしよう [#t0aa84a6]
#contents
アニメーションもできてなかなか良くなってきた.
が,ここで現状のフェーズ管理について考えてみる.
まず現在フェーズは:falldownと:eliminateの二つがあり,
それぞれ次のフェーズに移るには
+ すべてのブロックの落下アニメーションが終わっているか
+ すべてのブロックのコラプスが終わっているか
この条件を満たさなければならない.
また,次のチャクターでは操作ブロックを導入するが,これの...
これらをまとめると,フェーズの遷移には次の項目が予想され...
+ フェーズが遷移した時の開始処理
+ フェーズが遷移するための条件(満たさない場合は満たすまで...
+ フェーズが遷移する時の終了処理
これらの処理を,フェーズ遷移メソッドを呼ぶだけで全部やっ...
そんな人いるのかと思ったら作ればよい.
#sh(ruby){{
class Phase
def initialize
@start_handler = {} # call method when phas...
@end_handler = {} # call method before ph...
@trans_condition_handler = {} # call method of phase ...
@phase = nil # present phase
@next_phase = nil # next phase
end
def add_start_handler(phase, method)
@start_handler[phase] = method
end
def add_end_handler(phase, method)
@end_handler[phase] = method
end
def add_condition_handler(prephase, nextphase, cond)
@trans_condition_handler[[prephase,nextphase]] = cond
end
def phase
@next_phase ? :phase_trans : @phase
end
def trans_condition_check
cond = @trans_condition_handler[[@phase,@next_phase]]
return if cond && !cond.call
@phase = @next_phase
@next_phase = nil
# start handler
method = @start_handler[@phase]
method.call if method
end
def change(phase)
# end handler
method = @end_handler[@phase]
method.call if method
# set next_phase
@next_phase = phase
# trans condition check
trans_condition_check
end
end
}}
Phaseクラスはフェーズとその遷移を管理するクラスである.
@start_handlerはフェーズ名から開始処理メソッドへのハッシ...
@end_handlerはフェーズ名から終了処理メソッドへのハッシュ...
@trans_condition_handlerは遷移元フェーズ名と遷移先フェー...
もし,条件メソッドがfalseを返した場合はひとまずフェーズを...
#sh(ruby){{
class FieldController
def init_phase
@phase = Phase.new
# added :control_block handler
@phase.add_start_handler(:control_block,
method(:start_control_block))
# added :falldown handler
@phase.add_condition_handler(:falldown,
:eliminate,
method(:falldown_elimina...
# added :elimiate handler
@phase.add_condition_handler(:eliminate,
:falldown,
method(:eliminate_falldo...
@phase.change :falldown
end
def update
update_blocks
draw_field
return if update_wait
case @phase.phase
when :phase_trans
@phase.trans_condition_check
when :control_block
update_control_block
when :falldown
update_falldown
when :eliminate
update_eliminate
end
end
def update_falldown
fallen = @field.falldown
@phase.change :eliminate
end
def update_eliminate
eliminated = @field.eliminate
@phase.change eliminated ? :falldown : :control_block
end
def falldown_eliminate_cond
# wait fall animation
!@field.blocks_move?
end
def eliminate_falldown_cond
# wait collapse animation
!@field.blocks_reasonable_collapse?
end
end
}}
これでフェーズの管理が容易になった.
必然的に開始処理や終了処理が分割され,かつフェーズの遷移...
ページ名: