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

画像のプロパティ、画像の重ね合わせ、キーが押された情報を得る など

提出フォロー:演習9 背景画像の描画(エラー対処付き)

・画像ファイルの読み込みをコンストラクタで行うようにしよう
・そして、画像ファイル読込のトラブルへの対応を盛り込み、エラー発生時はメッセージボックスを表示しよう
・この時、catchを「catch (exception e)」とすることで、エラー発生オブジェクトを得ると良い
・このオブジェクトの文字列表現を「e.ToString()」で得てメッセージボックスに表示しよう

作成例

//演習9 背景画像の描画(エラー対処付き)
using System; //C#標準クラス用
using System.Windows.Forms; //C#が提供するApplication、Formクラス用
using System.Drawing; //Size、Graphics、Imageクラス用
class Program : Form { //Formクラスの派生クラス
    Image backi; //【変更】画像ファイル用変数
    protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
        base.OnPaint(e); //元のメソッドの内容を呼び出す
        e.Graphics.DrawImage(backi, 0, 0); //【変更】画像をフォーム左上に配置
    }
    public Program() { //【以下追加】コンストラクタ
        try { //例外処理対象
            backi = Image.FromFile("back.bmp"); //画像ファイルを読み込む
        } catch (Exception e) { //例外処理内容
            MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
        }
    }
    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); //生成済のインスタンスを実行
    }
}

テーマ10 画像のプロパティ

・Imageクラスが提供するプロパティを用いることで、画像の情報を動的に得るようにすれば、保守性が高い(変更しやすい)プログラムにできる
 → https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.image 
・プロパティの例
 int Height:高さ(ピクセル単位)
 int Width:幅(ピクセル単位)
 System.Drawing.Size Size:幅と高さ (ピクセル単位) をSize構造体オブジェクトで得る

テーマ11 画像の重ね合わせ

・FormアプリケーションではOnPainメソッドにおいて後に描画したものが上に重ねられる
・よって、背景画像などは先に描画すれば良い
・なお、GIF、PNG形式などでは画像ファイルに透過色を設定できる
・透過色で描画した部分は先に描画したものが抜けて表示されるので、画像が矩形にならない効果が得られる

演習10 背景画像の下部中央に自機画像を描画

・背景画像をゲーム用の下記画像に差し替えよう
  backb2.bmp
・透過色を設定した自機画像をダウンロード
  player.gif
・自機画像を背景画像の下部中央に描画しよう
 X座標:自機画像を背景画像の中央になるように指定
 Y座標:自機画像の下部に自機の高さ分の空きができるように指定
 

作成例

//演習10 背景画像の下部中央に自機画像を描画
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()); //内容をメッセージボックスに表示
        }
    }
    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); //生成済のインスタンスを実行
    }
}

テーマ12 キーボードが押された情報を得る

・フォームアプリケーションでキーボードが押された情報を得る方法は複数ある
・まず、最も単純に「押されたというイベントを得る」方法を用いよう
 ※なお、イベントの詳細についてはテキスト12章で解説
・押されたというイベントを得る手順
 ①コンストラクタにおいて、イベントを登録し受け取れるようにする
  キーが押されたというイベントはSystem.Windows.Forms.ControlクラスのKeyDown。
  これに、System.Windows.Forms.KeyEventHandlerデリゲートを「+=」すると良い。
  ここで引数としてイベント発生時に呼び出してほしいメソッド名を記述する。
  書式例: KeyDown += new KeyEventHandler(メソッド名);
 ②イベント発生時に呼び出してほしいメソッドを下記の書式で記述する
  void メソッド名(object o, KeyEventArgs e){…}
・上記により、キーが押されると指定したメソッドが呼ばれるようになる

テーマ13 フォームアプリケーションを終了

・System.Windows.Forms.FormクラスのClose()メソッドを実行するとフォームアプリケーションを適切に終了できる

演習11 キーが押されたら終了

・何かキーが押されたら(どのキーであっても)終了するようにしよう

作成例

作成例

//演習11 キーが押されたら終了
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){ //【以下追加】キー押し下げ時に呼ばれるメソッド
        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); //生成済のインスタンスを実行
    }
}

テーマ14 どのキーが押されたのかを得る

・KeyEventHandlerに設定したメソッドの第2引数「KeyEventArgs e」には、押されたキーの情報が含まれている
・この情報は、KeyEventArgsクラスのKeyCodeプロパティで得られる
・このプロパティはKeys列挙型であり、ToString()メソッドで文字列化して用いると良い
 https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.keys

演習12 キーが押されたら表示

・何かキーが押されたら(どのキーであっても)終了する処理をコメントにしておこう
・終了せずに、メッセージボックスでその文字列を表示するようにしよう

作成例

//演習12 キーが押されたら表示
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){ //キー押し下げ時に呼ばれるメソッド
        MessageBox.Show(e.KeyCode.ToString()); //【追加】押されたキーのコードを文字列化して表示
        //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); //生成済のインスタンスを実行
    }
}

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

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

コメントを残す

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