こんにちは、あんみんどうふです。間に挟んでちょっとしたことをします。
前回の記事はこちら。
全編見たい方はタグからどうぞ。
#○.5シリーズについて
いつも数字で区切って機能の実装等してますが、この0.5区切りの投稿では「別に必要ないけどあれば便利な機能」の実装をしています。主に開発側が楽できるようなものなので、今作っているテトリス自体に影響はあまりありません。
興味ない方はすっ飛ばして構わないです。
色のクラス化
フィールド、NEXT、ホールドの描画で色を決めるとき、毎回こんなコード書いてるんですけど・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | switch(field[i, j]) { case 0: // 空白 color = Color.FromArgb(255, 255, 255); break; case 1: // Iミノ color = Color.FromArgb(0, 255, 255); break; case 2: // Oミノ color = Color.FromArgb(255, 255, 0); break; case 3: // Sミノ color = Color.FromArgb(0, 221, 0); break; case 4: // Zミノ color = Color.FromArgb(255, 0, 0); break; case 5: // Jミノ color = Color.FromArgb(30, 128, 255); break; case 6: // Lミノ color = Color.FromArgb(255, 140, 0); break; case 7: // Tミノ color = Color.FromArgb(255, 0, 255); break; case 8: // 壁 color = Color.FromArgb(0, 0, 0); break; } |
長い!!!!まるで私の初投稿の記事のように
それに次回実装するゴーストではミノを半透明にさせる為、本来FromArgbに入るはずのアルファ値(透明度)が必要です。
上のコードではFromArgbの引数を3つ使っているので、
「FromArgb(R値, G値, B値)」といったアルファ値を省略した形になってます。本来は4つ使うことで
「FromArgb(アルファ値, R値, G値, B値)」になります。
このコードはアルファ値を入れる場所が無いので、これに似たそっくりなコードをもう一つ用意しなければなりません。こうなるともうゴチャゴチャして嫌になります・・・。
ということで、色を決める部分は別のクラスを作ってそこに置いておくことにしました。
「minoColor.cs」というクラスを新たに作成します。
プロジェクト(TETOFU)を右クリック→追加→クラス→ファイル名を「minoColor.cs」と入力して「追加」をクリック、です。
minoColorクラスができました。そのまま開いて、以下のコードを書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace TETOFU { class minoColor { Color[] Col = { Color.FromArgb(255, 255, 255), // 空白 Color.FromArgb(0, 255, 255), // I Color.FromArgb(255, 255, 0), // O Color.FromArgb(0, 221, 0), // S Color.FromArgb(255, 0, 0), // Z Color.FromArgb(30, 128, 255), // J Color.FromArgb(255, 140, 0), // L Color.FromArgb(255, 0, 255), // T Color.FromArgb(0, 0, 0) // 壁 }; public void setColor(int type, Color c) { Col[type] = c; } public Color getColor(int type, int alpha = 255) { return Color.FromArgb(alpha, Col[type]); } } } |
「getColor(ミノの種類, アルファ値)」で各種ミノの色を取得しつつ透明度を設定できるようにしました。
setColorに関しては今は使いません。そのうちゲームの設定画面から各種ミノの色を変えるみたいなことを実装したいと思ってるので仮置きです。
元のフォーム(mainForm.cs)に戻り、グローバルな所でminoColorをインスタンス化します。これでmainForm上でいつでもどこでもminoColorが使えるようになります。
1 2 | /* インスタンス */ minoColor MinoColor = new minoColor(); |
そしてdrawメソッドを修正します。あの忌々しい長文コードをMinoColor.getColorに置き換えてやります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void draw() { Bitmap canvas = new Bitmap(view_field.Width, view_field.Height); Graphics g = Graphics.FromImage(canvas); for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(1); j++) { if (field[i, j] != 0) { // テトリミノの描画 Color color = MinoColor.getColor(field[i, j]); SolidBrush brush = new SolidBrush(color); g.FillRectangle(brush, j * SQUARE - FIELD_WALL * SQUARE, (i - FIELD_SPACE) * SQUARE, SQUARE, SQUARE); brush.Dispose(); } } } } |
ついでにg.FillRectangleの部分を最適化しました。余分にコード長くしてたみたいなので・・・。
後はNEXT(nextDrawing)とホールド(holdDrawing)も修正。コードは上のとやってることほぼそのまんまなので省略します。
結果、こうなりました。
処理に変化はありませんが、コードがすっきりして見やすくなりました。
コピペする度に邪魔だと感じていたので、コードの再利用がしやすくなっただけでもいい収穫ですね。
以上、本っ当にちょっとしたことでした。
次回#8はマス目とゴーストの実装です。(7月12日投稿予定)