ゲーム開発演習:キーボードが押された情報を得る、終了処理 など
テーマ11 キーボードが押された情報を得る
・C#ではキーボードが押された情報を得る手段が2つあり、どちらも12章後半で学習するイベントを用いる ① キーボードが押されたイベントを用いる ② タイマーイベントを用いてキーボードの状態をスキャンする ・今回は①を用いて作ってみよう ・イベントを受け取るには、主にコンストラクタにおいてイベントの登録を行う ・System.Windows.Forms.Controlクラスが提供するKeyDownイベントに、 System.Windows.Forms.KeyEventHandlerデリゲートのインスタンスを「+=」することで、イベントが登録される ・この時、デリゲートの引数としてイベントにつなげたいメソッド名を指定する。 ・書式: KeyDown += new KeyEventHandler(メソッド名); ・KeyDownイベントにつなげたいメソッドは、戻り値型はvoid、引数はobject型と、KeyEventArgs型とする (メソッド名は自由) ・これで、どのキーが押されても、このメソッドが呼ばれるようになる
テーマ12 フォームアプリケーションのプログラム側からの終了方法
・FormクラスのClose()メソッドを呼び出せば良い
演習9 キー入力で終了
・何か、キーが押されたらプログラムが終了するようにしよう
作成例
//演習9 キー入力で終了
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"); //効果用画像の読込
protected override void OnPaint(PaintEventArgs e) { //Formのメソッドをオーバーライド
base.OnPaint(e); //まず、Formクラスにおけるメソッドの内容(基本再描画処理)を実行
e.Graphics.DrawImage(backb, 0, 0); //背景画像を(0,0)から描画
int mx = backb.Width / 2, my = backb.Height / 2; //中央座標を得る
e.Graphics.DrawImage(enemy, mx - enemy.Width / 2, my - enemy.Height / 2); //アイテム画像を中央に描画
e.Graphics.DrawImage(burn, mx - burn.Width / 2, my - burn.Height / 2); //アイテム画像を中央に描画
}
void OnKeyDown(object o, KeyEventArgs e) { //【以下追加】キーボードが押された時に呼ばれるメソッド
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); //インスタンスを画面に出す
}
}
テーマ13 どのキーが押されたのか知る
・KeyDownを用いてキー入力イベント登録して呼び出すようにしたメソッドは、KeyEventArgs型の引数を持つ必要がある ・このKeyEventArgsオブジェクトのKeyCodeプロパティにより、Keys列挙型オブジェクトが得られる。 https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.keys ・Keys列挙型オブジェクトからキーの情報を文字列で得て比較に用いると良い 例: e.KeyCode.ToString()
演習10 押されたキーの文字列を表示
・OnKeyDownメソッドの「Close();」をコメントアウトする ・代わりに、押されたキーの文字列をMessageBoxで表示しよう ・終了にはタスクバーで右クリックし「ウィンドウを閉じる」で
作成例
//演習10 押されたキーの文字列を表示
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"); //効果用画像の読込
protected override void OnPaint(PaintEventArgs e) { //Formのメソッドをオーバーライド
base.OnPaint(e); //まず、Formクラスにおけるメソッドの内容(基本再描画処理)を実行
e.Graphics.DrawImage(backb, 0, 0); //背景画像を(0,0)から描画
int mx = backb.Width / 2, my = backb.Height / 2; //中央座標を得る
e.Graphics.DrawImage(enemy, mx - enemy.Width / 2, my - enemy.Height / 2); //アイテム画像を中央に描画
e.Graphics.DrawImage(burn, mx - burn.Width / 2, my - burn.Height / 2); //アイテム画像を中央に描画
}
void OnKeyDown(object o, KeyEventArgs e) { //キーボードが押された時に呼ばれるメソッド
MessageBox.Show(e.KeyCode.ToString()); //【追加】
//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); //インスタンスを画面に出す
}
}
演習11 Escキーが押されたら終了
・OnKeyDownメソッドMessageBoxを削除する ・押されたキーの文字列が"Escape"ならばClose()すると良い
作成例
//演習11 Escキーが押されたら終了
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"); //効果用画像の読込
protected override void OnPaint(PaintEventArgs e) { //Formのメソッドをオーバーライド
base.OnPaint(e); //まず、Formクラスにおけるメソッドの内容(基本再描画処理)を実行
e.Graphics.DrawImage(backb, 0, 0); //背景画像を(0,0)から描画
int mx = backb.Width / 2, my = backb.Height / 2; //中央座標を得る
e.Graphics.DrawImage(enemy, mx - enemy.Width / 2, my - enemy.Height / 2); //アイテム画像を中央に描画
e.Graphics.DrawImage(burn, mx - burn.Width / 2, my - burn.Height / 2); //アイテム画像を中央に描画
}
void OnKeyDown(object o, KeyEventArgs e) { //キーボードが押された時に呼ばれるメソッド
if(e.KeyCode.ToString() == "Escape") { //【変更】
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); //インスタンスを画面に出す
}
}
テーマ14 線の描画
・画面上に線を描画することは、OSによる描きなおしの影響を受ける。また、描画に必要な情報を得る必要があるので、 OnPaintメソッド(オーバーライド)の中で行う必要がある。 ・画像の描画の後であれば、画像の上に線を描画できる。 ・線を描画するには、描画に用いるペンを得る必要がある。 ・ペンはSystem.Drawing.Penオブジェクトで得られる。 ・System.Drawing.Penクラスのコンストラクタに色と太さを指定することで好みの線にできる https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.pen ・書式例: Pen 変数 = new Pen(色, 太さ); ・色はSystem.Drawing.Color構造体の静的プロパティ(p.211)で指定できる 例:Color.Red、Color.Black 等 https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.color ※構造体はテキスト11章で説明する「軽量クラス」※C/C++の構造体とは異なる ・太さはfloat型の実数で指定する(整数でもOK) ・線を描画するには、ペン、開始座標、終了座標をDrawImageと同様にDrawLineメソッドに渡せばよい ・書式: e.Graphics.DrawLine(Penオブジェクト, 開始X座標, 開始Y座標, 終了X座標, 終了Y座標)
演習12 対角線を描く
・画面上に左上から右下へ赤色太さ10の線を描く ・画面上に右上から左下へ黄色太さ20の線を描く
提出:演習12