zoukankan      html  css  js  c++  java
  • 用OGRE1.74搭建游戏框架(一)

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


  • 相关阅读:
    JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件
    MUI 底部弹出的选择框
    MUI 拍照或选取照片上传作为头像
    多行文本文本输入框 textarea 可点击任意地方编辑的问题
    mui dtpicker 时间的设置 以及MUI的弹窗
    MUI 样式按钮的禁用
    利用渐变实现书本的效果
    调用sqlserver中的存储过程
    XmlHelper
    面试题 数据库sql
  • 原文地址:https://www.cnblogs.com/gameprogram/p/2367798.html
Copyright © 2011-2022 走看看