/** Example 001 HelloWorld */ #include <irrlicht.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") #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") #endif /* int main()是一个主函数,我们在所有平台中都可以这么写。在windows平台下,我们也可以使用 WinMain函数,但是那样的话,我们将失去一个控制台。 */ int main() { //引擎函数中最终要的函数就是“CreateDeive”创建设备了。鬼火引擎做一切事情的根对象就是这个鬼火设备了 //CreateDevice有七个参数。 //1、设备类型deviceType可以是空设备,软件模拟设备,第三方渲染设备,D3D8,D3D9,OpenGl, //在例子里我们使用的是EDT_SOFATEWARE的软件模拟方式, //你也可以拿EDT_NULL,EDT_DIRECT3D8,EDT_DIRECT3D9,EDT_OPNGL进行测试 //2、窗口宽高 //3、窗口色深 //4、是否全屏 //5、我们绘制阴影时是否使用模板缓冲区 //6、是否开始同步,注意的是只有全屏时才有效 //7、时间接收器的对象,也就是对鼠标消息,键盘消息,用户消息,GUI消息等一系列消息的回调处理函数指针。 //我们这里不加处理的话设置为0 IrrlichtDevice *device =createDevice( video::EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,false, false, false, 0); if (!device) return 1; //设置串口标题文字,注意,这里有个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<s32>(10,10,260,22), true); //我们读取一个模型文件并显示它,步骤很简单,只需要使用场景管理器getMesh信息,再创建一个场景节点来显示这个mesh就可以了。 //irr引擎同时还支持.obj(Maya文件).bsp(Quake3地图文件).ms3d(milshap文件)另外,Quake2模型的导入支持也可以在网上找到 IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); if (!mesh) { device->drop(); return 1; } IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); //接下来我们让Mesh看起来更漂亮一些,我们对其材质环境进行了一些设置: //1、我们在这里不需要使用动态光影,所以先关闭灯光效果,若打开了将会是一团黑影 //2、然后我们设置帧循环,保证我们的模型动作 //3、最后我们在Mesh上贴一层纹理,若是没纹理的话,Mesh上将会填充一种颜色 if (node) { node->setMaterialFlag(EMF_LIGHTING, true); 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()函数将其释放。 device->drop(); return 0; }