Home | Lesson | Game | Tool | Link

A04.分割ウインドウ

画面を分割して表示します。
これにより、バックミラーの効果や2人での対戦画面なども作成できます。


画面サイズ定義
分割ウインドウを作る際にわかりやすいように画面サイズを定義しておきます。
#define screenX 320
#define screenY 240

カメラ作成
分割ウインドウ分だけカメラを用意します。
ここでは、3つを前上左からの固定カメラ、1つをFPSカメラに設定してあります。
FPSカメラを用意すると、カーソルが動かなくなるので、非表示にしておきます。
	//カメラ設定
	ICameraSceneNode *camera[4] = {0,0,0,0};
	camera[0] = smgr->addCameraSceneNode(0,vector3df(30,0,0),vector3df(0,0,0)); //前
	camera[1] = smgr->addCameraSceneNode(0,vector3df(0,30,0),vector3df(0,0,0)); //上
	camera[2] = smgr->addCameraSceneNode(0,vector3df(0,0,30),vector3df(0,0,0)); //左
	camera[3] = smgr->addCameraSceneNodeFPS();

	//カーソル非表示
	device->getCursorControl()->setVisible(false);

ノード作成
カメラで覗きこむノードを用意しておきます。
どちらから向いているかわかりやすいように、片方を透過設定にしておきます。
	//立体ノードを作成1(通常)
	ISceneNode* node = 0;
	node = smgr->addCubeSceneNode();
	node->setPosition(vector3df(-10,0,0));
	node->setMaterialTexture(0, driver->getTexture("wall.bmp"));
	node->setMaterialFlag(EMF_LIGHTING, false);

	//立体ノードを作成2(透明)
	node = smgr->addCubeSceneNode();
	node->setPosition(vector3df(10,0,0));
	node->setMaterialTexture(0, driver->getTexture("wall.bmp"));
	node->setMaterialFlag(EMF_LIGHTING, false);
	node->setMaterialType(EMT_TRANSPARENT_ADD_COLOR);

描画
カメラの分だけ描画させます。
それぞれスクリーンサイズの1/4になるように描画してあります。
もし、2人対戦の画面を作成するつもりであれば、上下や左右での2分割でよいでしょう。
バックミラーの場合は、通常の描画を行った後に、上部に小さく表示させるとよいでしょう。
分割した数だけ描画を行うので、処理速度が遅くなる場合があるので注意してください。

描画する際には、以下の手順で行います。
1.アクティブなカメラを設定する。
2.ビューポート(描画領域)を設定する。
3.描画する。
	while(device->run())
	{
		driver->beginScene(true,true,0xFF6060FF);

			//カメラ1
			smgr->setActiveCamera(camera[0]);
			driver->setViewPort(rect<s32>(0,0,screenX/2,screenY/2));
			//シーンの描画
			smgr->drawAll();

			//カメラ2
			smgr->setActiveCamera(camera[1]);
			driver->setViewPort(rect<s32>(screenX/2,0,screenX,screenY/2));
			//シーンの描画
			smgr->drawAll();

			//カメラ3
			smgr->setActiveCamera(camera[2]);
			driver->setViewPort(rect<s32>(0,screenY/2,screenX/2,screenY));
			//シーンの描画
			smgr->drawAll();

			//カメラ4
			smgr->setActiveCamera(camera[3]);
			driver->setViewPort(
				rect<s32>(screenX/2,screenY/2,screenX,screenY));
			//シーンの描画
			smgr->drawAll();

		driver->endScene();
	}



setActiveCamera
アクティブなカメラを設定します。
void setActiveCamera(
	ICameraSceneNode* camera
)
camera アクティブにしたいカメラノードを指定します。


setViewPort
ビューポート(描画領域)を指定します。
画面サイズが変わっても、実際に描画されるサイズは変わりません。 (縮小して表示されます。)
void setViewPort(
	const rect< s32 >& area
)
area 描画する位置を指定します。

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

宿題
1.画面を上下/左右の2分割にしてみましょう。
2.バックミラーの画面を作成してみましょう。