现在的位置: 首页 > 综合 > 正文

Irrlicht引擎手册示例(一):Hello,World!

2012年09月16日 ⁄ 综合 ⁄ 共 4940字 ⁄ 字号 评论关闭

本例讲述如何为Irrlicht引擎设置您的IDE、如何用它写一个简单的HelloWorld程序。程序代码将展示如何使用引擎里的最基本的东西:VideoDriver(视频驱动),GUIEnviroment(GUI环境)和SceneManager(场景管理器)。
示例程序运行结果如下:

 

  配置IDE
  要使用引擎,得包含头文件<irrlicht.h>(见引擎SDK中的include目录)。为了让编译器找到我们的头文件,必须指定头文件所在的目录。在这方面第个IDE和编译器都有所不同,我们以微软的Visual Stadio C++6.0和.NET版来说明:
  ·如果你用的是6.0版本,打开菜单(注①)TOOLS->Options,选择目录选项卡,组合框里的Include选项,在目录列表中添加Irrlicht引擎的inlclude目录。现在编译器将能找到头文件Irrlicht.h。我们还需要将irrlicht.lib的位置添加到列表中,所以请点击Libraries选项卡,然后添加目录/lib/VisualStudio。
       

  ·如果您的IDE是Visual Studio .NET,请打开菜单Tools->Options。打开左边的Projects文件夹,选VC++目录,在组合框中选'show directories for include files',添加引擎的/include目录所在文件夹到列表目录以便编译器能够找到头文件Irrlicht.h。我们还需要编译器找到irrlicht.lib,所以选'show directories for Library files'添加/lib/VisualStudio目录就好了。
 

  现在开始:
  配置完IDE后,编译器就能找到Irrlicht引擎的头文件,所以我们可以在代码中包含引擎头文件。

  #include <irrlicht.h>   

  Irrlicht引擎中所有的东西都放在命名空间irr里面。所以如果你想使用引擎中的类,请在类名前打上irr::。比如用IrrlichtDevice,就写irr::IrrlichtDevice。为避免在每个类名前都加irr::,告诉编译器我们想用的命名空间。
