:図形の描画 など
提出フォロー:演習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 同心円を描こう