这节做一个多场景的转换,按照教程中所讲的:按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;
}