Home | Lesson | Game | Tool | Link

13.マウス・キーボード

画像をマウスとキーボードを使って操作します。
最初は、マウスカーソル位置に画像が表示されているので、
マウスカーソルを動かしたり、カーソルキーで動かしてみましょう。
マウスホイールを回転させることで画像の拡大縮小も行っています。


変数用意
画像のスケール、画像の座標とマウスの座標をわかりやすいように
グローバル変数で設定しておきます。
float scale = 1.0f;
position2d pos(0,0);
position2d mouse;

キーイベント処理
イベントレシーバーを設定します。
マウスやキーボードのイベントを受け取ったら、ユーザーが自由に処理できるようにします。
イベントが発生すると、OnEventが呼び出されるので、その中に記述します。

まずは、キーボードの処理を行います。
イベントのタイプにキーボード(EET_KEY_INPUT_EVENT)を指定します。
カーソルキーが押されたら画像の位置を変更するようにしてあります。
class MyEventReceiver : public IEventReceiver
{
public:
	virtual bool OnEvent(const SEvent& event)
	{
		if(event.EventType == EET_KEY_INPUT_EVENT)
		{
			if(event.KeyInput.PressedDown)
			{
				switch(event.KeyInput.Key)
				{
					case KEY_LEFT:
						pos.X -= 5;
						return true;
					case KEY_RIGHT:
						pos.X += 5;
						return true;
					case KEY_UP:
						pos.Y -= 5;
						return true;
					case KEY_DOWN:
						pos.Y += 5;
						return true;
					default:
						return false;
				}
			}
			return true;
		}

マウスイベント処理
次にマウスの処理を行います。
イベントのタイプにマウス(EET_MOUSE_INPUT_EVENT)を指定します。
マウスの左ボタンが押された時に、画像の位置を元に戻します。
ホイールを上回転させた時に、画像のスケールを拡大させます。
ホイールを下回転させた時に、画像のスケールを縮小させます。
マウスが移動した時に、マウスの位置を変数に格納します。
		if(event.EventType == EET_MOUSE_INPUT_EVENT)
      		{
			switch(event.MouseInput.Event)
			{
				case EMIE_LMOUSE_PRESSED_DOWN:
					pos.X = 0;
					pos.Y = 0;
					return true;
				case EMIE_MOUSE_WHEEL:
					//上回転
					if(event.MouseInput.Wheel == 1)
					{
						if(scale < 10.0f)
							scale += 0.2f;
					}
					//下回転
					else if(event.MouseInput.Wheel == -1)
					{
						if(scale > 0.2f)
							scale -= 0.2f;
					}
					return true;
				case EMIE_MOUSE_MOVED:
					mouse.X = event.MouseInput.X;
					mouse.Y = event.MouseInput.Y;
					return true;

				default:
					return true;
			}
		}
		return false;
	}
};

画像描画
draw2DImageを使用して画像を描画します。
画像の表示位置、サイズ、テクスチャの読み込み位置などを指定して描画します。
void makeScene(IVideoDriver *driver)
{
	int x = mouse.X+pos.X;
	int y = mouse.Y+pos.Y;
	int w = 32;
	int h = 32;
	float u = 0;
	float v = 0;
	ITexture* texture = driver->getTexture("particle.png");
	SColor colors[] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};//左上,左下,右下,右上
	driver->draw2DImage(texture, 
		rect(x,y,x+w*scale,y+h*scale), 
		rect(u,v,u+w,v+h), 
		0, colors, true);
}


draw2DImage
2Dテクスチャを描画します。
void draw2DImage(
	ITexture*        texture,
	const rect<s32>& destRect,
	const rect<s32>& sourceRect,
	const rect<s32>* clipRect                 = 0,
	SColor*          colors                   = 0,
	bool             useAlphaChannelOfTexture = false
)
texture                  描画するテクスチャを指定します。
destRect                 描画する場所(矩形)を指定します。
sourceRect               テクスチャから読み込む場所(矩形)を指定します。
clipRect                 描画してよい場所(矩形)を指定します。
colors                   頂点カラーを指定します。
useAlphaChannelOfTexture アルファチャネルを使用する場合はtrueに設定します。

レシーバーの設定
上で作成したレシーバークラスを定義します。
createDeviceに関連付けを行い、setEventReceiverでセットしておきます。
これにより、マウスやキーボードの処理はMyEventReceiverで処理されます。
	MyEventReceiver Receiver;

	IrrlichtDevice *device  = createDevice(EDT_OPENGL,dimension2d(320,240),16,
					false,false,false,&Receiver);
	IVideoDriver *driver    = device->getVideoDriver();
	ISceneManager* smgr     = device->getSceneManager();

	device->setEventReceiver(&Receiver);

ダウンロード
今回作成したファイル一式です。

宿題
1.右クリックを押したら画像が変わるようにしましょう。
2.カーソルキーごとに、押したら画像が変わるようにしましょう。
3.カーソルキーで画像を動かす時に、画面外に出ないようにしましょう。