キー入力を反映させてみる

ゲームを目指すってことで、マウスよりもキーボード主体になるのは当然
ってことで、まずは上下左右で動かしてみる。

まずは下準備として、表示させる座標は変数に持たせておく。
クラス化したときはメンバに持たせることになると思うけど、
今のところテストだから気にしない。

Bitmap変数を追加したところに追記していく。
	public class Form1 : System.Windows.Forms.Form
	{
		// ユーザ定義変数
		// Bitmapクラス変数
		// キャラ
		private System.Drawing.Bitmap bmp_Char = null;

		// その他
		// 座標
		private int char_x,char_y;
こんな感じで。
デフォルト位置は(100,200)としたいので、
ロードイベントハンドラは
		private void Form1_Load(object sender, System.EventArgs e)
		{
			// キャラのBitmapインスタンスを生成
			this.bmp_Char = new Bitmap("char.png");

			// 初期座標
			this.char_x = 100;
			this.char_y = 200;
		}
こう。

で、描画するときにこの変数の値を使えばいいから、
		private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			e.Graphics.DrawImageUnscaled(this.bmp_Char, char_x, char_y);
		}
こうなる、と。
実行しても結果は前と変わらないので省略。


キー入力を受け取る

で、本題のキー入力。
といっても、PictureBoxはキー入力を処理するイベントを持っていないので
ウインドウ(Form)への入力を処理することにする。

デザイナ上でフォームをクリックし、プロパティボックスのイベントから
KeyDown を選択、ダブルクリックしてイベントハンドラを生成してもらう。
		private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
		
		}
これで、キーが押されるとこのイベントが呼ばれる。

引数のKeyEventArgs e を使えばキー入力内容は簡単に取得できる。

まずは、上下左右の矢印キーを処理するための選択部分を片付けよう。
		private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			switch (e.KeyCode)
			{
				case Keys.Up:
					System.Diagnostics.Debug.WriteLine("上矢印が押されました");
					break;
				case Keys.Down:
					System.Diagnostics.Debug.WriteLine("下矢印が押されました");
					break;
				case Keys.Left:
					System.Diagnostics.Debug.WriteLine("左矢印が押されました");
					break;
				case Keys.Right:
					System.Diagnostics.Debug.WriteLine("右矢印が押されました");
					break;
				default:
					break;
			}
System.Diagnostics.Debug.WriteLine() メソッドを使ってデバッグ出力している。
これを実行すれば、キー入力が反映されていることがわかる。SSは省略。

あとは、実際に処理を記述していく。
上の時はy座標を減らし、下なら増やす。
左の時はx座標を減らし、右なら増やす。
これを書けばいい…のだが、これだと座標の更新が行われるだけで
キャラクタは動かない。

というのは、キャラクタの描画は「再描画イベント」で行っているので
座標を更新するだけでは書き換えられない。

そこで、座標の更新が終わったところで無理矢理再描画させてしまえばいい。
		private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			switch (e.KeyCode)
			{
				case Keys.Up:
					this.char_y--;
					System.Diagnostics.Debug.WriteLine("上矢印が押されました");
					break;

				case Keys.Down:
					this.char_y++;
					System.Diagnostics.Debug.WriteLine("下矢印が押されました");
					break;

				case Keys.Left:
					this.char_x--;
					System.Diagnostics.Debug.WriteLine("左矢印が押されました");
					break;

				case Keys.Right:
					this.char_x++;
					System.Diagnostics.Debug.WriteLine("右矢印が押されました");
					break;

				default:
					break;
			}
		
			// pictureboxを更新
			this.pictureBox1.Invalidate();
		}
で、実行するとこんな感じ。

ただ、やってみるとわかるけど
キーの同時入力には対応していないので
斜め移動とかができません。とりあえず仕様です。

まぁ、当面問題にならないと思うので放っておこう。


この部分までのソース:
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
	{
		// ユーザ定義変数
		// Bitmapクラス変数
		// キャラ
		private System.Drawing.Bitmap bmp_Char = null;

		// その他
		// 座標
		private int char_x,char_y;

		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.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
			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");

			// 初期座標
			this.char_x = 100;
			this.char_y = 200;
		}

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

		private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			switch (e.KeyCode)
			{
				case Keys.Up:
					this.char_y -= 3;
					System.Diagnostics.Debug.WriteLine("上矢印が押されました");
					break;

				case Keys.Down:
					this.char_y += 3;
					System.Diagnostics.Debug.WriteLine("下矢印が押されました");
					break;

				case Keys.Left:
					this.char_x -= 3;
					System.Diagnostics.Debug.WriteLine("左矢印が押されました");
					break;

				case Keys.Right:
					this.char_x += 3;
					System.Diagnostics.Debug.WriteLine("右矢印が押されました");
					break;

				default:
					break;
			}
		
			// pictureboxを更新
			this.pictureBox1.Invalidate();
		}
	}
}


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