PuyoPuyoChap22
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[目次へもどる>PuyoPuyo]]
* ガタガタする [#l8af88a6]
#contents
ここで少し気になった部分があった.
サイクルブロックだが,回転するときにガタガタするときがあ...
それは以下のような場合である.
b1 b2
b0 b3
B0
-----
上記の様な状態で右に回転させると,
rowはすぐに反映され,lineはアニメーションに基づいて決定さ...
よって回転操作直後は一時的に以下のようなブロックの配置に...
[ ] b1/b2
b0/b3 [ ]
B0
-----------
このため,コントロールブロックが1ブロック分だけ落下できる...
その後,回転アニメーションが進み,回転後の配置になるため...
コントロールブロックが上昇する.
この現象によって回転時にガタガタしてしまう.
これを回避するために,サイクルブロックについて落下可能判...
すなわち,サイクルブロックは常にブロック4個分の正方形から...
最も下にあるブロックのlineをコントロールブロック全体のあ...
そんじゃまあ実装しましょう.
#sh(ruby){{
class CycleControlBlock < ControlBlock
def can_falldown?(table, block_s)
min_y = [@blocks[0], @blocks[3]].min_by{|block|
block.draw_pos[1]
}.draw_pos[1]
row = @blocks[0].row
fall_ys = [row, row + 1].map{|row|
min_y >= 0 ? min_y - table[row].size * block_s : mi...
}
# fall_ys == 0 : can not fall
# > 0 : fall y
# < 0 : dent y
return fall_ys.min
end
end
}}
サイクルブロックの下にあるのはb0とb3なのでそいつらだけを...
そしたらそれを基準にしてコントロールブロックの左側と右側...
あとは横移動に関しても同様にバウンディングボックスの概念...
#sh(ruby){{
class CycleControlBlock < ControlBlock
def can_move_row?(imr, table, row_s)
return false if imr == 0 # no move
min_line = [@blocks[0], @blocks[3]].min_by{|block|
block.draw_pos[1]
}.line
row_left = @blocks[0].row; row_right = @blocks[3].row
[min_line, min_line + 1].each do |line|
if imr > 0 # move right
return false if row_right >= row_s - 1
return false if table[row_right + 1][line]
else # move left
return false if row_left <= 0
return false if table[row_left - 1][line]
end
end
return true
end
end
}}
一番下のlineを元にバウンディングボックスを作る.
rowは特に問題ないので,左右で決め打ちできる.
** 実行 [#y6eda6d8]
おおガタガタしない.
#media(PuyoPuyoChap22/PuyoPuyoChap22.flv);
終了行:
[[目次へもどる>PuyoPuyo]]
* ガタガタする [#l8af88a6]
#contents
ここで少し気になった部分があった.
サイクルブロックだが,回転するときにガタガタするときがあ...
それは以下のような場合である.
b1 b2
b0 b3
B0
-----
上記の様な状態で右に回転させると,
rowはすぐに反映され,lineはアニメーションに基づいて決定さ...
よって回転操作直後は一時的に以下のようなブロックの配置に...
[ ] b1/b2
b0/b3 [ ]
B0
-----------
このため,コントロールブロックが1ブロック分だけ落下できる...
その後,回転アニメーションが進み,回転後の配置になるため...
コントロールブロックが上昇する.
この現象によって回転時にガタガタしてしまう.
これを回避するために,サイクルブロックについて落下可能判...
すなわち,サイクルブロックは常にブロック4個分の正方形から...
最も下にあるブロックのlineをコントロールブロック全体のあ...
そんじゃまあ実装しましょう.
#sh(ruby){{
class CycleControlBlock < ControlBlock
def can_falldown?(table, block_s)
min_y = [@blocks[0], @blocks[3]].min_by{|block|
block.draw_pos[1]
}.draw_pos[1]
row = @blocks[0].row
fall_ys = [row, row + 1].map{|row|
min_y >= 0 ? min_y - table[row].size * block_s : mi...
}
# fall_ys == 0 : can not fall
# > 0 : fall y
# < 0 : dent y
return fall_ys.min
end
end
}}
サイクルブロックの下にあるのはb0とb3なのでそいつらだけを...
そしたらそれを基準にしてコントロールブロックの左側と右側...
あとは横移動に関しても同様にバウンディングボックスの概念...
#sh(ruby){{
class CycleControlBlock < ControlBlock
def can_move_row?(imr, table, row_s)
return false if imr == 0 # no move
min_line = [@blocks[0], @blocks[3]].min_by{|block|
block.draw_pos[1]
}.line
row_left = @blocks[0].row; row_right = @blocks[3].row
[min_line, min_line + 1].each do |line|
if imr > 0 # move right
return false if row_right >= row_s - 1
return false if table[row_right + 1][line]
else # move left
return false if row_left <= 0
return false if table[row_left - 1][line]
end
end
return true
end
end
}}
一番下のlineを元にバウンディングボックスを作る.
rowは特に問題ないので,左右で決め打ちできる.
** 実行 [#y6eda6d8]
おおガタガタしない.
#media(PuyoPuyoChap22/PuyoPuyoChap22.flv);
ページ名: