#include "OGRE/Ogre.h"
#include "OIS/OIS.h"
class MyFrameListener:public Ogre::FrameListener
{
public:
bool frameStarted(const Ogre::FrameEvent &evt)
{
//std::cout<<"Frame Start"<<std::endl;
_key->capture();
if (_key->isKeyDown(OIS::KC_ESCAPE))
{
return false;
}
Ogre::Vector3 translate(0,0,0);
if(_key->isKeyDown(OIS::KC_W))
{
translate += Ogre::Vector3(0,0,-10);
}
if(_key->isKeyDown(OIS::KC_S))
{
translate += Ogre::Vector3(0,0,10);
}
if(_key->isKeyDown(OIS::KC_A))
{
translate += Ogre::Vector3(-10,0,0);
}
if(_key->isKeyDown(OIS::KC_D))
{
translate += Ogre::Vector3(10,0,0);
}
_cam->moveRelative(translate*evt.timeSinceLastFrame * _movementSpeed);
_mouse->capture();
float rotX = _mouse->getMouseState().X.rel * evt.timeSinceLastFrame * -1;
float rotY = _mouse->getMouseState().Y.rel * evt.timeSinceLastFrame * -1;
_cam->yaw(Ogre::Radian(rotX));
_cam->pitch(Ogre::Radian(rotY));
return true;
}
bool frameEnded(const Ogre::FrameEvent& evt)
{
//std::cout<<"Frame End"<<std::endl;
return true;
}
bool frameRenderingQueued(const Ogre::FrameEvent& evt)
{
//std::cout<<"Frame Queued"<<std::endl;
return true;
}
MyFrameListener(Ogre::RenderWindow* win, Ogre::Camera* cam, Ogre::Viewport* viewport)
{
_cam = cam;
_movementSpeed = 50.0f;
OIS::ParamList pl;
unsigned int windowHandle = 0;
std::ostringstream windowHandleStr; //该类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintf
win->getCustomAttribute("WINDOW",&windowHandle);
windowHandleStr << windowHandle; //格式化
pl.insert(std::make_pair("WINDOW",windowHandleStr.str()));
_man = OIS::InputManager::createInputSystem(pl);
_key = static_cast<OIS::Keyboard*>(_man->createInputObject(OIS::OISKeyboard,false));
_mouse = static_cast<OIS::Mouse*>(_man->createInputObject(OIS::OISMouse,false));
_viewport = viewport;
_comp1 = false;
_comp2 = false;
_comp3 = false;
_down1 = false;
_down2 = false;
_down3 = false;
}
~MyFrameListener()
{
_man->destroyInputObject(_key);
_man->destroyInputObject(_mouse);
OIS::InputManager::destroyInputSystem(_man);
}
private:
OIS::InputManager* _man;
OIS::Keyboard* _key;
OIS::Mouse* _mouse;
Ogre::Camera* _cam;
float _movementSpeed;
Ogre::Viewport* _viewport;
bool _comp1, _comp2, _comp3;
bool _down1, _down2, _down3;
};
class MyApplication
{
private:
Ogre::SceneManager* _sceneManager; //场景管理器
Ogre::Root* _root; //根节点
MyFrameListener* _listener;
bool _keepRunning;
public:
//载入资源
void loadResources()
{
Ogre::ConfigFile cf; //助手类,用于加载配置文件
cf.load("resources_d.cfg"); //载入配置文件
Ogre::ConfigFile::SectionIterator sectionIter = cf.getSectionIterator();//得到一个遍历块的迭代器
Ogre::String sectionName, typeName, dataname; //块名,键,值
//开始通过迭代器遍历资源
while (sectionIter.hasMoreElements())
{
sectionName = sectionIter.peekNextKey(); //得到块
Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext(); //得到map
Ogre::ConfigFile::SettingsMultiMap::iterator i; //定义一个map的迭代器
for (i = settings->begin(); i != settings->end(); ++i) //对块里头的键-值进行迭代
{
typeName = i->first; //获得键
dataname = i->second; //获得值
//根据块,键,值来载入资源
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname, typeName, sectionName);
}
}
//初始化所有的资源组
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
//创建场景
void createScene()
{
Ogre::Entity*ent=_sceneManager->createEntity("Sinbad.mesh");
_sceneManager->getRootSceneNode()->attachObject(ent);
}
//开始渲染
int startup()
{
_root = new Ogre::Root("plugins_d.cfg"); //载入插件
if(!_root->showConfigDialog()) //弹出黑框框,如果出错或者用户点取消则返回
{
return -1;
}
//通过root,初始化-----渲染窗口和场景管理器
Ogre::RenderWindow* window = _root->initialise(true,"Ogre3D Beginners Guide");
_sceneManager = _root->createSceneManager(Ogre::ST_GENERIC);
//通过场景管理器实例化------摄像头
Ogre::Camera* camera = _sceneManager->createCamera("Camera");
camera->setPosition(Ogre::Vector3(0,0,50));
camera->lookAt(Ogre::Vector3(0,0,0));
camera->setNearClipDistance(5);
//通过渲染窗口和摄像机实例化------视口
Ogre::Viewport* viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0.0,0.0,0.0)); //设置视口为黑色
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
_listener = new MyFrameListener(window,camera,viewport);
_root->addFrameListener(_listener);
loadResources(); //载入资源
createScene(); //画画
//因为剧情需要,把startRendering注释了╮(╯▽╰)╭
//_root->startRendering(); //开始渲染,因为我们给了root很多东西,他就在他的循环里头自己玩了,不会返回
return 0;
}
void renderOneFrame()
{
Ogre::WindowEventUtilities::messagePump();
_keepRunning = _root->renderOneFrame();
}
bool keepRunning()
{
return _keepRunning;
}
MyApplication()
{
_sceneManager = NULL;
_root = NULL;
_listener = NULL;
}
~MyApplication()
{
delete _root;
delete _listener;
}
};
int main()
{
/* Ogre::Root* root = new Ogre::Root("plugins_d.cfg");
if (!root->showConfigDialog())
{
return -1;
}
Ogre::RenderWindow* window = root->initialise(true,"Ogre3D Beginners Guide");
Ogre::SceneManager* sceneManager = root->createSceneManager(Ogre::ST_GENERIC);
Ogre::Camera* camera = sceneManager->createCamera("Camera");
camera->setPosition(0,0,50);
camera->lookAt(0,0,0);
camera->setNearClipDistance(5);
Ogre::Viewport* viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0,0,0));
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
Ogre::ConfigFile cf;
cf.load("resources_d.cfg");
Ogre::ConfigFile::SectionIterator sectionIter = cf.getSectionIterator(); //迭代器好像都不是指针
Ogre::String sectionName, typeName, dataname;
while (sectionIter.hasMoreElements())
{
sectionName = sectionIter.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
dataname = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname,typeName,sectionName);
}
}
//Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../../Media/packs/Sinbad.zip","Zip");
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
Ogre::Entity* ent = sceneManager->createEntity("Sinbad.mesh");
sceneManager->getRootSceneNode()->attachObject(ent);
root->startRendering();*/
MyApplication app;
app.startup();
while(app.keepRunning())
{
app.renderOneFrame();
}
return 0;
}
OGRE(六)
最新推荐文章于 2020-09-04 18:02:19 发布