講義メモ:ゲーム開発演習

:図形の塗りつぶし、文字列の描画 など

提出フォロー:演習17 同心円を描こう

・フォームの中央から外側に向かって半径を10ずつ増やしながら9個の同心円を描こう

作成例

//演習17 同心円を描こう
using System; //C#標準クラス用
using System.Windows.Forms; //Application、Formクラス用
using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用
class Program : Form { //Formクラスの派生クラス
    Image backi, playeri; //画像ファイル用変数
    protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
        base.OnPaint(e); //元のメソッドの内容を呼び出す
        e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置
        e.Graphics.DrawImage(playeri, backi.Width / 2 - playeri.Width / 2,
            backi.Height - playeri.Height * 2); //自機を中央下部に描画
        Pen pCyan2 = new Pen(Color.Cyan, 2); //水色の太さ2のペンを生成
        int mx = backi.Width / 2, my = backi.Height / 2; //【以下追加】中心座標
        for(int i = 1; i <= 9; i++) { //9個
            e.Graphics.DrawEllipse(pCyan2, mx - i * 10, my - i * 10, i * 20, i * 20); //円を描く
        }
    }
    public Program() { //コンストラクタ
        try { //例外処理対象
            backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む
            playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む
        } catch (Exception e) { //例外処理内容
            MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
        }
        KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録
    }
    void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド
        if (e.KeyCode.ToString() == "Escape") { //押されたキーのコードを文字列化したらEscape?
            Close(); //フォームアプリケーションを終了
        }
    }
    static void Main() { //実行用メソッド(publicはなくてOK)
        Program f = new Program(); //自クラスのインスタンスを生成
        f.Text = "Game"; //Form名を設定
        f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定
        Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成
        f.Location = p; //インスタンスプロパティで初期位置を設定
        f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化
        f.ControlBox = false; //コントールボックスの非表示
        f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定
        Application.Run(f); //生成済のインスタンスを実行
    }
}

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

・矩形の塗りつぶしには、DrawRectangleの代わりに、FillRectangleを用いる
・また、Penの代わりにBrushを用いる
・Brushは、System.Drawing.Brushクラスを指すが、これは抽象クラスであり、実際の描画ではBrushクラスの派生クラスを用いる
 https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.brush
・複数ある派生クラスの中で、最もシンプルなのがSystem.Drawing.SolidBrushクラスで、このクラスのコンストラクタに
 Color列挙体の列挙子を渡すことで、単色の塗りつぶし用のブラシが得られる
・書式例: Brush sb = new SolidBrush(Color.色名);
・FillRectangleメソッドにブラシと左上座標、幅、高さを渡すことで矩形の塗りつぶしが可能
・書式例: e.Graphics.FillRectangle(ブラシ, 左上X座標, 左上Y座標, 幅, 高さ);

演習18 チェス盤を描こう

・画面上に8行8列の升目を描こう
・座標(10, 20)から各マスを30×30で、枠線の色はCyan、枠線の太さは2とする
・1行目の1マス目はCyanで塗りつぶし、1つおきに塗りつぶす
・演習17の同心円は削除する

作成例

//演習18 チェス盤を描こう
using System; //C#標準クラス用
using System.Windows.Forms; //Application、Formクラス用
using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用
class Program : Form { //Formクラスの派生クラス
    Image backi, playeri; //画像ファイル用変数
    protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
        base.OnPaint(e); //元のメソッドの内容を呼び出す
        e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置
        e.Graphics.DrawImage(playeri, backi.Width / 2 - playeri.Width / 2,
            backi.Height - playeri.Height * 2); //自機を中央下部に描画
        Pen pCyan2 = new Pen(Color.Cyan, 2); //水色の太さ2のペンを生成
        Brush bCyan = new SolidBrush(Color.Cyan); //【以下追加】水色の塗りつぶしブラシを生成
        for(int i = 0; i < 8; i++) { //8列
            for(int j = 0; j < 8; j++) { //8行
                if ((i + j) % 2 == 0) { //1つおきに
                    e.Graphics.FillRectangle(bCyan, 10 + i * 30, 20 + j * 30, 30, 30); //塗りつぶす
                } else {
                    e.Graphics.DrawRectangle(pCyan2, 10 + i * 30, 20 + j * 30, 30, 30); //枠を描く
                }
            }
        }
    }
    public Program() { //コンストラクタ
        try { //例外処理対象
            backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む
            playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む
        } catch (Exception e) { //例外処理内容
            MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
        }
        KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録
    }
    void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド
        if (e.KeyCode.ToString() == "Escape") { //押されたキーのコードを文字列化したらEscape?
            Close(); //フォームアプリケーションを終了
        }
    }
    static void Main() { //実行用メソッド(publicはなくてOK)
        Program f = new Program(); //自クラスのインスタンスを生成
        f.Text = "Game"; //Form名を設定
        f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定
        Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成
        f.Location = p; //インスタンスプロパティで初期位置を設定
        f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化
        f.ControlBox = false; //コントールボックスの非表示
        f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定
        Application.Run(f); //生成済のインスタンスを実行
    }
}

