Irrlicht学习备忘录——1 HelloWorld

来源:互联网 发布:网络诽谤报警流程 编辑:程序博客网 时间:2024/05/20 19:48

1 HelloWorld

官方代码($sdk)\examples\01.HelloWorld


看起来200多行代码,挺吓人。仔细看清楚点,实际上没那么多,真正的代码不足50行,其他都是注释。我的英文够烂了,开着词霸,一个一个词的看,都能看懂写的大概意思,比我水平高的人,应该更不是问题了。

这个例子估计多年没有修改了,写的注释都有些不适用了。一开头的一大段说的是如何配置IDE环境,并详细的介绍了VC6.0VS.NET的配置方法。哎,都是那么古老的工具,早就版本升级了多少次了,完全不适用。

其实irr的开发环境的搭建很简单,把需要包含头文件和链接库包含进去就行了。在包含目录里添加头文件所在的目录,库目录里添加irr链接库的所在的目录,链接文件里添加上irr需要的链接文件Irrlicht.libIrrlicht.a(gcc)。动态链接库Irrlicht.dll丢到新建的工程目录下,或工程生成的exe文件所在目录就可以了。哎,哪种库不是这样配置使用的,就静态库和动态库的名字不一样而已。这都搞不定的,应该去看CC++开发环境的使用教程。

下面看具体的代码

1#include <irrlicht.h>这句话包含irr引擎所需的头文件,CC++的基础,没啥好啰嗦的。使用irr就只需添加这么一个头文件就行了,其他的头文件在irrlicht.h已经包含了。

2using namespace irr;引擎的名字空间,整个引擎的功能都在这个名字空间下。在irr名字空间下还有corescenevideoiogui几个名字空间。

3using namespacecore;引擎核心类,各种数据结构,自定义结构类型都在这个名字空间下。

4using namespacescene;所有跟场景相关的功能都在它下面。主要有场景管理,场景节点,摄象机,粒子系统,Mesh,公告版,灯光,动画器,天空盒,地形等。

5using namespacevideo;内部主要是负责对视频驱动的设置,2D3D渲染都在这里实现。包括了纹理,材质,灯光,图片,顶点等渲染属性的控制。

6using namespaceio;所有输入输出,xml,zip,ini文件读取写入等操作接口的功能都在它里面。

7using namespacegui;引擎提供的常用的图形用户接口类,实现了各种常用控件在这个名字空间下。

下面4行,只要IDE环境配置好,完全不需要,就是宏定义和预编译内容。说的就是如果是在windows环境下使用irr引擎,链接时需要使用Irrlicht.lib链接库。链接成windows程序,并使用控制台入口函数mainCRTStartup调用main函数。干的内容跟新建工程时选择控制台程序或Win32程序完全一样。

#ifdef_IRR_WINDOWS_

#pragmacomment(lib, "Irrlicht.lib")

#pragmacomment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")

#endif

8int main()

9{

10IrrlichtDevice*device=createDevice( video::EDT_SOFTWARE,dimension2d<s32>(640,480), 16,false, false, false,0);创建一个irr设备,所有引擎功能都在IrrlichtDevice中,创建它是必须的。createDevice函数有7个参数(1:设备类型,可选空设备、irr软件渲染、Burningsvideo软件渲染、Direct3D8Direct3D9OpenGL2:窗口宽高。3:窗口色深。4:是否全屏。5:绘制阴影时是否使用摸版缓冲区。6:是否开启同步,注意的是只有全屏时才有效。7:事件接收器的对象,也就是对鼠标消息,键盘消息,用户信息,GUI消息等一系列消息的回调处理函数指针。)这些内容,看irrlicht.h文件,里面写的更详细。在大部分IDE环境中选择函数名点右键,转到定义就能转到它在头文件中定义的位置。

11if (!device) return 1;如果创建irr设备失败,退出程序。

12device->setWindowCaption(L"HelloWorld! - Irrlicht EngineDemo");设置窗口标题栏名称。这里可以显示中文,它设置的是windows窗口上显示的文字。

13IVideoDriver* driver =device->getVideoDriver();获取视频驱动。获取纹理,材质这些都要使用它。

14ISceneManager* smgr =device->getSceneManager();获取场景管理器。场景管理器用于管理三维场景里的节点,没一个三维场景里显示的内容都被建立成一个场景节点进行管理。

15IGUIEnvironment* guienv =device->getGUIEnvironment();获取GUI环境。所有GUI控件都通过它建立。

16 guienv->addStaticText(L"HelloWorld! This is the Irrlicht Softwarerenderer!",rect<s32>(10,10,260,22),true);在窗口中添加一个静态文本框。也就是其他GUI里常见的Label

17IAnimatedMesh* mesh =smgr->getMesh("../../media/sydney.md2");获取一个动画网格模型。使用getMesh(文件名)从三维模型文件中读取出irr所需的网格模型。再将网格模型添加到场景节点后,绘制场景时就能显示该模型了。

18if(!mesh)如果创建动画网格模型失败

19{

20 device->drop();销毁irr设备

21 return1;退出程序

22}

23IAnimatedMeshSceneNode*node = smgr->addAnimatedMeshSceneNode( mesh);在场景管理器里使用前面创建的动画网格模型添加一个动画网格模型场景节点

24if(node)如果添加场景节点成功

25{

26 node->setMaterialFlag(EMF_LIGHTING,false);设置场景节点材质,将材质中光照关闭。因为该例子里没有添加光照,材质启用光照后,看到的模型因无光照将是一团黑。关闭光照后,将直接显示,不再进行光照计算。

27 node->setMD2Animation(EMAT_STAND);设置动画循环状态,setMD2Animation是针对.md2文件设计的,.md2文件中已经有各动作的开始帧和结束帧,其他模型文件格式不支持,EMAT_STAND为站立状态。如果使用其他模型文件格式,应使用setFrameLoop(开始帧,结束帧)

28 node->setMaterialTexture(0, driver->getTexture("../../media/sydney.bmp"));设置场景节点材质所使用的贴图。用getTexture(文件名)获取贴图。如果没纹理的话,网格模型上将会填充一种颜色。

29}

30smgr->addCameraSceneNode(0,vector3df(0,30,-40), vector3df(0,5,0));添加照相机场景节点。照相机3D空间位置(0,30,-40),观察目标点(0,5,0)

31while(device->run())如果irr设备运行就执行循环。这跟Windows消息循环一样,run()里执行了irr的消息处理的功能。循环里放置绘图功能,每循环一次绘制一帧图像。因程序里没有添加任何退出程序的功能,程序将一直在该循环里持续运行,直到点击窗口上的关闭按钮,或按下ATL+F4,这是irr设备将收到退出程序的消息,并停止执行,run()这时返回false,循环停止。

32{

33 driver->beginScene(true,true,Scolor(255,100,101,140));开始绘制屏幕,并与指定的颜色清空颜色缓冲区,同时清空深度缓冲区。irr使用的是双缓冲区,一个缓冲区用于绘图,另一个缓冲区用于显示。因此需先使用beginScene通知绘图,绘制玩后再用endScene通知交换缓冲区。如果绘图前不清空缓冲区,将会在上一次绘制的内容上进行绘图。

34 smgr->drawAll();绘制场景管理器里的所有场景节点

35 guienv->drawAll();绘制GUI

36 driver->endScene();结束绘制屏幕,并显示绘制的内容。

37}

38device->drop();销毁irr设备

39return0;退出程序

40}

irr官方sdk里编译好的运行库并没有对宽字符文字显示做扩展,因此暂不支持中文显示。需要自己修改源码后获得支持。

原创粉丝点击