irrlicht引擎例子001 HelloWorld

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


你可能感兴趣的:(irrlicht引擎例子001 HelloWorld)