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

:図形の描画 など

提出フォロー:演習13 Escキーが押されたら終了

・何かキーが押されたら、どのキーかを得て、Escキー(文字列"Escape")であれば終了しよう
 ※メッセージボックスの表示は削除する

作成例

//演習13 Escキーが押されたら終了
using System; //C#標準クラス用
using System.Windows.Forms; //C#が提供するApplication、Formクラス用
using System.Drawing; //Size、Graphics、Imageクラス用
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); //自機を中央下部に描画
    }
    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); //生成済のインスタンスを実行
    }
}

テーマ15 線の描画

・画面の線の描画にはPaintEventArgsオブジェクトが必要で、OSによる画面再描画の影響を受けるので、
 OnPaintオーバーライドメソッドの中で行う
・線の描画には、描画に用いるSystem.Drawing.Penオブジェクトを用いる
・System.Drawing.Penクラスのコンストラクタ(Color, float)に色と太さを与えることで、好みのPenオブジェクトが得られる
 ※なお、Penクラスのコンストラクタは多数あり、各種の効果を得ることが可能
・Penクラスのコンストラクタに与える色は、System.Drawing.Color構造体オブジェクトに含まれる静的プロパティを用いると便利
・色ごとに、Color.Red、Color.Yellowなどの静的プロパティが多数用意されている
 https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.color
・Penクラスのコンストラクタに与える太さは単精度実数で指定可能
 例: Pen mypen = new Pen(Color.Blue, 10); //青で太さ10のペンを生成
・線の描画は PaintEventArgsオブジェクトeとPenオブジェクトを用いて、下記の書式で行う
 e.Graphics.DrawLine(Penオブジェクト, 開始X座標, 開始Y座標, 終了X座標, 終了X座標);

演習14 対角線を描こう

・画面上に赤い太さ10の対角線2本を描こう

作成例

//演習14 対角線を描こう
using System; //C#標準クラス用
using System.Windows.Forms; //C#が提供するApplication、Formクラス用
using System.Drawing; //Size、Graphics、Imageクラス用
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 pRed10 = new Pen(Color.Red , 10); //【以下追加】赤色の太さ10のペンを生成
        e.Graphics.DrawLine(pRed10, 0, 0, backi.Width - 1, backi.Height - 1); //対角線①を描く
        e.Graphics.DrawLine(pRed10, 0, backi.Height - 1, backi.Width - 1, 0); //対角線②を描く
    }
    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); //生成済のインスタンスを実行
    }
}

テーマ16 矩形の描画

・矩形(長方形、正方形)はDrawLineでも描けるが、DrawRectangle()を用いると便利
・PaintEventArgsオブジェクトeとPenオブジェクトを用いて、下記の書式で行う
 e.Graphics.DrawRectangle(Penオブジェクト, 左上X座標, 左上Y座標, 幅, 高さ);

演習15 升目を描こう

・画面上に9行9列の升目を描こう
・座標(10, 20)から各マスを30×30で、枠線の色はCyan、枠線の太さは2とする
・演習14の対角線は削除する

作成例

//演習15 升目を描こう
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のペンを生成
        for(int i = 0; i < 9; i++) { //9列
            for(int j = 0; j < 9; j++) { //9行
                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); //生成済のインスタンスを実行
    }
}

テーマ17 円・楕円の描画

・円・楕円はDrawRectangle()の応用で、DrawEllipse()を用いる
・中心座標や半径を指定する代わりに、円・楕円に外接する矩形の左上座標, 幅, 高さを用いる
・よって、幅と高さが等しければ円に、でなければ楕円になる
・PaintEventArgsオブジェクトeとPenオブジェクトを用いて、下記の書式で行う
 e.Graphics.DrawEllipse(Penオブジェクト, 外接矩形の左上X座標, 外接矩形の左上Y座標, 外接矩形の幅, 外接矩形の高さ);

演習16 升目の中に円を描こう

・演習15で描いた9行9列の升目の中に内接する円を描こう

作成例

//演習16 升目の中に円を描こう
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のペンを生成
        for(int i = 0; i < 9; i++) { //9列
            for(int j = 0; j < 9; j++) { //9行
                e.Graphics.DrawRectangle(pCyan2, 10 + i * 30, 20 + j * 30, 30, 30); //枠を描く
                e.Graphics.DrawEllipse(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); //生成済のインスタンスを実行
    }
}

演習17 同心円を描こう

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

提出:演習17 同心円を描こう

コメントを残す

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