第九章 OGRE中的整个流程

本文介绍了使用Ogre3D引擎进行游戏开发的基本步骤,包括资源加载、场景管理、渲染循环及用户输入处理等核心内容,并展示了如何通过配置文件简化资源路径的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1个例子:

//1 begin
#include "Ogre.h"
int main()
{
	Ogre::Root* root=new Ogre::Root("plugins_d.cfg");
	//The default value is plugins.cfg,which is true for the release folder of the Ogre 3D SDK,but our application is running in the debug folder where the filename is 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(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()));
	//2 begin
	//2.1 begin
/*
	Ogre::ResourceGroupManager::getSingleton().addResourceLocation("D:\\Work Files\\OGRE\\ogre_src_v1-7-4\\Samples\\Media\\packs\\Sinbad.zip","Zip");//注意转义字符的表达
	//Adding a new line of code for each zip archive or folder we want to load is a tedious task and we should try to avoid it.The ExampleApplications used a configuration file called resources.cfg
	Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();*/

	//2.1 end
	//3|2.1 begin
	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().initialiseAllResourceGroups();
	
	//3|2.1 end
	Ogre::Entity* ent=sceneManager->createEntity("Sinbad.mesh");
	sceneManager->getRootSceneNode()->attachObject(ent);
	//2 end
	root->startRendering();
	return 0;
}
//1 end

第2个例子

//1 begin
#include "Ogre.h"
//4 begin
#include "OIS.h"
//4 end 
//2 begin
class MyFrameListener:public Ogre::FrameListener
{
public:
	//4 begin
	MyFrameListener(Ogre::RenderWindow* win,Ogre::Viewport* viewport)
	{
		_viewport=viewport;
		_comp1=false;
		_comp2=false;
		_comp3=false;
		_down1=false;
		_down2=false;
		_down3=false;
		OIS::ParamList parameters;
		unsigned int windowHandle=0;
		std::ostringstream windowHandleString;
		win->getCustomAttribute("WINDOW",&windowHandle);
		windowHandleString<<windowHandle;
		parameters.insert(std::make_pair("WINDOW",windowHandleString.str()));
		_InputManager=OIS::InputManager::createInputSystem(parameters);
		_Keyboard=static_cast<OIS::Keyboard*>(_InputManager->createInputObject(OIS::OISKeyboard,false));
	}
	~MyFrameListener()
	{
		_InputManager->destroyInputObject(_Keyboard);
		OIS::InputManager::destroyInputSystem(_InputManager);
	}
	//4 end
	bool frameStarted(const Ogre::FrameEvent& evt)
	{

		//2.1 begin
		//return false;
		//2.1 end
		//4|2.1 begin
		_Keyboard->capture();
		if(_Keyboard->isKeyDown(OIS::KC_ESCAPE))
		{
			return false;
		}
		if(_Keyboard->isKeyDown(OIS::KC_1) && !_down1)
		{
			_down1=true;
			_comp1=!_comp1;
			Ogre::CompositorManager::getSingleton().setCompositorEnabled(_viewport,"Compositor2",_comp1);
		}
			if(_Keyboard->isKeyDown(OIS::KC_2) && !_down2)
		{
			_down2=true;
			_comp2=!_comp2;
			Ogre::CompositorManager::getSingleton().setCompositorEnabled(_viewport,"Compositor3",_comp2);
		}
		if(_Keyboard->isKeyDown(OIS::KC_3) && !_down3)
		{
			_down3=true;
			_comp3=!_comp3;
			Ogre::CompositorManager::getSingleton().setCompositorEnabled(_viewport,"Compositor7",_comp3);
		}
		if(!_Keyboard->isKeyDown(OIS::KC_1))
		{
			_down1=false;
		}
		if(!_Keyboard->isKeyDown(OIS::KC_2))
		{
			_down2=false;
		}
		if(!_Keyboard->isKeyDown(OIS::KC_3))
		{
			_down3=false;
		}
		return true;
		//4|2.1 end
	}
	bool frameEnded(const Ogre::FrameEvent& evt)
	{
		return true;
	}
	bool frameRenderingQueued(const Ogre::FrameEvent& evt)//当场景渲染到back buffer,未交换之前,调用该函数
	{
		return true;
	}
	//注意:需要在这三个函数中之一检测窗口是否关闭.如果已关闭需返回false.否则会出现窗口已关闭,但进程还在的情况.
	//ExampleFrameListener.h中	
	//bool frameRenderingQueued(const FrameEvent& evt)
	//{
	//	if(mWindow->isClosed())	return false;
	//	...
	//}
//4 begin
private:
	OIS::InputManager* _InputManager;
	OIS::Keyboard* _Keyboard;
	Ogre::Viewport* _viewport;
	bool _comp1,_comp2,_comp3;
	bool _down1,_down2,_down3;
//4 end
};
//2 end
class MyApplication
{
private:
	Ogre::SceneManager* _sceneManager;
	Ogre::Root* _root;
	//2 begin
	MyFrameListener* _listener;
	//2 end
	//3 begin
	bool _keepRunning;
	//3 end

public:
	MyApplication()
	{
		_sceneManager=NULL;
		_root=NULL;
		//2 begin
		_listener=NULL;
		//2 end
	}
	~MyApplication()
	{
		delete _root;
		//2 begin
		delete _listener;
		//2 end
	}
	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();
			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().initialiseAllResourceGroups();
	}
	//3 begin
	void renderOneFrame()
	{
		Ogre::WindowEventUtilities::messagePump();
		_keepRunning=_root->renderOneFrame();
	}
	bool keepRunning()
	{
		return _keepRunning;
	}
	//3 end
	int startup()
	{
		_root=new Ogre::Root("plugins_d.cfg");
		if(!_root->showConfigDialog())
		{
			return -1;
		}
		Ogre::RenderWindow* window=_root->initialise(true,"Ogre3DBeginners 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()));
		loadResources();
		createScene();
		//2 begin
		//2.2 begin
		//_listener=new MyFrameListener();
		//2.2 end
		//4|2.2 begin
		_listener=new MyFrameListener(window,viewport);
		//4|2.2 end
		_root->addFrameListener(_listener);
		//2 end
		//1.1 begin
		//_root->startRendering();//Ogre提供的渲染循环
		/*
		void Root::startRendering(void)
		{
			assert(mActiveRenderer != 0);

			mActiveRenderer->_initRenderTargets();

			// Clear event times
			clearEventTimes();

			// Infinite loop, until broken out of by frame listeners
			// or break out by calling queueEndRendering()
			mQueuedEnd = false;

			while( !mQueuedEnd )
			{
				//Pump messages in all registered RenderWindow windows
				WindowEventUtilities::messagePump();

				if (!renderOneFrame())
					break;
			}
		}
		*/
		//1.1 end
		//4 begin
		Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor2");
		Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor3");
		Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor7");
		//3个合成器相互独立,最终结果为3个合成器的累加
		//4 end
		return 0;
	}
	void createScene()
	{
		Ogre::Entity *ent=_sceneManager->createEntity("Sinbad.mesh");
		_sceneManager->getRootSceneNode()->attachObject(ent);
	}
};
void main()
{
	MyApplication app;
	app.startup();
	//3|1.1 begin
	while(app.keepRunning())
	{
		app.renderOneFrame();
	}
	//3|1.1 end


}
//1 end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值