Ogre笔记十二:基础教程八—多场景管理器的运用

       这节做一个多场景的转换,按照教程中所讲的:按C切换场景,按V显示多场景,具体效果如下:





然后是代码,项目中的文件结构同以前的:


ExampleApp.h

#ifndef EXAMPLEAPP_H
#define EXAMPLEAPP_H
#include "Headfile.h"

class TutorialApplication : public ExampleApplication
{
private:
	CEGUI::OgreCEGUIRenderer* mGUIRenderer;
	CEGUI::System* mGUISystem;
	SceneManager *mPrimary, *mSecondary;
	bool mDual, mContinue;

public:
	TutorialApplication();

	~TutorialApplication();

protected:

	void chooseSceneManager(void);

	void createCamera(void);

	void createViewports(void);

	void createScene(void);

	void createFrameListener(void);

};

#endif

FrameListener.h
#ifndef FRAMELISTENER_H
#define FRAMELISTENER_H

#include "Headfile.h"

class GuiFrameListener : public ExampleFrameListener, public OIS::KeyListener
{
private:
	SceneManager *mPrimary, *mSecondary;
	bool mDual, mContinue;

public:

	GuiFrameListener(RenderWindow* win, SceneManager *primary, SceneManager *secondary);

	bool frameStarted(const FrameEvent& evt);

	// MouseListener
	bool mouseMoved(const OIS::MouseEvent &arg);
	
	bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
	
	bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
	
	// KeyListener
	bool keyPressed(const OIS::KeyEvent &arg);
	
	bool keyReleased(const OIS::KeyEvent &arg);
	
};

#endif

Headfile.h

#ifndef HEADFILE_H
#define HEADFILE_H
#define CAMERA_NAME "SceneCamera"

//CEGUI包含文件
#include <CEGUI/CEGUI.h>
#include <CEGUI/CEGUIImageset.h>
#include <CEGUI/CEGUISystem.h>
#include <CEGUI/CEGUILogger.h>
#include <CEGUI/CEGUISchemeManager.h>
#include <CEGUI/CEGUIWindowManager.h>
#include <CEGUI/CEGUIWindow.h>
#include <CEGUI/elements/CEGUIPushButton.h>
#include "OgreCEGUIRenderer.h"
#include "OgreCEGUIResourceProvider.h"

//regular mem handler
#include "ExampleApplication.h"

// OIS输入输出系统头文件
#include <OIS/OIS.h>
using namespace OIS;

//本项目文件
#include "FrameListener.h"
#include "ExampleApp.h"

#endif

ExampleApp.cpp

#include "ExampleApp.h"

TutorialApplication::TutorialApplication()
: mGUIRenderer(0),
mGUISystem(0)
{
}
TutorialApplication::~TutorialApplication()
{
	if(mGUISystem)
	{
		delete mGUISystem;
		mGUISystem = 0;
	}
	if(mGUIRenderer)
	{
		delete mGUIRenderer;
		mGUIRenderer = 0;
	}
}

void TutorialApplication::chooseSceneManager(void)
{
	mPrimary = mRoot->createSceneManager(ST_GENERIC, "primary");
	mSecondary = mRoot->createSceneManager(ST_GENERIC, "secondary");
}

void TutorialApplication::createCamera(void)
{
	mPrimary->createCamera(CAMERA_NAME);
	mSecondary->createCamera(CAMERA_NAME);
}

void TutorialApplication::createViewports(void)
{
	mWindow->removeAllViewports();

	Camera *cam = mPrimary->getCamera(CAMERA_NAME);
	Viewport *vp = mWindow->addViewport(cam);

	vp->setBackgroundColour(ColourValue(0,0,0));
	cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
}

void TutorialApplication::createScene(void)
{
	// Setup the TerrainSceneManager
	mPrimary->setSkyBox(true, "Examples/SpaceSkyBox");

	// Setup the Generic SceneManager
	mSecondary->setSkyDome(true, "Examples/CloudySky", 5, 8);
}

void TutorialApplication::createFrameListener(void)
{
	mFrameListener = new GuiFrameListener(mWindow, mPrimary, mSecondary);
	mFrameListener->showDebugOverlay(true);
	mRoot->addFrameListener(mFrameListener);
}

FrameListener.cpp

#include "Headfile.h"
#include "FrameListener.h"

//创建视图
void setupViewport(RenderWindow *win, SceneManager *curr)
{ 
	win->removeAllViewports();

	Camera *cam = curr->getCamera(CAMERA_NAME);
	Viewport *vp = win->addViewport(cam);

	vp->setBackgroundColour(ColourValue(0,0,0));
	cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

	//vp->setOverlaysEnabled(false);

}

//释放视图
void dualViewport(RenderWindow *win, SceneManager *primary, SceneManager *secondary)
{
	win->removeAllViewports();

	Viewport *vp = 0;
	Camera *cam = primary->getCamera(CAMERA_NAME);
	vp = win->addViewport(cam, 0, 0.5, 0, 0.5, 1);
	vp->setBackgroundColour(ColourValue(0,0,0));
	cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
	//vp->setOverlaysEnabled(false);

	cam = secondary->getCamera(CAMERA_NAME);
	vp = win->addViewport(cam, 1, 0, 0, 0.5, 1);
	vp->setBackgroundColour(ColourValue(0,0,0));
	cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
	//vp->setOverlaysEnabled(false);

} 

//交换场景
void swap(SceneManager *&first, SceneManager *&second)
{
	SceneManager *tmp = first;
	first = second;
	second = tmp;
}

GuiFrameListener::GuiFrameListener(RenderWindow* win, SceneManager *primary, SceneManager *secondary)
	: ExampleFrameListener(win, primary->getCamera(CAMERA_NAME), true, false),
	mPrimary(primary), mSecondary(secondary), mDual(false), mContinue(true)
{
	mKeyboard->setEventCallback(this);
}

bool GuiFrameListener::frameStarted(const FrameEvent& evt)
{
	mKeyboard->capture();
	return mContinue;
}

bool GuiFrameListener::keyPressed(const OIS::KeyEvent &arg)
{
	switch (arg.key)
	{
	case OIS::KC_ESCAPE:
		mContinue = false;
		break;

	case OIS::KC_V:
		mDual = !mDual;

		if (mDual)
			dualViewport(mWindow, mPrimary, mSecondary);
		else
			setupViewport(mWindow, mPrimary);
		break;

	case OIS::KC_C:
		swap(mPrimary, mSecondary);
		if (mDual)
			dualViewport(mWindow, mPrimary, mSecondary);
		else
			setupViewport(mWindow, mPrimary);
		break;

	default:
		break;
	}

	return true;
}

bool GuiFrameListener::keyReleased(const OIS::KeyEvent &) {return true;}


Main.cpp

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "ExampleApp.h"
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
	// Create application object
	TutorialApplication app;
	try {
		app.go();
	} catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
		MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK |
			MB_ICONERROR | MB_TASKMODAL);
#else
		fprintf(stderr, "An exception has occured: %s\n",e.getFullDescription().c_str());
#endif
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值