Ogre笔记十一:基础教程七—CEGUI和OgreII

       前面我们已经学了CEGUI怎样嵌入到场景中,这节我们要做的是副窗口,什么意思?大家想想网游中游戏界面右上角的小地图就知道了,先看效果:




注意:项目文件的分层,前面已经讲过,再次强调,千万不要学教程中,一股脑儿全堆一个文件中,具体的说明在代码注释中

Headfile.h

#ifndef HEADFILE_H
#define HEADFILE_H

//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.h

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

class TutorialApplication : public ExampleApplication
{
private:
	CEGUI::OgreCEGUIRenderer* mGUIRenderer;
	CEGUI::System* mGUISystem;
public:
	TutorialApplication();

	~TutorialApplication();

protected:
	void createScene(void);

	void createFrameListener(void);
};

#endif

FrameListener.h
#ifndef FRAMELISTENER_H
#define FRAMELISTENER_H

#include "Headfile.h"

class GuiFrameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
private:
	bool mContinue;

public:
	GuiFrameListener(RenderWindow* win, Camera* cam);

	bool frameStarted(const FrameEvent &evt);
	
	bool quit(const CEGUI::EventArgs &e);

	// 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

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;
}

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::createScene(void)
{
	//初始化CEGUI
	mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
	mGUISystem = new CEGUI::System(mGUIRenderer);

	//设置主题(皮肤)、鼠标样式、字体
	CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");
	mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
	mGUISystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12");

	//手动创建部件——创建一个"Quit"退出按钮
	CEGUI::WindowManager *win = CEGUI::WindowManager::getSingletonPtr();
	CEGUI::Window *sheet = win->createWindow("DefaultGUISheet", "CEGUIDemo/Sheet");
	CEGUI::Window *quit = win->createWindow("TaharezLook/Button", "CEGUIDemo/QuitButton");
	quit->setText("Quit");
	quit->setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));
	sheet->addChildWindow(quit);
	mGUISystem->setGUISheet(sheet);

	//创建一个能看见的场景
	mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
	mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
	Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
	SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0, 0, -300));
	headNode->attachObject(ogreHead);

	//用RenderSystem::createRenderTexture函数创建一个纹理
	RenderTexture *tex= mRoot->getTextureManager()->createManual("RttTex", "Default", 
		TEX_TYPE_2D, 400, 400, 0, PF_R8G8B8, TU_RENDERTARGET)->getBuffer()->getRenderTarget();

	//我们改变了一些视口设置,包括关闭Overlays。
	//这是非常重要的,否则你会看见CEGUI与Ogre在小窗口里面重叠在一起。
	//最后效果很好 我们可以用这种方法做副摄像机  或者做游戏中的小地图。
	Camera *cam = mSceneMgr->createCamera("RttCam");
	cam->setPosition(100, -100, -400);
	cam->lookAt(0, 0, -300);
	Viewport *v = tex->addViewport(cam);
	v->setOverlaysEnabled(false);
	v->setClearEveryFrame(true);
	v->setBackgroundColour(ColourValue::Black);

	CEGUI::Texture *cTex = mGUIRenderer->createTexture((CEGUI::utf8*)"RttTex");
	CEGUI::Imageset *imageSet = CEGUI::ImagesetManager::getSingleton().createImageset((CEGUI::utf8*)"RttImageset", cTex);
	imageSet->defineImage((CEGUI::utf8*)"RttImage", 
		CEGUI::Point(0.0f, 0.0f), 
		CEGUI::Size(cTex->getWidth(), 
		cTex->getHeight()), 
		CEGUI::Point(0.0f,0.0f));

	CEGUI::Window *si = win->createWindow((CEGUI::utf8*)"TaharezLook/StaticImage", "RTTWindow");
	si->setSize(CEGUI::UVector2(CEGUI::UDim(0.5f, 0), CEGUI::UDim(0.4f, 0)));
	si->setPosition(CEGUI::UVector2(CEGUI::UDim(0.5f, 0), CEGUI::UDim(0, 0)));

	si->setProperty("Image", CEGUI::PropertyHelper::imageToString(&imageSet->getImage((CEGUI::utf8*)"RttImage")));
	sheet->addChildWindow(si);
}

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

FrameListener.cpp

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

//鼠标转换事件
CEGUI::MouseButton convertButton(OIS::MouseButtonID buttonID)
{
	switch (buttonID)
	{
	case OIS::MB_Left:
		return CEGUI::LeftButton;
	case OIS::MB_Right:
		return CEGUI::RightButton;
	case OIS::MB_Middle:
		return CEGUI::MiddleButton;
	default:
		return CEGUI::LeftButton;
	}
}

GuiFrameListener::GuiFrameListener(RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam, true, true)
{
	mContinue = true;
	mMouse->setEventCallback(this);
	mKeyboard->setEventCallback(this);
	//添加鼠标事件“关闭”
	CEGUI::WindowManager *wmgr = CEGUI::WindowManager::getSingletonPtr();
	CEGUI::Window *quit = wmgr->getWindow((CEGUI::utf8*)"CEGUIDemo/QuitButton");
	quit->subscribeEvent(CEGUI::PushButton::EventClicked,
		CEGUI::Event::Subscriber(&GuiFrameListener::quit, this));
} 
bool GuiFrameListener::frameStarted(const FrameEvent &evt)
{
	mKeyboard->capture();
	mMouse->capture();
	return mContinue && !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
}
bool GuiFrameListener::quit(const CEGUI::EventArgs &e)
{
	mContinue = false;
	return true;
}
bool GuiFrameListener::mouseMoved(const OIS::MouseEvent &arg)
{
	//注入鼠标事件
	CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
	return true;
}
bool GuiFrameListener::mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
	CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));
	return true;
}
bool GuiFrameListener::mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
	CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));
	return true;
}
bool GuiFrameListener::keyPressed(const OIS::KeyEvent &arg)
{
	//注入键盘事件
	CEGUI::System *sys = CEGUI::System::getSingletonPtr();
	sys->injectKeyDown(arg.key);
	sys->injectChar(arg.text);
	return true;
}
bool GuiFrameListener::keyReleased(const OIS::KeyEvent &arg)
{
	CEGUI::System::getSingleton().injectKeyUp(arg.key);
	return true;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值