新版的OGRE出来了,不知什么原因抛弃了CEGUI。国内的教程好像也更新比较少了,在官网上还是发现不少资料的,现在参考官网上的一些资料来搭建一个游戏的框架。

参考的资料:

http://www.ogre3d.org/tikiwiki/Advanced+Ogre+Framework&structure=Tutorials

 

首先要先一个能启动OGRE的类(OgreFramework),把OGRE的初始化的相关工作放入其中,大体有如下几个东西:

  • Root
  • RenderWindow
  • Viewport
  • Log
  • Timer
  • InputManager / Keyboard / Mouse
  • SDKTrays Manager

 

OgreFramework.h

/********************************************************************
created: 2012/02/25
created: 25:2:2012 11:31
filename: E:\Ogre\Project\Ogre_Project\Game_Demo\OgreFramework.h
file path: E:\Ogre\Project\Ogre_Project\Game_Demo
file base: OgreFramework
file ext: h
author: Star

purpose: ogre framework
********************************************************************
*/

#ifndef _ZH_OGREFRAMEWORK_H_
#define _ZH_OGREFRAMEWORK_H_

#pragma once

#include <Ogre.h>
#include <ois/OIS.h>
#include <SdkTrays.h>

class OgreFramework: public Ogre::Singleton<OgreFramework>, OIS::KeyListener, OIS::MouseListener
{
public:
OgreFramework();
~OgreFramework();

bool InitOgre(Ogre::String wndTitle, OIS::KeyListener* pKeyListener = 0, OIS::MouseListener* pMouseListener = 0);
void UpdateOgre(double timeSinceLastFrame);

// for key event
bool keyPressed(const OIS::KeyEvent& evt);
bool keyReleased(const OIS::KeyEvent& evt);

// for mouse event
bool mouseMoved(const OIS::MouseEvent& evt);
bool mousePressed(const OIS::MouseEvent& evt, OIS::MouseButtonID id);
bool mouseReleased(const OIS::MouseEvent& evt, OIS::MouseButtonID id);

public:
Ogre::Root* m_pRoot;
Ogre::RenderWindow* m_pRenderWnd;
Ogre::Viewport* m_pViewport;
Ogre::Log* m_pLog;
Ogre::Timer* m_pTimer;

OIS::InputManager* m_pInputMgr;
OIS::Keyboard* m_pKeyboard;
OIS::Mouse* m_pMouse;

OgreBites::SdkTrayManager* m_pTrayMgr;

private:
OgreFramework(const OgreFramework&);
OgreFramework& operator= (const OgreFramework&);

};

#endif //_ZH_OGREFRAMEWORK_H_

 

主要还是要看InitOgre的实现:

bool OgreFramework::InitOgre(Ogre::String wndTitle, OIS::KeyListener* pKeyListener /* = 0 */, OIS::MouseListener* pMouseListener /* = 0 */)
{
Ogre::LogManager* logMgr = new Ogre::LogManager();

m_pLog = Ogre::LogManager::getSingleton().createLog("OgreLogfile.log", true, true, flase);
m_pLog->setDebugOutputEnabled(true);

m_pRoot = new Ogre::Root();

if (!m_pRoot->showConfigDialog())
return false;

m_pRenderWnd = m_pRoot->initialise(true, wndTitle);

m_pViewport = m_pRenderWnd->addViewport(0);
m_pViewport->setBackgroundColour(ColourValue(0.5f, 0.5f, 0.5f, 1.0f));

m_pViewport->setCamera(0);

size_t hWnd = 0;
OIS::ParamList paramList;
m_pRenderWnd->getCustomAttribute("WINDOW", &hWnd);

paramList.insert(OIS::ParamList::value_type("WINDOW", Ogre::StringConverter::toSgring(hWnd)));

m_pInputMgr = OIS::InputManager::createInputSystem(paramList);

m_pKeyboard = static_cast<OIS::Keyboard*>(m_pInputMgr->createInputObject(OIS::OISKeyboard, true));
m_pMouse = static_cast<OIS::Mouse*>(m_pInputMgr->createInputObject(OIS::OISMouse, true));

m_pMouse->getMouseState().height = m_pRenderWnd->getHeight();
m_pMouse->getMouseState().width = m_pRenderWnd->getWidth();

if (pKeyListener == NULL)
m_pKeyboard->setEventCallback(this);
else
m_pKeyboard->setEventCallback(pKeyListener);

if (pMouseListener == NULL)
m_pMouse->setEventCallback(this);
else
m_pMouse->setEventCallback(pMouseListener);

// load resources
Ogre::String secName, typeName, archName;
Ogre::ConfigFile cf;
cf.load("resources.cfg");

Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
while (seci.hasMoreElements)
{
secName = seci.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap* settings = seci.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
archName = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
}
}
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

m_pTrayMgr = new OgreBites::SdkTrayManager("OFTrayMgr", m_pRenderWnd, m_pMouse, 0);

m_pTimer = new Ogre::Timer();
m_pTimer->reset();

m_pRenderWnd->setActive(true);

return true;
}

 

里边主要做了以下几个工作:

1.创建日志管理

2.创建OGRE的Root

3.创建渲染窗口(RenderWindow)和视口(Viewport)

4.启动OIS

5.设置鼠标和键盘的监听

6.载入资源

7.设置Timer

8.初始化SDKTrayManager

9.创建并显示debug overlay

 

注意,这里边没有像机和场景管理器,这个要到后面的状态类中才用到。

 

void OgreFramework::UpdateOgre(double timeSinceLastFrame)
{

}

这个函数用于在每一帧中更新和OGRE相关的一些东西,自己写的东西是要在每个状态中自己更新。

 

其实游戏的框架,普遍还是用的State这个设计模式。这样就可以在开始菜单,游戏画面,结束画面中自由的切换。看Android的libgdx引擎也是这样做的,分成不同的Screen来相互切换。