【#14】~設定画面編~新人プログラマーはテトリスを作れるのか?【C#.NET】

2021.08.23

CATEGORY : C#.NET プログラミング

こんにちは、あんみんどうふです。

今回は設定画面の作成です。操作するキーやミノの色を変えたり、ゲームの仕様をいじったりできるようにします。

前回の記事はこちら。

こんにちは、あんみんどうふです。 今回はソフトドロップの実装です。というよりは、ミノを設置した時の"待機時間"を実装します。これにより回転入れの際に意図しない置きミスの発生率が下がります。 前回の記事はこちら。 https...

全編見たい方はタグからどうぞ。

14-1.画面(UI)作成

一般的にどのゲームにも設定画面が存在し、キーやボタンの割り当てだったり、難易度の変更、画質・音声の調整など、プレイヤーが遊びやすいように自分で調整できます。
テトリスにはそういった要素は少ないものの、最低限キーコンフィグぐらいは必要だな~と思ったので作ります。
現に、ガイドライン上でハードドロップはSpaceキーに対しうちのテトリスは上キーですから、変えたい人もいるでしょうし。

また、ハードドロップやスーパーローテーション、ホールドの有無も切り替えできるようにします。これは回転と移動しかなかったクラシックテトリスを再現するためです。
こっちの方が馴染み深い人が多いかも。

後は各ミノの色ですね。気分転換で変えたり、全部同じ色にして縛りプレイみたいにしたり、色覚に障害がある方に合わせたり。

 

というわけで早速作ります。「SettingForm」というフォームを作って、Labelやらなんやらいろいろ配置します。

それで、出来上がったのがこれです。↓

「ゲーム設定」には落下速度、NEXT数、DAS・ARRの間隔の項目があります。
本家テトリスでは作品によっていろいろ違うので、馴染んだテトリスに合わせた設定ができるようにします。

 

「表示設定」にはミノの色、ゴーストの透明度を調整する項目があります。
(本当はこれらのプリセット機能も作る予定でしたが面倒でやめました)

 

「操作設定」は各操作のキーを設定する項目があります。
エミュレーターでよく見るようなやつですね。

 

「その他」にはデバッグモードの切り替えの項目があります。
積み方の練習をしたり、適当に遊んだりできます。

 

ずっと隣にある「プレビュー」ですが、これは表示設定用に仮のフィールドを表示して色を確認する所ですね。これは後程。

とりあえず画面だけは作りました。次はコーディング・・・の前にちょっとだけやることがあります。

 

14-2.コントロールの値

各コントロールの値ですが、これはプロジェクトの設定をいじらないとゲーム画面に反映させることができません。

というわけで、プロジェクト側に各設定項目の変数をずらっと書いていきます。

 

まず「ソリューションエクスプローラー」からプロジェクトを右クリックして「プロパティ」を選択します。

右の項目から「設定」を選び、変数の名前、型、デフォルト値をそれぞれ入力します。

これらはプロジェクト内での共通変数として扱うことができるので、設定画面とゲーム画面で値を共有することができます。

 

14-3.プレビュー描画

まずはLoadイベントから。ロード時にさっきの変数の値をコントロールに適用します。

 

続けてメソッド「previewMino」です。
プレビューに表示するフィールド・ミノを配置します。ちなみにこの時点で描画は行ってません。

 

次に描画メソッド「previewDraw」です。
先程配置した通りにプレビューへ描画します。

ゲーム画面で似たようなことを散々やってきたので簡単ですね。

 

見慣れたフィールドがプレビューされます。

 

14-4.OK・キャンセル・適用

適用ボタンの処理です。
ゲームに限らず、様々なアプリケーションで「OK」「キャンセル」「適用」みたいな並びを目にしますが、その「適用」です。

まずグローバル変数として編集フラグを作ります。

このフラグと適用ボタンの押せる押せないを同時に切り替えるメソッド「editFlag」を作ります。

引数の値で切り替えてます。

 

