/** 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;
}