[[目次へもどる>PuyoPuyo]] * アニメーション(消滅編) [#mcb9f7a1] #contents ** コラプス [#d54573fc] っつーわけで次はコラプスのアニメーションを作ろう. コラプスの属性は以下の通り. - @collapseがnilならアニメーションしていない - そうでないなら@collapseには以下の情報を持つハッシュが格納されている ++ time: アニメーションの時間(フレーム数) ++ counter: 時間経過をカウントするやつ まあ今回はとりあえず簡易的にだんだん透明にしていくことにしておいて, ブロックを描画するときにコラプス中であればcounterに基づいて透明度を設定すればいい. ** コラプス中のブロックの扱い [#e6137e95] むしろアニメーション自体よりこっちが問題である. ブロックは消去された瞬間に@blocklistから削除される. すると,消去されたブロックは描画されなくなってしまい,アニメもなにも無くなってしまう. ではコラプスが終わったらblocklistから削除すれば良いのでは? 実はこれもあまりいい作戦では無い.なぜなら消去されたブロックがblocklistに残っている以上,次のフェーズに進めないからだ. すなわちコラプスアニメーションが終わるまでただ座して待つしかない. これだと任意の長さのコラプスアニメが将来作れなくなり拡張性が無くなる. そこで次の方針をとる. - 現状のblocklistをactive_blocksと改名し,フィールドで有効なブロックの一覧とする - 消去されたブロックはコラプスアニメーションがセットされた後,active_blocksからcollapse_blocksへ移され,アニメーションの更新と描画のみ行われる. - collapse_blocks内のブロックはコラプスが終わり次第リストから削除される. これによりコラプス中か判定するメソッドcollapse?を任意に変えることでコラプス終了のタイミングを調整でき,かつコラプスアニメーションをガン無視して次のフェーズに進んでも整合性は保たれる. #sh(ruby){{ class Field def init_blocklist @active_blocks = [] @collapse_blocks = [] end def eliminate_connection @connect_table.each do |connection| next if connection.size < 4 @eliminated = true # check flag connection.each do |block| block.set_collapse(40) @table[block.row][block.line] = nil @active_blocks.delete block @collapse_blocks.push block end end end end }} ** 実行 [#mbdbfa0d] いい感じにアニメーションできている. #media(PuyoPuyoChap8/PuyoPuyoChap8.flv);