返回> 网站首页
Irrlicht 游戏引擎开发 cooliris 界面(二)
yoours2011-01-24 17:03:37
简介一边听听音乐,一边写写文章。
经过昨天比较枯燥的准备工作后,今天我们的目标是实现本地图片载入 3D 场景,主要内容是熟悉irrlicht引擎,创建一个3D窗口,并绘制图片。
总共有两个示例,源代码下载:
一、irrlicht 简介
irrlicht 游戏引擎的分成五大块:
? Core: 容器类和数学库 namespace irr::core
? Scene: 三维场景绘制和管理 namespace irr::scene
? Video: 图片纹理的载入和管理 namespace irr::video
? GUI: 二维 GUI 控件 namespace irr::gui
? FileSystem: 文件系统读写 namespace irr::io
编写任何一个 irrlicht 程序,首先要获得设备指针 IrrlichtDevice* device:
- video::E_DRIVER_TYPE driver_type = irr::video::EDT_OPENGL;
- core::dimension2d<s32> screen_resolution = core::dimension2d<s32>(1280, 800);
- u32 color_depth = 32;
- bool is_full_screen = true;
- IrrlichtDevice* device = irr::createDevice(driver_type, screen_resolution, color_depth,
- is_full_screen);
driver_type为驱动类型,可以选择OPENGL,DX8 或 DX9。其余几个参数分别为分辨率,颜色深度,是否全屏。
s32, u32 为 irrlicht 定义的类型,分别对应 int 和 unsigned int。
获得 device 指针以后,就可以得到属于该 device 的四大块功能:
- video::IVideoDriver* driver = device->getVideoDriver();
- scene::ISceneManager* scene_mgr = device->getSceneManager();
- gui::IGUIEnvironment* gui_env = device->getGUIEnvironment();
- io::IFileSystem* file_system = device->getFileSystem();
通过 driver 载入图片和 texture,通过 scene_mgr 为3d场景添加 irrlicht 内置支持的 mesh 等工作完成后,即可进入主循环,主循环结束时,释放 device,程序结束。其中 beginScene 的参数 SColor(alpha, r, g, b) 为背景色。
- while (device->run())
- {
- if (device->isWindowActive())
- {
- driver->beginScene(true, true, video::SColor(0, 0, 0, 0));
- scene_mgr->drawAll();
- gui_env->drawAll();
- driver->endScene();
- }
- }
- device->drop();
值得一提的是 drop() 函数。Irrlicht中大部分类都继承自一个 IReferenceCounted 的接口,类似智能指针。Irrlicht 中的惯例是不使用 delete 删除对象,而调用该接口的 drop() 函数。在添加对象的引用时,调用 grap() 函数。
- // 为场景添加一个立方体,边长100
- scene::ISceneNode* cube = scene_mgr->addCubeSceneNode(100.0f);
- // 载入纹理
- video::ITexture* tex = driver->getTexture("box.jpg");
- // 将纹理附加到立方体上
- cube->setMaterialTexture(0, tex);
- // 将纹理EMF_LIGHTING属性设为false
- // 表示该纹理现实与光源无关,即为图片自身颜色
- cube->setMaterialFlag(video::EMF_LIGHTING, false);
- // 使纹理支持半透明,半透明效果与图片相同
- cube->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL);
- // 添加一个相机,在(700,700,-700)位置,往(0,0,0)位置拍摄。
- scene::ICameraSceneNode* camera = scene_mgr->addCameraSceneNode(0,
- core::vector3df(700,700,-700), core::vector3df(0,0,0));
- video::ITexture* tex = era::Util::Instance()->GetDriver()->addTexture("", img);
- core::vector3df size(img->getDimension().Width, img->getDimension().Height, 0.01);
- wallitem = smgr->addCubeSceneNode(1, smgr->getRootSceneNode(), -1,
- core::vector3df(400*(i/3),300*(1-(i%3)), 0), core::vector3df(0,0,0), size);
今天就到这里,下一篇,我们让它动起来 。
- example_1.zip (9.2 KB)
- 下载次数: 165
- example_2.zip (1.6 MB)
- 下载次数: 212