新版的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来相互切换。