今回はテトリスっぽいものを作った。およそ 1.5 時間でできた。
https://neguse.github.io/ng/demo/tetris/ng.html
やったこと
- 盤面のデータ構造定義、初期化、表示
- テトリミノのパターン定義
- テトリミノの表示、移動、配置できるか判定
- 列の削除
Future Work
- タイトル画面、ゲームオーバー画面
- 回転のパターンをもう少し自然にする、O は回しても回らないなど
- スコア、たくさん行消すとスコアが上がるなど
- 徐々に落下速度を上げる
- テトリミノの種類ごとに色を変える
- 予告表示
- テトリミノの出現頻度を適正にする(rand の剰余でやってるので同じのが連続して出たりする)
よかったこと
- 途中まで番兵というか、壁を配列内にデータとして定義していたのだけど、それだと揃えて消したときに再度壁をつくらないといけないのが面倒でやめた。配列外の分は、「Y 軸上方向を超えた分は何もなし扱い、それ以外は壁扱い」とした。これによって、行が埋まって消えたときの処理が単に上の行から下の行にコピペするだけで済んで、すごいきれいに書けてよかった。
- glm::ivec2 が大活躍。x と y それぞれ引数などに渡さなくてすむし、+演算子で足せるので超便利。
- 途中まで At()を Setter, Getter 両方の意味で使ってたのだけど、配列外になることが多そう(I を回すと一時的に配列外になったり)ということがわかって急遽 SetAt()と GetAt()に変えた。これがうまくはまって、特に消すところがよくかけた。
なんとかしたい
- 最終形が見えてない状態でもりもり書いてて、結局不要になった処理はそこそこあった。壁とか At とか。何回かやりなおして手順最適化して、タイムアタック動画として投稿したい
- rand()に頼らなくてすむよう、乱数ライブラリを導入したい
- Board 型をライブラリに導入できればタイムが縮むが、汎用化するのは難しい気がしている。どこまでライブラリとして切り出せるか