OGRE(六)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值