講義メモ ゲーム開発演習

:塗りつぶし、文字の描画、タイトル画面と画面遷移 など

テーマ19 矩形の塗りつぶし

・塗りつぶしではペンの代わりにブラシを用いる
・ブラシ機能を提供するのはSystem.Drawing.Brushクラスだが、これは抽象クラスで、実際の描画には派生クラスを用いる
・最も構造が簡単なのが派生クラスのSystem.Drawing.SolidBrush
・このクラスのコンストラクタにColor列挙体の列挙子を渡すことで、単色用のブラシが生成される
・例: Brush b = new SolidBrush(Color.Red); //赤の単色ブラシを生成
・矩形の塗りつぶしは、DrawRectangleに似た、FillRectangleにブラシ、左上X座標、左上Y座標、幅、高さを指定する
・例: e.Graphics.FillRectangle(mybrush, 78, 411, 485, 64); //判定エリアの塗りつぶし

演習17 判定エリアの塗りつぶし

・判定エリアを赤色で塗りつぶそう
・同心円は削除しよう

作成例

//演習17 判定エリアの塗りつぶし
using System; //フォームアプリケーションに必須
using System.Windows.Forms; //フォームアプリケーションに必須
using System.Drawing; //Image用
class Program : Form { //Formクラスを継承
    Image backb = Image.FromFile("backb.bmp"); //背景画像の読込
    Image enemy = Image.FromFile("enemy.gif"); //アイテム画像の読込
    Image burn = Image.FromFile("burn.gif"); //効果用画像の読込
    Pen mypen = new Pen(Color.Red, 2); //ペンを生成(初期値は赤、2)
    Brush bred = new SolidBrush(Color.Red); //【追加】ブラシを生成(赤の単色)
    void DrawCircle(PaintEventArgs e, Pen p, int x, int y, int r) { //ペン、中心座標、半径を指定して円を描画
        e.Graphics.DrawEllipse(p, x - r, y - r, 2 * r, 2 * r); //円の描画を呼ぶ
    }
    protected override void OnPaint(PaintEventArgs e) { //Formのメソッドをオーバーライド
        base.OnPaint(e); //まず、Formクラスにおけるメソッドの内容(基本再描画処理)を実行
        e.Graphics.DrawImage(backb, 0, 0); //背景画像を(0,0)から描画
        e.Graphics.FillRectangle(bred, 78, 411, 485, 64); //【変更】判定エリアの描画
        //int mx = backb.Width / 2, my = backb.Height / 2; //【削除】中央座標を得る
        //mypen.Color = Color.Yellow; //【削除】ペン色を黄色に
        //mypen.Width = 10;  //【削除】ペン幅を10に
        //for (int i = 1; i <= 4; i++) { //【以下削除】4回繰返す
        //    DrawCircle(e, mypen, mx, my, 15 * i); //ペン、中心座標、半径を指定して円を描画
        //}
    }
    void OnKeyDown(object o, KeyEventArgs e) { //キーボードが押された時に呼ばれるメソッド
        if(e.KeyCode.ToString() == "Escape") { //Escキーが押されたら
            Close(); //フォームアプリケーション終了
        }
    }
    Program() { //コンストラクタ
        KeyDown += new KeyEventHandler(OnKeyDown); //キーボードが押された時に呼ばれるメソッドを登録
    }
    static void Main() { //publicの指定は任意
        Program p = new Program(); //継承したフォームのインスタンスを生成
        p.Width = 660; //インスタンスのWidthプロパティに幅を代入
        p.Height = 520; //インスタンスのHeightプロパティに高さを代入
        p.Text = "Game"; //インスタンスのTextプロパティにフォーム名を代入
        p.ControlBox = false; //ControlBoxを非表示にする
        p.FormBorderStyle = FormBorderStyle.Fixed3D; //フォームサイズ変更を禁止
        Application.Run(p); //インスタンスを画面に出す
    }
}

テーマ20 矩形の半透明塗りつぶし

