HOME > ActionScript > テトリスアルゴリズム > 回転の補正

回転の補正

今回やりたい事

テトリミノの回転が出来るようになりましたが、動作にやや違和感があります。
その違和感を幾らか取り払う為に回転動作に補正処理を追加して行きます。

ソースファイル pt5.zip

違和感

違和感と言いますのは壁際で右の図の様な状況の時に回転したりしなかったりする事です。

これはテトリミノのパターンデータ配列の状態の違いによるもので、下の図の様に表示上は同じに見えてもデータの状態が違い、動作にも違いが出てきてしまうためです。

ただあらかじめ言っておきますと、これ自体はバグでもなんでもありません。ゲームの仕様と言ってしまって問題のない要素です。ネット上でポピュラーに遊ばれているテトリスも実は多くが同じ挙動をします。
なので実はプレイして実際に動かしていると違和感なく遊べるんです。
しかし、なんとなく壁にくっついていても反対側が空いていたら、プルっと小気味よく回転して欲しい気がします。あくまで個人的な要望です。

解消方法

解消方法は、前回までのソースコードに10行程書き加えるだけで実装できます。ですのでソースコードについては例によってソースファイルを参照して下さい(main.as 270~275行目と424~430行目)。
追加コードについてはソースファイルを確認してもらうとして、解消方法のアルゴリズム、考え方に焦点を当ててを説明していきます。

ちなみに当然この挙動は下方向、または壁ではなく積み重なったテトリミノに対しても同じ様に発生しますが、今回は左右の壁に対しての解消方法に限定して補正処理を実装しました。

回転補正処理の理屈

原因

回転したりしなかったりする状況は右の図であらわした様に、見た目は同じでもテトリミノのパターンデータ配列の状態によって、テトリミノの回転軸と壁の距離関係が違っている事にあります。

なのでこの症状を解消する方法は単純に、テトリミノの回転軸を動かしてやれば良いわけです。しかし、回転動作の度にいつでも回転軸を動かしているわけにはいきません。ではいつ回転軸を動かせば良いかというタイミングですが、これも条件としては二つしかありません。

「位置情報のx値が0の時」と、「位置情報のx値と落下中のテトリミノの幅の合計がフィールドの幅と同じ時」、基本的にはこの二つの状況に限定されます。
この二つの状況の時、回転時のアタリ判定を調べる場合に回転軸を右へ一つ、もしくは左へ一つ動かした上でアタリ判定のシミュレートを行い、判定を通ったあとは実際に軸をずらして回転を確定するというプロセスになります。

ちなみに正方形テトリミノには上記のような症状は起きないので無視して大丈夫です。
というより、この条件で評価している限り、正方形テトリミノには補正処理は動作しません。

例外

上記で「基本的にはこの二つの状況に限定されます」と言っておきながら、実は例外的な状況が二つあります。棒型テトリミノ縦状態の場合に二つの例外的状況が発生し得ます。

左の図の中で、左側のテトリミノの状態は前回実装した「位置情報のx値がマイナスになってしまう」に対する対応処理によって、縦と横の幅が違うパターンデータ状態中の棒型です。これについては軸をずらした後に、復元してあげれば問題ありませんが、この為の例外処理を用意しておく必要があります。

右側のテトリミノの状態は棒型が位置情報のx値9である時の状態です。この状態になると棒型のテトリミノの幅は4セル分あるので、位置情報との合計値がフィールドの幅よりも大きくなってしまいます。
この状態自体には問題はないのですが回転の補正をするには通常、回転軸を左へ一つ動かすところを左へ二つ動かす必要があるため、この状態をピンポイントで評価して検出し、この状態用に別の処理を用意しておく必要があります。
検出方法は「位置情報のx値とパターンデータ幅の合計がフィールド幅より大きい場合」と評価すれば良いので簡単です。

動作確認

壁際での動きが前回とは違う挙動なので、前回の動作と比較してみて欲しいです。テトリミノが動かない時はFlash画面上を一度クリックしてみてください。

ちなみに下方向に対する同様の補正処理も可能です。が、以前実装した経験があるのですが、あまり小気味よくありません。というか、逆に違和感があったので無い方が良いかなという印象でした。実装の考え方は左右の壁に対する考え方と同じですので、興味がわいた方は実装してみてください。

Flashファイルをご覧いただくためには、
アドビシステム株式会社のフラッシュプレーヤー(Flash Player)が必要です。
インストールされていない方は下のボタンから、最新版が無償で入手できます。

Adobe Flash Playerのダウンロード

ソースファイルについて

ソースファイルはasファイルのみです。

使用する環境としてはFlashIDE(動作確認はSC4のみ)を想定していますので。適当に用意したflaファイルに、ダウンロードしたソースファイルをドキュメントクラスとして適切に設定すれば問題無く動作します。
また、コーディングはFlashDevelopを使用して行っておりますので、プロジェクト内にファイルを適切に配置、もしくはクラスパスを設定するなどすればFlashDevelopだけでも問題なく動作します。Stageサイズは幅、高さともに500pxです。
申し訳ありませんが、ご質問等にはお答えできませんので、ご使用は環境に合わせて各自行ってください。

TOP