前回、暇つぶしという名のアプリを作りましたが、今回は動く暇をクリックしてつぶしていくアプリケーションをつくります。本日は完全にネタ記事です。

MovingRectangleクラスの生成

前回作成したものは一度表示された暇はクリックされるまで出現した位置にとどまり続けます。そのため位置を管理するためにPointのリストに格納していくだけでよかったのですが、今回は移動するので変わりつつある表示座標を保持するクラスを作成します。

ではそのクラスを示します。移動する矩形なのでクラス名はMovingRectangleにしました。

フィールド変数として現在位置、移動量、サイズ、フォント、ブラシがあります。フォントは同じものを使用するので静的変数にしています。

どうせやるなら色も文字ごとに変えてしまおうということでコンストラクタで指定できるようにしています。コンストラクタは出現地点、移動先、サイズ、色です。コンストラクタ内で必要なデータをフィールド変数に格納して移動元と移動先の座標から移動方向を計算してX方向、Y方向の移動量を求めています。

使わなくなったらブラシをDisposeしています。IsHitメソッドは引数としてわたされたPointは矩形のなかにあるかどうかを調べるものです。クリックされた座標をこのメソッドに渡してtrueを返せば、移動している暇をつぶすことができたということになります。

Form1クラス

次にForm1クラスをどうするかですが、文字を動かすためにタイマー処理をおこなうのでTimerが必要です。TickCountはTimer.Tickイベントが発生した回数です。暇の出現位置をランダムにしたいのでRandomクラスも使用します。MovingRectanglesはMovingRectangleクラスのインスタンスを格納するリストです。暇をどれだけ潰せたか打率(?)のようなものも表示させたいのでこれまでに出現した暇とつぶすことができた暇の数もフィールド変数で管理します。

Form1クラスのコンストラクタを示します。タイマーを初期化して背景を黒にして(とくに意味はない)、暇の色を先に作成してリストに格納しておきます。

フォームが表示されたら暇がどのように描画されるか実際に描画してみます。これで矩形がどうなっているかを知ることができます。文字の幅、高さをstringWidthとstringHeightに格納しておきます。

Timer.Tickイベント時の処理を示します。TickCountがインクリメントされていくので、これが100で割ったときの剰余が0, 25, 50, 75のときに暇を出現させます。出現場所はフォームの上下左右の端です。出現位置の向かいの辺のどこかへ向かって移動していきます。このあたりは暇の色も含めて乱数をつかって適当にバラけるようにしています。

暇が生成されたらHimaCountをインクリメントします。そしてMovingRectanglesのなかからMovingRectangle.IsDead = falseのものだけ集めて移動させます。最後に再描画をおこないます。

クリックされたときの処理を示します。MovingRectangle.IsHitメソッドで暇のなかでクリックされたのかどうかがわかるので、もし該当する暇があったらこれをIsDead = trueにします。そしてShotCountとDestroyedHimaCountをインクリメントします。これで総クリック数に対する暇つぶし成功率がわかります。

あとはOnPaintメソッドをオーバーライドして再描画時の処理をおこないます。つぶされずに残っている暇を表示させるとともに暇つぶしの成績を表示させます。これまで出現した暇に対するつぶせた割合、総クリックに対する暇つぶし成功の割合を表示させます。打率が60%を下回ったときは「ミスショットが増えています。もっと落ち着きましょう。」と赤で表示させます(ちょっとしたユーモアということで・・・)。