[code]using namespace irr;  [/code]  引擎中有5个子命名空间。要查看手册中关于它们的详细描述,您可以点击顶部菜单项'Namespace List'.为保持示例代码简洁,我们不想每次都得指定命名空间,因此我们这么写:

  using namespace core;
  using namespace scene;
  using namespace video;
  using namespace io;
  using namespace gui;

  为使用Irrlicht.dll文件,我们还需要用Irrlicht.lib来连接。这个一方面可以在工程里设置,但另一方面,我们可以简单地用paragma语句:

  #pragma comment(lib, "Irrlicht.lib")  

  现在轮到main函数了:为让例子简洁些,我们用int main()(注②),因为它可以被用在任何平台上。然而在windows平台,我们也可以直接用WinMain函数,如果你想摆脱掉程序用main()函数启动时弹出的控制台窗口的话。

  int main()
  {
 

  引擎中最重要的函数要算createDevice()了,用它可以创建一个Irrlicht设备,那可是个让引擎做任何事情的“根对象”。createDevice()函数有7个参数:
  ·deviceType:设备类型,通常可空(为NULL)。软设备有Direct3D8,Direct3D9,或者OpenGL。在这个例子中我们用EDT_SOFTWARE,但出于尝试试目的,你可能会想把它换成EDT_NULL, EDT_DIRECT3D8, EDT_DIRECT3D9 或 EDT_OPENGL?好吧,祝你好运!
  ·windowSize:您要创建的窗口的大小,或者全屏模式。在本例中我们用512x384的分辨率。
  ·bits:全屏模式时每像素的位数。应当是16或32。当运行于窗口模式时该参数被忽略。
  ·fullscreen:指定是否想让设备运行在全屏模式。
  ·stencilbuffer:指定是否想在绘制阴影里使用模板缓存。
  ·vsync:指定是否允许场扫描同步,只在全屏模式下可用。
  ·eventReceiver:一个接受事件的对象。这里我们不用,因此设为0。

  IrrlichtDevice *device  =  createDevice(EDT_SOFTWARE,  dimension2d<s32>(512, 384), 16,false, false, false, 0);   

  现在我们窗口标题加点内容,让它变得好看些。注意在字符串前面有个'L':Irrlicht引擎在显示文字时用宽字符。

  device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");  

  好,随后我们把指向视频驱动器、场景管理器和GUI环境的指针保存起来,以免老是写这样的代码:device->getVideoDriver(),device->getSceneManager(), 和device->getGUIEnvironment().

  VideoDriver* driver = device->getVideoDriver();ISceneManager* smgr = device->getSceneManager();IGUIEnvironment* guienv = device->getGUIEnvironment();  

  我们用GUI环境给窗口添个HelloWorld标签,文本被放在从左上角(10,10)到右下角(200,22)的矩形中。

  guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!",
 rect<int>(10,10,200,22), true);  

  让我们的例子更有趣些――加载个Quake2模型然后显示它,怎么样?其实只需用getMesh()从场景管理器里得到一个网格,再用addAnimatedMeshSceneNode()添加一个场景结点以便在屏幕上显示。然而不仅限于加载Quake2文件(.md2),其它如一个Maya对象文件(.obj),一幅完整的Quake3地图或者Milshape文件也都是可以的噢!
  顺便一提,那个酷酷的叫sydney.md2 的模型是Brian Collins做的。

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

  为了让网格模型(注③)更漂亮点,我们稍稍改一下材质:禁止光照,因为这里没有动态光源,况且这个模型也是全黑的;然后,把动画的循环帧设为从0到310;最后,将纹理应用到网格上――不然的话引擎会用纯色来绘制。

  if (node)
  {
  node->setMaterialFlag(EMF_LIGHTING, false);
  node->setFrameLoop(0, 310);
  node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
  }   

  为了能看见模型,我们在3D空间的(0, 10, -40)位置上放一个相机,相机从此处朝(0,5,0)的方向看。

  smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

  好,既然已经布置完场景,那就开始画吧!我们在一个While()循环里面运行设备——直到它停下来为止,也就是当用户关闭窗口或者按ALT+F4(windows)时。

  while(device->run())
  {
  

  所有的绘制必须放在beginScene()和endScene()的调用之间。beginScene()用某种颜色清屏,如果想使用深度缓存的话也可以。然后就让场景管理器和GUI环境绘制他们的内容。调用endScene()时,所有刚刚绘制的东西都表现在屏幕上。

  driver->beginScene(true, true, SColor(255,100,101,140));
  smgr->drawAll();
  guienv->drawAll();
  driver->endScene();
  }  

  完成上面的循环后,我们应该删除以前用createDevice()创建的Irrlicht设备。在Irrlicht引擎中,您应当删除所有用带'create'前缀的方法或函数创建的对象。这种对象可以简单地用->drop()来删除。更多细节参考手册

  device->drop(); return 0;
  }  

  就这样!编译,运行。

  可能遇到的错误或问题
  Visual Studio
    在编译手册中的例子时你可能会遇到如下错误:
    fatal error C1083: Cannot open include file: 'irrlicht.h': No such file or directory  
  解决方法:你可能在配置Visual Studio的选项时include目录不合适。请参考本例开头所述。
    LINK : LNK6004: HelloWorld.exe not found or not built by the last incremental link; performing full link
    LINK : fatal error LNK1104: cannot open file "Irrlicht.lib"
    Error : executing link.exe 
  解决方法:可能是library目录设的不对,请参考本例开头所述。

  与编译器无关的问题
  如果手册中的例子成功编译但给出如下错误:  This application has failed to start because Irrlicht.dll was not found. Re-installing the application may fix this problem
  解决方法:您可能忘了从Irrlicht/bin/VisualStudio目录中拷贝Irrlicht.dll文件到您工程文件所在目录。
  如果手册中的例子成功编译并运行,但在控制台提示如下错误:Could not load mesh, because file could not be opened.: ../media/sydney.md2  
  或:
    Could not open file of texture: stones.jpg
    Could not load texture: stones.jpg  

  解决方法:找不到出错信息中列出的文件。确保在main.cpp文件中指定的目录存在并且缺少的文件也在此目录中。

  ――――――――――
  注①:原文为Extras,在VC6的德语版中TOOLS菜单名为Extras?
  注②:原文是void main(),应该是作者笔误吧。
  注③:原文mesh(网格). 模型的顶点、骨骼信息,表示模型资源.见[翻译]Irrlicht引擎简介。

抱歉!评论已关闭.