这份指南告诉你如何配置IDE环境来使用鬼火引擎,以及如何使用它来写一份简单的HelloWorld。 这个程序将告诉我们如何简单的使用VideoDriver视频驱动,GUIEnvironmentGUI环境和SceneManager场景管理器。


/*
这份指南告诉你如何配置IDE环境来使用鬼火引擎,以及如何使用它来写一份简单的HelloWorld。
这个程序将告诉我们如何简单的使用VideoDriver视频驱动,GUIEnvironmentGUI环境和SceneManager场景管理器。

使用这个引擎,我们首先需要包含irrlicht.h这个头文件,它包含在鬼火引擎SDK的\include中。

首先让编译器找到这个头文件,我们应当在项目中指定该文件夹路径。这个过程和你所使用的IDE环境不同而不同。
我这里只介绍一下VC6.0和.NET的设置方式。

点工具->选项->设置,添加其头文件和库文件路径。这样的话你就可以顺利的在鬼火引擎上进行开发。

*/
#include <irrlicht.h>
#include <windows.h>
/*
在鬼火引擎中,所有的代码都被命名空间irr约束着。所以如果你想调用引擎中的任何一个类,你必须在类名前
这样写 irr::ClassName,例如,你要使用IrrlichtDevice类,你就这么写irr::IrrlichtDevice。
或者偷懒,告诉编译器使用命名空间.using namespace irr;
*/
using namespace irr;

/*
下面是五个子命名空间。你会在文档中的NamespaceList中找到他们。
就象上面的命名空间一样,如果你想偷懒,直接告诉编译器好了。
*/
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

/*
我们应该包含一个Irrlicht.Dll文件,我们也可以在编译器设置,或者直接这里写一个声明。
*/
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif


/*
int main()是一个主函数,我们在所有平台中都可以这么写。在Windows平台下,我们也可以使用
WinMain函数,但是那样的话,我们将失去一个控制台。
*/
int main()
{
/*
引擎函数中最重要的函数就是“CreateDevice”创建设备了。鬼火引擎做一切事情的根对象
就是这个鬼火设备了。
CreateDevice有七个参数。
1:设备类型deviceType:
可以是空设备,软件模拟设备,第三方渲染设备,D3D8,D3D9,OpenGL。在例子里我们使用的是EDT_SOFTWARE
的软件模拟方式,但是你可以拿EDT_BURNINGSVIDEO, EDT_NULL, EDT_DIRECT3D8 , EDT_DIRECT3D9,或EDT_OPENGL
进行测试。
2:窗口宽高
3:窗口色深
4:是否全屏
5:我们绘制阴影时是否使用摸版缓冲区
6:是否开启同步,注意的是只有全屏时才有效
7:事件接收器的对象,也就是对鼠标消息,键盘消息,用户信息,GUI消息等一系列消息的回调处理函数指针。
   我们这里不加处理的话,设置为0。
*/

IrrlichtDevice *device =
   createDevice( video::EDT_DIRECT3D9, dimension2d<s32>(1024, 768), 32,
    false, false, false, 0);

/*
设置窗口标题文字。
注意,这里有个L在字符串之前,这代表鬼火引擎绘制文字时使用的是宽字节
*/
device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");

/*
获取视频设备,场景管理器和用户图形环境的指针并存储起来。
*/
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();

/*
使用用户图形环境设备绘制一个Label。
*/
guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!",
   rect<int>(10,10,260,22), true);

/*
我们读取一个模型文件并且显示它。
步骤很简单,只需要使用场景管理器getMesh()读取mesh信息.再创建一个场景节点
来显示这个mesh就可以了。
Irr引擎同时还支持.obj(Maya文件).bsp(Quake3地图文件).ms3d(Milshape文件)。
另外,Quake2模型的导入支持也可以在网上找到。BrianCollins写的。

*/
IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");

IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );

/*
接下来我们让Mesh看起来更漂亮一些,我们对其材质环境进行一些设置:
1:我们在这里不需要使用动态光影,所以先关闭灯光效果,若打开了将会是一团黑影
2:然后我们设置桢循环,保证我们的模型动作。
3:最后我们在Mesh上贴一层纹理,若是没纹理的话,Mesh上将会填充一种颜色。
*/
if (node)
{
   node->setMaterialFlag(EMF_LIGHTING, false);
   node->setMD2Animation ( scene::EMAT_STAND );
   node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
}

/*
设置摄象头的3D空间位置(0,30,-40)以及观察目标点(0,5,0)
*/
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

/*
好了,现在我们设置好了场景,还是绘制吧。
首先我们创建一个死循环,除非我们按下ALT+F4导致设备不再运行,这个循环就会持续下去。
*/
while(device->run())
{
   /*
   在beginScene()和endScene()中间写下需要绘制的代码。
   其中,beginScene会将屏幕以指定的颜色和深度缓冲清空。
   之后我们使用场景管理器和GUI环境去进行内存中的绘制。
   最后endScene会这些东西绘制到屏幕上。
   */
   driver->beginScene(true, true, SColor(255,100,101,140));

   smgr->drawAll();
   guienv->drawAll();

   driver->endScene();
}

/*
当我们一切都OK了之后,我们再释放Irr设备就可以了。
我们需要注意的是,前面的视频设备,场景管理器,GUI环境这些仅仅是进行了获取,
并非"Create",所以我们仅需要删除Irr设备,它是Create出来的。
我们->drop()函数将其释放。
更详细的信息可以查看Irr官方的说明。http://irrlicht.sourceforge.net//docu/classirr_1_1IUnknown.html#a3
*/
device->drop();

return 0;
}