演習19 チェス盤を描こう・改

・木目の画像を用意してImageとして用いることで、リアルなチェス盤を描こう
・mokume0.png  mokume1.png 
・合わせて升目のサイズを50×50にしよう

作成例

//演習19 チェス盤を描こう・改
using System; //C#標準クラス用
using System.Windows.Forms; //Application、Formクラス用
using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用
class Program : Form { //Formクラスの派生クラス
    Image backi, playeri, chess0, chess1; //【変更】画像ファイル用変数
    protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
        base.OnPaint(e); //元のメソッドの内容を呼び出す
        e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置
        e.Graphics.DrawImage(playeri, backi.Width / 2 - playeri.Width / 2,
            backi.Height - playeri.Height * 2); //自機を中央下部に描画
        Pen pCyan2 = new Pen(Color.Cyan, 2); //水色の太さ2のペンを生成
        Brush bMokume0 = new TextureBrush(chess0); //【変更】木目テクスチャブラシ0を生成
        Brush bMokume1 = new TextureBrush(chess1); //【変更】木目テクスチャブラシ1を生成
        for(int i = 0; i < 8; i++) { //8列
            for(int j = 0; j < 8; j++) { //8行
                if ((i + j) % 2 == 0) { //1つおきに
                    e.Graphics.FillRectangle(bMokume0, 10 + i * 50, 20 + j * 50, 50, 50); //【変更】木目0
                } else {
                    e.Graphics.FillRectangle(bMokume1, 10 + i * 50, 20 + j * 50, 50, 50); //【変更】木目1
                }
            }
        }
    }
    public Program() { //コンストラクタ
        try { //例外処理対象
            backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む
            playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む
            chess0 = Image.FromFile("mokume0.png"); //【追加】チェス画像ファイル0を読み込む
            chess1 = Image.FromFile("mokume1.png"); //【追加】チェス画像ファイル1を読み込む
        } catch (Exception e) { //例外処理内容
            MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
        }
        KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録
    }
    void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド
        if (e.KeyCode.ToString() == "Escape") { //押されたキーのコードを文字列化したらEscape?
            Close(); //フォームアプリケーションを終了
        }
    }
    static void Main() { //実行用メソッド(publicはなくてOK)
        Program f = new Program(); //自クラスのインスタンスを生成
        f.Text = "Game"; //Form名を設定
        f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定
        Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成
        f.Location = p; //インスタンスプロパティで初期位置を設定
        f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化
        f.ControlBox = false; //コントールボックスの非表示
        f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定
        Application.Run(f); //生成済のインスタンスを実行
    }
}

テーマ19 文字列の描画

・コンソールアプリケーションでは既定のフォントによりデバッグコンソールに文字列を表示しているが、フォームアプリケーションでは
 画像などと同様にフォーム上に文字列を描画する
・よって、色や大きさに加えてフォントも指定できる
・文字列の描画にはDrawString()メソッドを用い、色の指定にはブラシを用いる
・フォントの指定にはSystem.Drawing.Fontクラスのオブジェクトを用いる
・Fontクラスには複数のコンストラクタがあるが、シンプルなのはFont("フォント名", ポイント数)
 例: Font f = new Font("メイリオ", 15);
・DrawStringメソッドにブラシと左上座標、幅、高さを渡すことで矩形の塗りつぶしが可能
・書式例: e.Graphics.FillRectangle(文字列, フォント, ブラシ, 左上X座標, 左上Y座標);

提出:演習19 チェス盤を描こう・改

コメントを残す

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