PuyoPuyoChap20
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[目次へもどる>PuyoPuyo]]
* 着地アニメーション [#pcc48360]
#contents
次は着地アニメーションを考えてみよう.
ぷよぷよフィーバー以降ではなんかブロックが着地したときに,
下にあるブロックとかも一緒にぐにゃって沈む.
これをy座標を変化させることで簡易的に表現してみよう.
** landアニメーション [#ad457116]
このアニメーションもステーブルブロックのアニメなので((コ...
#sh(ruby){{
class StableBlock < Block
def init_animation
@move_x = nil
@move_y = nil
@move_y_wait = nil
@collapse = nil
@land = nil
@draw_pos = [0,0]
end
def set_land(block, depth, time)
time_divide = Math::PI / time
rad = 0
shifts = []
time.times do
rad += time_divide
shifts.push(-Math.sin(rad) * depth)
end
@land = {
:fallblock => block,
:shifts => shifts
}
end
def set_dummy_flag block; set_land(block, 0, 2); end
def update_land
return nil unless @land
return nil if @land[:fallblock].move_y?
y_shift = @land[:shifts].shift
@land = nil if @land[:shifts].empty?
return y_shift
end
def update
# update move_y_wait
y_wait = update_move_y_wait
# update move_x move_y
x = update_move(@move_x){@move_x = nil}
y = y_wait ? @draw_pos[1] : update_move(@move_y){@mov...
@draw_pos[0] = x ? x : @row * @block_s
@draw_pos[1] = y ? y : @line * @block_s
# update land
y_shift = update_land unless move_y?
@draw_pos[1] += y_shift if y_shift
# update collapse
update_collapse
end
end
}}
地味に[[前章>PuyoPuyoChap19]]で定義したウェイトアニメーシ...
そして実際そうなっている.
*** set_land [#p07aaa6f]
引数にblock,depth,timeをとっている.
depthはぐにゃってなる深さで,timeはアニメーション時間だろ...
一番怪しいのはblockである.
こいつはこのメソッド内ではなにもされずに:fallblockの値と...
もう一つの重要な値shiftsについて見てみると,どうも構造が...
回転アニメーションと同様に毎フレームのシフト量を配列にし...
ここで気をつけなければいけないのが,ステーブルブロックは...
x,y方向共にrow,lineの値を基準にして毎フレーム描画座標が...
y方向に関するshiftsでも毎フレームごとの移動量ではなくシフ...
*** set_dummy_flag [#pdccfeae]
なんだこれ.set_land(block,0,2).
深さ0でアニメーション時間が2フレームのアニメをセットして...
まあ名前的にダミーの何か特別な状態を表すフラグとして着地...
*** update_land [#q994f7b0]
ここでいよいよさっきのblockを使っている.
まず,着地アニメーションがセットされていなければもちろん...
次に,block.move_y?なら何もしない.
なにやらブロックがy方向に動いてなければ着地アニメを更新す...
着地アニメーションの更新は回転アニメーションと同様に先頭...
:fallblockの正体を確かめるにはフィールド側の着地アニメー...
** フィールド側の処理 [#d63c8b83]
*** control_block_land [#i33626d0]
#sh(ruby){{
class Field
def control_block_land
stable_blocks = @cbm.ctrl_block.blocks.map{|block| bl...
@active_blocks.concat stable_blocks
stable_blocks.each do |block|
@table[block.row][block.line] = block
block.set_dummy_flag(block) # set dummy fall flag
end
@cbm.ctrl_block.clear
end
end
}}
はぁん,なるほど.コントロールブロックから変換されたステ...
つまりこのダミーフラグはコントロールブロックから変換され...
*** falldown_line [#u42daad6]
#sh(ruby){{
class Field
def falldown_line(r)
@fallen = @table[r].compact! ? true : false
stable,fall = @table[r].partition.with_index{|block, l|
block.line == l && !block.land? # dummy flag
}
return if fall.empty?
# fall list animation
impact = 16
wait = 0
base = stable.size
fall.each.with_index do |block, i|
l = base + i
imp = l < 2 ? l * 6 : impact
block.set_land(block, imp, 16)
if block.line != l
block.set_move_y_wait(wait) if wait != 0
block.set_move_y(block.line * @block_s, l * @bloc...
block.line = l
wait += 3
end
end
# stable list animation
fallen_block = fall.first
stable.reverse.each.with_index do |block, i|
break if impact <= 0
l = base - (i + 1)
impact = l * 6 if impact > l * 6
block.set_land(fallen_block, impact, 16)
impact /= 2
end
end
end
}}
このメソッドは大幅に変更されている.
まずは今までと同様にcompact!メソッドで列にスキマスイッチ(...
次の部分では処理を施した列に対してパーティションをかけて...
Rubyのpartitionメソッドはある配列をブロックで与えられた条...
ここではblock.lineがテーブル上の行と同じ,かつブロックに...
すなわち,''落下しないブロックで,元コントロールブロック...
さらに言うならばfallによってぐにゃってなる着地アニメーシ...
fallが空ならこれ以上やることはないので終了する.
まず先にfallを処理している.
こいつらはほとんど今までの落下処理を行っているにすぎない.
ただし,新しく着地アニメーションがセットされている.
とりあえずimpactが着地アニメの深さのマックスの値なんだろ...
そして落下後の行に応じて実際にセットする深さを変えている.
これはすなわち,一番下あたりの行の場合を考慮している.
たとえば一番下に落下した場合,それ以上沈みようが無いので...
そしてset_landの最初の引数に自分自身を指定している.
うん,これで謎が解けたはずだ.
着地アニメーションでは:fallblockのy方向の移動がセットされ...
つまり,ブロックの落下が終わったら着地アニメーションを進...
ちなみに元コントロールブロックにセットされたダミーフラグ...
fallが終わったらstableの処理.
こいつらはfallによって衝撃をあたえられて沈む.
なので直に衝撃を与えてくるブロック,すなわちfallのうち一...
そして衝撃は上から順番に伝搬してくるので,stableは逆順((...
まず,fallの時と同じように行の位置によっては深さを調節し...
そして着地アニメーションをセットするのだが,今回は落下し...
最後にimpactを半分にしているが,これは衝撃は下に行くにつ...
** 実行 [#u429a0c8]
ずいぶんリッチな感じになって来た.
#media(PuyoPuyoChap20/PuyoPuyoChap20.flv);
調子のって本気で連鎖くんでみたらブランクを感じざるを得な...
終了行:
[[目次へもどる>PuyoPuyo]]
* 着地アニメーション [#pcc48360]
#contents
次は着地アニメーションを考えてみよう.
ぷよぷよフィーバー以降ではなんかブロックが着地したときに,
下にあるブロックとかも一緒にぐにゃって沈む.
これをy座標を変化させることで簡易的に表現してみよう.
** landアニメーション [#ad457116]
このアニメーションもステーブルブロックのアニメなので((コ...
#sh(ruby){{
class StableBlock < Block
def init_animation
@move_x = nil
@move_y = nil
@move_y_wait = nil
@collapse = nil
@land = nil
@draw_pos = [0,0]
end
def set_land(block, depth, time)
time_divide = Math::PI / time
rad = 0
shifts = []
time.times do
rad += time_divide
shifts.push(-Math.sin(rad) * depth)
end
@land = {
:fallblock => block,
:shifts => shifts
}
end
def set_dummy_flag block; set_land(block, 0, 2); end
def update_land
return nil unless @land
return nil if @land[:fallblock].move_y?
y_shift = @land[:shifts].shift
@land = nil if @land[:shifts].empty?
return y_shift
end
def update
# update move_y_wait
y_wait = update_move_y_wait
# update move_x move_y
x = update_move(@move_x){@move_x = nil}
y = y_wait ? @draw_pos[1] : update_move(@move_y){@mov...
@draw_pos[0] = x ? x : @row * @block_s
@draw_pos[1] = y ? y : @line * @block_s
# update land
y_shift = update_land unless move_y?
@draw_pos[1] += y_shift if y_shift
# update collapse
update_collapse
end
end
}}
地味に[[前章>PuyoPuyoChap19]]で定義したウェイトアニメーシ...
そして実際そうなっている.
*** set_land [#p07aaa6f]
引数にblock,depth,timeをとっている.
depthはぐにゃってなる深さで,timeはアニメーション時間だろ...
一番怪しいのはblockである.
こいつはこのメソッド内ではなにもされずに:fallblockの値と...
もう一つの重要な値shiftsについて見てみると,どうも構造が...
回転アニメーションと同様に毎フレームのシフト量を配列にし...
ここで気をつけなければいけないのが,ステーブルブロックは...
x,y方向共にrow,lineの値を基準にして毎フレーム描画座標が...
y方向に関するshiftsでも毎フレームごとの移動量ではなくシフ...
*** set_dummy_flag [#pdccfeae]
なんだこれ.set_land(block,0,2).
深さ0でアニメーション時間が2フレームのアニメをセットして...
まあ名前的にダミーの何か特別な状態を表すフラグとして着地...
*** update_land [#q994f7b0]
ここでいよいよさっきのblockを使っている.
まず,着地アニメーションがセットされていなければもちろん...
次に,block.move_y?なら何もしない.
なにやらブロックがy方向に動いてなければ着地アニメを更新す...
着地アニメーションの更新は回転アニメーションと同様に先頭...
:fallblockの正体を確かめるにはフィールド側の着地アニメー...
** フィールド側の処理 [#d63c8b83]
*** control_block_land [#i33626d0]
#sh(ruby){{
class Field
def control_block_land
stable_blocks = @cbm.ctrl_block.blocks.map{|block| bl...
@active_blocks.concat stable_blocks
stable_blocks.each do |block|
@table[block.row][block.line] = block
block.set_dummy_flag(block) # set dummy fall flag
end
@cbm.ctrl_block.clear
end
end
}}
はぁん,なるほど.コントロールブロックから変換されたステ...
つまりこのダミーフラグはコントロールブロックから変換され...
*** falldown_line [#u42daad6]
#sh(ruby){{
class Field
def falldown_line(r)
@fallen = @table[r].compact! ? true : false
stable,fall = @table[r].partition.with_index{|block, l|
block.line == l && !block.land? # dummy flag
}
return if fall.empty?
# fall list animation
impact = 16
wait = 0
base = stable.size
fall.each.with_index do |block, i|
l = base + i
imp = l < 2 ? l * 6 : impact
block.set_land(block, imp, 16)
if block.line != l
block.set_move_y_wait(wait) if wait != 0
block.set_move_y(block.line * @block_s, l * @bloc...
block.line = l
wait += 3
end
end
# stable list animation
fallen_block = fall.first
stable.reverse.each.with_index do |block, i|
break if impact <= 0
l = base - (i + 1)
impact = l * 6 if impact > l * 6
block.set_land(fallen_block, impact, 16)
impact /= 2
end
end
end
}}
このメソッドは大幅に変更されている.
まずは今までと同様にcompact!メソッドで列にスキマスイッチ(...
次の部分では処理を施した列に対してパーティションをかけて...
Rubyのpartitionメソッドはある配列をブロックで与えられた条...
ここではblock.lineがテーブル上の行と同じ,かつブロックに...
すなわち,''落下しないブロックで,元コントロールブロック...
さらに言うならばfallによってぐにゃってなる着地アニメーシ...
fallが空ならこれ以上やることはないので終了する.
まず先にfallを処理している.
こいつらはほとんど今までの落下処理を行っているにすぎない.
ただし,新しく着地アニメーションがセットされている.
とりあえずimpactが着地アニメの深さのマックスの値なんだろ...
そして落下後の行に応じて実際にセットする深さを変えている.
これはすなわち,一番下あたりの行の場合を考慮している.
たとえば一番下に落下した場合,それ以上沈みようが無いので...
そしてset_landの最初の引数に自分自身を指定している.
うん,これで謎が解けたはずだ.
着地アニメーションでは:fallblockのy方向の移動がセットされ...
つまり,ブロックの落下が終わったら着地アニメーションを進...
ちなみに元コントロールブロックにセットされたダミーフラグ...
fallが終わったらstableの処理.
こいつらはfallによって衝撃をあたえられて沈む.
なので直に衝撃を与えてくるブロック,すなわちfallのうち一...
そして衝撃は上から順番に伝搬してくるので,stableは逆順((...
まず,fallの時と同じように行の位置によっては深さを調節し...
そして着地アニメーションをセットするのだが,今回は落下し...
最後にimpactを半分にしているが,これは衝撃は下に行くにつ...
** 実行 [#u429a0c8]
ずいぶんリッチな感じになって来た.
#media(PuyoPuyoChap20/PuyoPuyoChap20.flv);
調子のって本気で連鎖くんでみたらブランクを感じざるを得な...
ページ名: