同心円の描画のフォロー、塗りつぶし、文字の描画、タイトル画面と画面遷移 など
演習16 同心円の描画・改
・DrawEllipseメソッドは円を描く場合に直感的ではないので、ペンと中心座標と半径を指定して呼び出せるようにブリッジとなる DrawCircleメソッドを組み込んみよう 例: void DrawCircle(PaintEventArgs e, Pen p, int x, int y, int r) ・左上X座標は「中心x - 半径r」、左上Y座標は「中心y - 半径r」、高さと幅は「2 * r」となる
作成例
//演習16 同心円の描画・改
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)
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.DrawRectangle(mypen, 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); //【変更】ペン、中心座標、半径を指定して円を描画
}
//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") { //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); //インスタンスを画面に出す
}
}