Tetrisには版権を持っている会社が示しているガイドラインがあります。このページの解説がわかりやすいです。

テトリス(tetris)のガイドラインを理解する – Qiita

前回はスーパーローテーションシステムに対応させるためのプログラムを作成してきましたが、ガイドラインには他のことも定められています。今回はソフトドロップとハードドロップを考えます。

ガイドラインによるとテトリミノの落下について以下のように定めています。

ハードドロップは0.0001秒で落下
ソフトドロップは押してるあいだ落下速度が現在の自然落下速度の20倍とする

これまで作成したプログラムでは↓キーを押すと急速で落下するのですが、その速度はテキトーに考えていました。今回はガイドラインに沿う形で書き直すことにします。

これまでは押したら最後、ミノが固定されるまで急速落下は取り消すことができませんでした。

押してるあいだ落下速度が現在の自然落下速度の20倍とする

ということは離すと元の速度に戻るということになります。

また

落下ハードドロップは0.0001秒で落下

ということは即設置でよいということになります。

ではそのように書き換えましょう。

これまではこのような処理にしていました。

↓キーを押したらソフトドロップ、↑キーを押したらハードドロップにします。

ハードドロップの場合はそのまま落ちたらどこになるのかを調べて移動させます。

これはハードドロップしたときの着地点を取得するメソッドです。回転処理のときに作成したCanRotateメソッドを流用しています。

ハードドロップしたときの着地点がどこかわかったら実際に移動させます。

次にソフトドロップですが、↓ボタンが離されたら元の速度に戻す必要があります。

ゴーストを表示させる

それからゴーストも表示させましょう。これは操作してるテトリミノをハードドロップしたときに設置される場所です。半透明やアウトラインのみで表示することになっていますが、

ゴーストを表示する部分はGetBlocksIfHardDropメソッドで取得できます。ゴーストを表示したら古いゴーストは消さないといけません。そのためフィールド変数 GohstBlocksに保存することにしました。

新しいゴーストを表示する前に古いゴーストは元の色に戻します。

GohstBlocksに保存した要素をそのままにしておくと、新しいミノを作成したときにGohstBlocksに保存されている部分がClearColorに戻ってしまいます。そこでミノが固定されたときにGohstBlocksをクリアしています。

ゴーストを表示しなければならないときとは新しいミノが表示されたとき、左右に移動したとき、回転したときです。そこで対応するメソッドの最後にShowGohstメソッドを呼んでおきます。