とりあえず下準備

とりあえず基本がよくわかってないのでそこから始めることに。

手元のC Magazine 2004年10月号に「GDI+の徹底活用」という記事があったので読んでみる。
どうやら、Graphicsクラスまわりを調べればよさそう。

ってことで、適当にプロジェクトを作成。
"GDI_Prac"として作成してみる。

何かを描画するにはコントロールに書き込むことになるみたいで、
ウインドウ(=Form)に直接描画しちゃうのが楽かもしれない。
けど、テキストボックスとかボタンとかを追加することがあるかもしれないので
PictureBoxコントロールに描画するようにしてみる。
画像を表示するだけだったらそのままImageプロパティにファイルを指定すればよさそう。
今回は使わないだろうけど。

Formと色が一緒なのでわかりづらい。背景色(BackColor)を白に設定。
とりあえずここに描画していくことにしてみよう。

Formサイズは640*480より大きく取って、PictureBoxは640*480サイズにしてみる。
この段階でコンパイル。

まぁ、当然通るわけですが。
実行するとこんな感じ。

この白いエリアに色々してみようってことで。


キャラクタを表示してみる

ゲームの基本はキャラクタの表示、ってことで。
ペイントで数秒で作った32*32のキャラクタを表示させてみる。

肝心のキャラクタは、調べたところによると
BitmapクラスがPNG形式にも対応してるらしいので
アルファ(透明度)指定も出来るPNGでやるのが楽っぽい。

ってことで、ペイントからPhotoshopに貼り付けて
キャラクタの抜きの部分だけ透明にしてPNG形式で保存。

こんなの。
とりあえず、方向がわかる程度ならこれで十分でしょう。
別に絵心がないからこれしかできない、って訳じゃないですよ?
('A`)


・ファイルからキャラクタを読み込む

表示するにはファイルから読み込む必要があるわけで。
どうやら、Bitmapクラスでやればいいらしいので
やっつけでコードを書いてみる。
(ファイル名は char.png としておく)

ファイルから読み込むのは、とりあえずフォームのロードイベントでよさそう。
ってことで、フォーム上でダブルクリックして、ロードイベントハンドラを作ってもらう。
		private void Form1_Load(object sender, System.EventArgs e)
		{
		
		}
ここで初期化処理をすれば良さそうだ。

といっても、保存する変数は宣言しておかなきゃいけないので
ソースの上の方で宣言しておく。
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.PictureBox pictureBox1;
		/// <summary>
		/// 必要なデザイナ変数です。
		/// </summary>
		private System.ComponentModel.Container components = null;
このあたりに追加。
こんな感じで。
	public class Form1 : System.Windows.Forms.Form
	{
		// ユーザ定義変数
		private System.Drawing.Bitmap bmp_Char = null;
こうしておいて、
		private void Form1_Load(object sender, System.EventArgs e)
		{
			// キャラのBitmapインスタンスを生成
			this.bmp_Char = new Bitmap("char.png");
		}
これでファイルの読み込みはOKらしい。
Bitmapインスタンスは12種類のオーバーロードがあるので
結構柔軟に使えそうだ。
ちなみに、ファイル名指定は、相対指定の場合
実行ファイルのあるディレクトリが基点になるので
プロジェクト名\bin\Debug\char.png
に無いとエラーになる罠。


・Bitmapオブジェクトの描画

さて、ファイルから読み込めたので次は描画処理。
そのためにはGraphicsオブジェクトを取得する必要があるようだ。

…と思ったら、Paintイベントで引数に渡される奴でやればよさそう。
pictureBox1コントロールを選択、プロパティボックスのイベントから
Paintを選択してダブルクリック。これでPaintイベントハンドラが生成される。
		private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			
		}
PaintEventArgs e にGraphicsオブジェクトが含まれているので、
これを使うことで簡単にできそう。

なお、このPaintイベントは再描画などのタイミングで呼ばれる。


んで、Graphicsオブジェクトが取得できたら次はイメージの描画。
VisualStudioの最大の武器、InteliSenceを活用して
それっぽいのを探してみる。

と、DrawImageUnscaled というメソッドを発見。いかにもそれっぽい。
というわけで、早速使ってみよう。
指定したイメージを座標ペアで指定された位置に元の物理サイズで描画します。



[C#]
public void DrawImageUnscaled(
   Image image,
   int x,
   int y
);



パラメータ
image 
描画する Image オブジェクト。 
x 
描画イメージの左上隅の x 座標。 
y 
描画イメージの左上隅の y 座標。 
MSDNによるとこうらしい。
他にもオーバーロードがあったが、テストにはこれでいいかと。
ってことで、ちゃっちゃとやってしまおう。
		private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			e.Graphics.DrawImageUnscaled(this.bmp_Char, 100, 200);
		}
これでよし。
実行してみる。

こんな感じに、(100,200)の位置に描画されればOK。
ちなみに、ウインドウを移動したり最小化したりリサイズしても
ちゃんと書き直される。


まぁ、こんなもんかな?
次はキー入力を反映させてみることにしよう。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace GDI_Prac
{
	/// <summary>
	/// Form1 の概要の説明です。
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		// ユーザ定義変数
		private System.Drawing.Bitmap bmp_Char = null;

		private System.Windows.Forms.PictureBox pictureBox1;
		/// <summary>
		/// 必要なデザイナ変数です。
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			//
			// Windows フォーム デザイナ サポートに必要です。
			//
			InitializeComponent();

			//
			// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
			//
		}

		/// <summary>
		/// 使用されているリソースに後処理を実行します。
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows フォーム デザイナで生成されたコード 
		/// <summary>
		/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
		/// コード エディタで変更しないでください。
		/// </summary>
		private void InitializeComponent()
		{
			this.pictureBox1 = new System.Windows.Forms.PictureBox();
			this.SuspendLayout();
			// 
			// pictureBox1
			// 
			this.pictureBox1.BackColor = System.Drawing.Color.White;
			this.pictureBox1.Location = new System.Drawing.Point(0, 0);
			this.pictureBox1.Name = "pictureBox1";
			this.pictureBox1.Size = new System.Drawing.Size(640, 480);
			this.pictureBox1.TabIndex = 0;
			this.pictureBox1.TabStop = false;
			this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
			this.ClientSize = new System.Drawing.Size(656, 493);
			this.Controls.Add(this.pictureBox1);
			this.Name = "Form1";
			this.Text = "Form1";
			this.Load += new System.EventHandler(this.Form1_Load);
			this.ResumeLayout(false);

		}
		#endregion

		/// <summary>
		/// アプリケーションのメイン エントリ ポイントです。
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{
			// キャラのBitmapインスタンスを生成
			this.bmp_Char = new Bitmap("char.png");
		}

		private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			e.Graphics.DrawImageUnscaled(this.bmp_Char, 100, 200);
		}
	}
}


Copyright (C) Zawa 2005
<<戻る>>