・SolidBrushクラスのコンストラクタにColor列挙体の列挙子を渡す代わりに、αコンポーネント値を持つColorオブジェクトを渡すことで、
 透明度を指定できる
・αコンポーネント値は0が不透明で255まで指定可能なので、127で半透明になる
・例:不透明な赤:(0, 255, 0, 0)、半透明な赤:(127, 255, 0, 0)
・αコンポーネント値を持つColorオブジェクトを生成するには、Color.FromArgb(αコンポーネント値, Red値, Green値, Blue値)を用いる

演習18 判定エリアの半透明塗りつぶし

・赤色で矩形の判定エリアを半透明(αコンポーネント値=63)で塗りつぶそう
・同じサイズで赤色の矩形を描くことで見やすくしよう

作成例

//演習18 判定エリアの半透明塗りつぶし
using System; //フォームアプリケーションに必須
using System.Windows.Forms; //フォームアプリケーションに必須
using System.Drawing; //Image用
class Program : Form { //Formクラスを継承
    Image backb = Image.FromFile("backb.bmp"); //背景画像の読込
    Image enemy = Image.FromFile("enemy.gif"); //アイテム画像の読込
    Image burn = Image.FromFile("burn.gif"); //効果用画像の読込
    Pen mypen = new Pen(Color.Red, 2); //ペンを生成(初期値は赤、2)
    Brush bred = new SolidBrush(Color.FromArgb(63, 255, 0, 0)); //【変更】ブラシを生成(赤の透明色)
    void DrawCircle(PaintEventArgs e, Pen p, int x, int y, int r) { //ペン、中心座標、半径を指定して円を描画
        e.Graphics.DrawEllipse(p, x - r, y - r, 2 * r, 2 * r); //円の描画を呼ぶ
    }
    protected override void OnPaint(PaintEventArgs e) { //Formのメソッドをオーバーライド
        base.OnPaint(e); //まず、Formクラスにおけるメソッドの内容(基本再描画処理)を実行
        e.Graphics.DrawImage(backb, 0, 0); //背景画像を(0,0)から描画
        e.Graphics.FillRectangle(bred, 78, 411, 485, 64); //【変更】判定エリアを透明赤で塗りつぶす
        e.Graphics.DrawRectangle(mypen, 78, 411, 485, 64); //【追加】判定エリアの描画
    }
    void OnKeyDown(object o, KeyEventArgs e) { //キーボードが押された時に呼ばれるメソッド
        if(e.KeyCode.ToString() == "Escape") { //Escキーが押されたら
            Close(); //フォームアプリケーション終了
        }
    }
    Program() { //コンストラクタ
        KeyDown += new KeyEventHandler(OnKeyDown); //キーボードが押された時に呼ばれるメソッドを登録
    }
    static void Main() { //publicの指定は任意
        Program p = new Program(); //継承したフォームのインスタンスを生成
        p.Width = 660; //インスタンスのWidthプロパティに幅を代入
        p.Height = 520; //インスタンスのHeightプロパティに高さを代入
        p.Text = "Game"; //インスタンスのTextプロパティにフォーム名を代入
        p.ControlBox = false; //ControlBoxを非表示にする
        p.FormBorderStyle = FormBorderStyle.Fixed3D; //フォームサイズ変更を禁止
        Application.Run(p); //インスタンスを画面に出す
    }
}

テーマ21 文字の描画(途中まで)

・フォームアプリケーションではフォントや書式を指定して文字列を画面上に描画できる
・この時、フォント、ブラシ、位置を指定できる
・フォントは、System.Drawing.Fontクラスのコンストラクタで生成できる
・このコンストラクタは多数のオーバーロードがあるが、フォント名とポイント数(大きさ)を指定する Font(string, float)が便利
・例: Font f = new Font("メイリオ", 15);
・太字などの書式を指定するにはFont(string, float, FontStyle)を用いると良い
・FontStyleはSystem.Drawing.FontStyle列挙型で、列挙子のBoldで太字にできる
(以下次回)

提出:演習18 判定エリアの半透明塗りつぶし

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です