見出し画像

テトリスでプログラミングを試そう(9)

こんにちは。
今回は、前回表示した Tミノの表示の仕方を変更してみます。

プログラムの役割分担について、少し考えてみましょう。
今のところ、class ColorField には積み上がっている状態のブロック(既に固定された状態のブロック)の描画を担当してもらい、class Mino には、プレイヤーが操作しているミノの表示を担当してもらおうと思っています。

そして、プレイヤーからの操作を受け付けるのは class MainPage となっていますので、MainPage が ColorField と、プレイヤーが操作する Mino をコントロールする形 にしようと思います。
(本当は、MainPage というクラス名を GameField のような名前に変更したかったのですが、変更に失敗しました。今度、変更に失敗した理由を調べてみようと思っています。)

MainPage が ColorField をコントロールしたいので、現在表示を実行している ColorField の情報を取得します。
実は、MainPage.xaml の <ContentPage> が表示される際に、<ContentPage.Resources> で ColorField が自動的にどこかに生成されているのです。
その情報を取得するために、MainPage() に以下の2行(L5 と L14)を追加します。

(図1)class MainPage

L5 で、class MainPage に ColorField の情報を記録できるように設定しておいて、L14 で情報を取得しています。
L5 の readonly や、L14 の意味の解説はまた後日します。
今は、「MainPage.xaml に書かれている "R_ColorField" という文字列を利用して、L14 で取得が可能になっている」ということが分かれば十分です。

本当は、_colorField に情報が正しく取得できたかどうかのチェックが必要となるのですが、今回はそれは省略しています。すみません!必ず取得できるはずなので、プログラムが複雑にならないように今は省略しています。
この連載の終わり頃に、そのチェックの仕方については触れるつもりでいます。

次に、以下の5行を class ColorField の { } の中に追加して下さい。
これは、class ColorField の中に MainPage の情報を記録する _main_page を用意して、Init() を通して MainPage の情報が送られてきたら、その情報を _main_page に記録しておく、というものになります。

class ColorField に追加

上の準備が整ったら、図1の L14 の _colorField を設定した後に、次の1行を追加して、ColorField に MainPage の情報を渡してあげて下さい。
class MainPage の { } の中で this とすると、それは MainPage 自身を指すことになります。

以上により、ColorField と MainPage はお互いに連絡を取り合えるようになります。


さて、先程言ったように、MainPage はプレイヤーが操作する Mino もコントロールするので、プレイヤーが操作する Mino を1つ作っておきます。
以下の ように、class MainPage の L6 と L18 の2行を追加してください。

L6 でプレイヤーが操作するミノの情報を記録する _mino_cur を設定し、L18 で、_mino_cur  に T ミノを設定しています。


_mino_cur を表示できるように class MainPage の { } の中に、さらに次の4行を追加してください。

class MainPage に追加

他の人から通知を受ける場合、Notify という名前を使うことが多いです。
<GraphicsView> に表示が必要になった場合、class ColorField の Draw() が呼び出されるため、class MainPage はそこから通知をもらう形にします。

class ColorField の Draw() に、以下のように1行追加します。
下図の場合でしたら L79 の1行になります。
先程作った Init() で、_main_page に MainPage の連絡先をもらっているので、それを利用して通知を行います。

ここで、F5 キーを押してプログラムを実行し、T ミノが表示されることを確認しておいて下さい。


T ミノの表示の仕方を変更しましたが、この変更の意義は伝わるでしょうか?
前回の表示の仕方では、ColorField の中に Mino の情報が入ってしまっていましたが、今回のようにすると、ColorField は自分のことだけを考えておけばよく、他のことは親である MainPage に任せてしまえばよい、となります。
class ColorField の { } の中のプログラムを書くときには、ColorField のことだけを考えておけばよくなります。
考える範囲が狭くなるため、バグを生み出す可能性が減ります。
これがオブジェクト指向の考え方の基本となります。

言いたいことがうまく伝われば嬉しいのですが、どうだったでしょうか?
では、今日は土曜日ですので、のんびりと良い休日をお過ごし下さいね^^。

この記事が気に入ったらサポートをしてみませんか?