次に保存処理として「saveSettings」メソッドを作成します。
「適用」と「OK」を押した時にここで保存されます。

 

処理部分を書き終えたので、各ボタンを押した時のイベントで実行させます。

「キャンセル」・・・押したら閉じる
「OK」・・・押したら保存して閉じる
「適用」・・・押したら保存のみ行う

 

また、保存せずに閉じようとしたときに確認画面を出すようにします。
この処理はフォームのFormClosingイベントで発生させます。

このための編集フラグですね。
編集フラグがtrueの時に確認画面を出し、「はい」なら保存して閉じる、「いいえ」なら保存せず閉じる、「キャンセル」ならそのままにします。

 

14-5.既定値に戻す

ボタンのClickイベントで各コントロールに値を入れ直してるだけです。
上から順にゲーム設定、表示設定、操作設定です。

 

14-6.(表示設定)色を指定するダイアログを開く

表示設定にあるすべてのPictureBoxに同じメソッド名を指定します。

clickイベントに「viewChangeColor」という名前を付け、以下のコードを入力します。

 

PictureBoxをクリックするとWindows標準の色を変更するダイアログが開かれます。
ペイントを触ったことがある人なら馴染みあると思います。

 

14-7.(表示設定)TrackBarとNumericUpDownを同期

TrackBarとNumericUpDown両方で個別にValueChangedイベントを作成し、以下のコードを入力します。

同期しました。
ただ、ValueChangedイベントは値が変わるたびに実行されるので、バーを高速で移動させると若干重くなってしまいますね・・・。

 

14-8.(操作設定)入力したキーをTextBoxに表示

14-6と同じ要領で、操作設定にあるすべてのTextBoxのイベントに同じメソッド名を指定します。

キー入力時に実行するので、KeyDownに「ctrlChangeKey」、KeyPressに「ctrlHandleTrue」という名前を付け以下のコードを入力します。

KeyDownイベントであるctrlChangeKeyは先程の通りですが、KeyPressのctrlHandleTrueはこれ何してるんだっけ・・・。
結構前に書いたコードなので忘れちゃいました。まあ、これで問題なく動いてるので大丈夫でしょう。

 

入力したキーの名前が表示されます。

 

14-9.ありとあらゆる場面で編集フラグをTrueにする

値を変えれるコントロールならどれでもいいので、ValueChangedイベントに「valChanged」と名前を付けて以下のコードを入力します。

※既にValueChangedイベントを使っているコントロール以外で!

編集フラグをTrueにしているだけですが、これを各コントロールと紐付けることで保存のし忘れを完璧に防げます。
値を変えれるコントロールすべてのValueChangedイベントに「valChanged」と入力すればOKです。

 

14-10.ゲーム画面に反映

設定画面(SettingForm)で設定した値をゲーム画面(mainForm)に反映させます。

各項目に対応する変数に「Properties.Settings.Default.プロパティで決めた変数名」で代入すれば反映されます。

 

(例)NEXT数の場合

 

ミノや背景の色に関しては#7.5で作ったsetColorというメソッドを使います。

 

流石に全部書くと長すぎるので割愛します。

 

黒と青緑を基調としたテトリスにしてみました。なかなかイケてますね。

ちなみにこの積み方は「DTTKI」と呼ばれる技です。DT砲の派生技で、Tスピンダブルトリプルトリプルダブルを連続で放てるすごい技です。
対戦では非常に強力で、Tスピンダブルは4列分Tスピントリプルは6列分のダメージを与えます。連続で行うとBackToBackなので+1列分加算され、4+(6+1)+(6+1)+(4+1)で合計23列分のダメージになります。テトリスのフィールドは縦20列なので、抵抗されなければ勝ち、抵抗してもそれなりにダメージが入るので撃ち得ですね。

元々長い記事なのに余談をぶちかましてしまいました。

 

とりあえずはこれでテトリス完成です!満足!

バグは残ってるけど・・・。