Home | Lesson | Game | Tool | Link

C02.SDLでジョイパッド操作

SDLでのジョイパッドの操作方法を紹介します。


ジョイスティックの初期化と終了
基本的には太字の部分だけで大丈夫です。
ジョイスティックを有効にして、指定した番号のジョイパッドを開きます。
ジョイスティックには名前も設定されており、その名前を取得することも可能です。
※PS3とPS2のジョイスティックでは、ボタンの配置などが違うため、
 名前から判断して処理を別ける必要があります。
//ジョイスティック初期化
SDL_Joystick* joystick_init(u32 num)
{
	//利用可能なジョイスティック
	u32 cnt = SDL_NumJoysticks();

	if(cnt == 0 || cnt < num)
		return 0;

	//ジョイスティックのオープン
	SDL_Joystick *joystick;

	SDL_JoystickEventState(SDL_ENABLE);
	joystick = SDL_JoystickOpen(num);

	//ジョイスティック名取得
	//const char* name = SDL_JoystickName(num);

	return joystick;
}

//ジョイスティック終了
void joystick_close(SDL_Joystick *joystick)
{
	if(joystick != NULL)
		SDL_JoystickClose(joystick);
}


キーイベント処理
キーボードやジョイスティックの処理を追加します。
キーボードの処理では、通常のIrrlichtでは処理しきれなかったF10や
Altキーなども特に処理を追加しなくても使用可能になっています。
また、ジョイスティックもWindowsのmmsystemを使用したときよりも、
細かい処理が可能になっています。
(ANALOGモード時の左の十字キー操作や、右のスティックも操作可能です。)

注意点として、大きく3つの処理があります。それぞれ独立して処理されています。
・スティック
・ANALOGモード時の左の十字キー
・その他のボタン
//キーイベント処理
int keyFunc(IrrlichtDevice *device) 
{ 
	SDL_Event event;
	//if(SDL_WaitEvent(&event))
	while(SDL_PollEvent(&event))
	{
		switch(event.type)
		{
			case SDL_QUIT:
				device->closeDevice();
				break;
			//キーボード
			case SDL_KEYDOWN:
			{
				switch(event.key.keysym.sym)
				{
					case SDLK_ESCAPE:
						device->closeDevice();
						break;
					case SDLK_w:
						pos.y--;
						break;
					case SDLK_a:
						pos.x--;
						break;
					case SDLK_s:
						pos.y++;
						break;
					case SDLK_d:
						pos.x++;
						break;
				}
			}
			//スティック(左の十字キーも)
			case SDL_JOYAXISMOTION:
				//左右の動き
				if(event.jaxis.axis == 0) 
				{
					if(event.jaxis.value < -0x7000)
						pos.x--;
					if(event.jaxis.value >  0x7000)
						pos.x++;
				}

				//上下の動き
				if(event.jaxis.axis == 1) 
				{
					if(event.jaxis.value < -0x7000)
						pos.y--;
					if(event.jaxis.value >  0x7000)
						pos.y++;
				}
				break;
			//左の十字キー(ANALOGモードでも取得可能)
			case SDL_JOYHATMOTION:
				switch(event.jhat.value)
				{
					case SDL_HAT_UP:
						pos.y--;
						break;
					case SDL_HAT_LEFT:
						pos.x--;
						break;
					case SDL_HAT_DOWN:
						pos.y++;
						break;
					case SDL_HAT_RIGHT:
						pos.x++;
						break;
				}
				break;
			//ボタン
			case SDL_JOYBUTTONDOWN:
				switch(event.jbutton.button)
				{
				}
				break;
		}
	}

	return 0;
}

タイトル
説明

//#ifdef WIN32
//	int WINAPI WinMain(
//		HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd)
//#else
//	int main()
//#endif
int SDL_main(int argc, char* argv[])
{
	IrrlichtDevice *device = createDeviceSDL(
		EDT_OPENGL,dimension2d<s32>(320,240),16,false,false,false,0,0);

	device->setWindowCaption(L"Irrlicht");//ウインドウタイトル設定

	IVideoDriver* driver = device->getVideoDriver();
	ISceneManager* smgr  = device->getSceneManager();

	//ジョイスティック初期化
	SDL_Joystick* joystick0 = joystick_init(0);

	DrawInit(device, driver);

	while(device->run())
	{
		driver->beginScene(true, true, 0xFF6060FF);

		//キー処理
		keyFunc(device);

		//図形作成
		makeScene(driver);

		//シーンの描画
		smgr->drawAll();

		driver->endScene();
	}

	device->drop();

	//ジョイスティック終了
	joystick_close(joystick0);

	return 0;
}


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

宿題
1.ジョイスティックを操作して画像を移動させてみましょう。
2.全てのキーが操作可能かどうか確認してみましょう。