【Irrlicht Engine笔记】test1-helloWorld

刁文光
2023-12-01

#include <irrlicht.h>

 

/*
    在鬼火引擎中,每个事物都可以在命名空间irr中找到。
    所以如果你希望使用引擎中的一些类,你需要添加irr::在类名前。
    比如使用IrrlichtDevice需要写irr::IrrlichtDevice。
    为了摆脱总写irr::的麻烦,我们告诉编译器我们使用命名空间。
*/
using namespace irr;

/*
    在鬼火引擎中还有五个子命名空间。
    你可以在'Namespace List'找到详细介绍或着使用http://irrlicht.sourceforge.net/docu/namespaces.html
    就像irr命名空间一样,我们不希望总输入这5个子命名空间。
    我们也同样告诉编译器使用这些命名空间。
*/
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

/*
为了可以使用Irrlicht.DLL 文件,我们需要链接到Irrlicht.lib去。
我们可以在项目的选项中设置这些,但为了简单我们在这里表示链接库。
*/
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif


/*
    这是主函数。我们可以在所有平台用int main()。
    在windows平台的话,如果想摆脱操作台,我们还可以用winmain函数。
    但是为了让这个函数尽量简单,我们用main函数就好了。
*/
int main()
{

    IrrlichtDevice *device =
        createDevice( video::EDT_SOFTWARE, dimension2d<s32>(640, 480), 16,
            false, false, false, 0);
    /*
        首先建立一个设备~
        device类

        参数解释
        1 设备类型:驱动的类型(Type of the device)
          video::EDT_NULL  空驱动,用于在没有主导的情况下驱动引擎?空引擎可以载入材质,但不能渲染和显示任何图形。
          ->video::EDT_SOFTWARE  鬼火引擎软件渲染,跨平台,跨硬件。仅用于2d制图,可运行简单的3d函数。这些3d函数运行速度快但不准确,甚至不支持贴图。
             video::EDT_BURNINGSVIDEO    燃烧软件渲染,两个可用于替换鬼火渲染的软件之一。基本上,可以看做是鬼火软件的加速渲染(?)
    它将3d几何形状完全栅格化,可是准确的显示纹理剪切和透视及色彩映射,提供子纹理像素纠正及子纹理元素纠正。
           并且,它提供双线性的纹理过滤和比EDT_SOFTWARE更多的材质驱动。
                     ---本渲染器完全由Thomas Alten完成,3Q a lot~
            video::EDT_DIRECT3D8        Direct3D 8设备,只在Win32平台有效。可实现3d或2d图元的硬件加速渲染。
            video::EDT_DIRECT3D9        Direct3D 9设备,只在Win32平台有效。可实现3d或2d图元的硬件加速渲染。
            video::EDT_OPENGL.            OpenGL设备,在大多数平台上有效。可实现3d或2d图元的硬件加速渲染。
        2 窗口尺寸:窗口大小或显示方式(全屏模式)。
        3 位:全屏模式下是指每像素所占位数,窗口模式下忽略。
        4 全屏:设为真则全屏,否则为窗口模式。
        5 模板缓冲:设定模板缓冲是否激活。设为真时,引擎则绘制模板缓冲阴影。注明:并非所有设备都支持模板缓冲。如果不支持,则不绘出阴影。
        6 垂直同步:指定垂直的同步。设为真,则设备将等待垂直回扫的周期结束,否则不。
        7 接收器:是个用户事件接收器。
        7 sdk_version_do_not_use:不要使用或更换这个参数的值。失效时总设为IRRLICHT_SDK_VERSION。用于sdk版本检验。

        水平同步VS垂直同步(转自http://cs.uuu9.com/200802/104276.shtml)
    垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间。
    垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而恰恰是垂直同步代表着CRT显示器的刷新率水平!

        如果需要使用更多参数,可以使用createDeviceEx()
    */

    device->setWindowCaption(L"~( ̄▽ ̄)~");
    /*设置窗口标题,作为device类的函数出现*/

    /*
        分别获得视频驱动、场景管理器和图形用户界面环境的指针个一头~
        方便下面写程序
        get*作为device类的函数出现
        分别获得指向另三个类的指针
    */
    IVideoDriver* driver = device->getVideoDriver();//获得视频驱动指针
    ISceneManager* smgr = device->getSceneManager();//获得场景管理器指针
    IGUIEnvironment* guienv = device->getGUIEnvironment();//获得gui环境指针

    guienv->addStaticText(L"When you eat grape,you don't spew the tegument;when you don't eat, you do it!",
        rect<s32>(10,10,200,50),true,true,0,-1,1);

    /*
        我们用上面这个gui环境的指针可以在这里加上一些话~

        纯虚函数
        参数解释:
        1 文本:希望显示的文本。在创建够可通过SetText()修改。
        2 矩形:静态文本的位置。
                read after me ~ left left ~ top ~ top ~ width width ~ height height ~
        3 边框:设为真则文本有3d边框。(默认false)
        4 整字换行:设置文本是够换行。(默认true)
        5 父元素:这个参数是一个元素的父元素。(默认为0)比如说一个window,设为0的话就是直接把fader(照明减弱控制器?)放到环境中。
        6 id号:用于识别静态文本元素。(默认为-1)(s32)
        7 背景填充色:设定是否背景被填充。(默认不填)
    */

    /*
        为了显示一些有趣的东西,我们载入一个Quake 2模型并显示它。
        我们只需要通过getMesh()这个函数从场景管理器中获取它,然后用addAnimatedMeshSceneNode()曾加一个场景节点并显示这个网格。
        也可以载入maya文件(.obj)、一个完整的Quake3地图(.bsp)或者Milshape文件(.ms3d)。
        ------cool模型叫sydney由Brian Collins提供
    */
    IAnimatedMesh* mesh =smgr->getMesh("http://www.cnblogs.com/media/sydney.md2");

    //----------test
    IAnimatedMesh* mesh1 = smgr->getMesh("1.obj");
    IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(mesh1,0,-2,vector3df(20,0,0),vector3df(0, 0,0),vector3df(0.1f,0.1f,0.1f));
    if(node1)
    {
        node1->setMaterialFlag(EMF_LIGHTING, false);
        node1->setMD2Animation ( scene::EMAT_STAND );
        node1->setMaterialTexture( 0, driver->getTexture("1.jpg") );
    }
    //~( ̄▽ ̄)~
    //----------test end


    IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh,0,-1,vector3df(0,0,0),vector3df(0,0,0),vector3df(1,1,1));
    /*
        纯虚函数
        参数解释:
        1 网格:载入要显示的动态网格的指针。
        2 父元素:场景的父元素。若没有可为空。(默认为0)
        3 id号:节点的id号。可用于识别场景节点的id号。(默认为-1)
        4 位置:节点应该放置于相对于其父元素的位置。 (默认为vector3df(0, 0, 0))
        5 旋转:场景节点初始时是否旋转。(默认为vector3df(0, 0, 0))
        6 缩放:场景节点的初始缩放值。(默认为(1, 1, 1),(1.5f,1.5f,1.5f))
        7 无指针时显示:没有指针载入时加入场景此节点。(默认为false)
    */

    /*
    为了让网格好看一点,我们改变一点它的材质。
    我们目前不能使用灯光,因为我们没有动态灯在这个场景中,而且网格是全黑的。
    然后我们设置帧循环,那样这个动画就可以izai0到310帧间不断循环。
    最后我们给这个网格加上一个材质。
    如果不加的话,网格将会显示成一个颜色
    */
    if (node)
    {
        node->setMaterialFlag(EMF_LIGHTING, false);
    /*
        参数解释
        1 标志位:设置所有材质的标志位。
            ----------------------------------暂略翻译
            EMF_WIREFRAME                显示二维线框或填充三角形。(默认为false)
            EMF_POINTCLOUD                显示为点云或填充三角形。(默认为false)
            EMF_GOURAUD_SHADING            平面或哥罗德阴影 。(默认为true)
        ->    EMF_LIGHTING                这个材质是否被照亮。(默认为true)
            EMF_ZBUFFER                    z深度是否可用。(默认为true)
            EMF_ZWRITE_ENABLE            z深度是可写或只读。(默认为true。若有透明材质,此参数可忽视。)
            EMF_BACK_FACE_CULLING        backfaceculling是否可用。(默认true)backfaceculling背面可见?
            EMF_BILINEAR_FILTER            双线形过滤是否可用。(默认为true)
            EMF_TRILINEAR_FILTER        三线形过滤是否可用。(默认为false,如果三线形过滤可用,双线性过滤可忽视。)
            EMF_ANISOTROPIC_FILTER        各向异性过滤是否可用。(默认为false,在鬼火中各向异性可与双、三线形过滤一起使用以改善渲染质量。
                                        若选择此参数,基元较不容易模糊。)
            EMF_FOG_ENABLE                雾化是否可用。(默认为false)
            EMF_NORMALIZE_NORMALS        标准化平均量。
                                        如果你需要缩放一个动态的发光模型(lighted model?),你可以激活它。
                                        通常,他的平均量将会缩放比较过度导致较暗。
                                        如果你激活这个参数,平均量将会重新正常化,模型亮度看起来也会比较正常。
            EMF_TEXTURE_WRAP            获得每一层的材质包设置。重写各层的设置。(⊙_⊙?)
            EMF_MATERIAL_FLAG_COUNT        这不是一个标志,而是一个值,指出有几个标志。
            ----------------------怎么设置多个?
        2 新值:更换所有材质的新值。

    */
        node->setMD2Animation ( scene::EMAT_STAND );
    /*
        纯虚函数
        参数可以设置为很多预置动画也可以自定义,此处为预设动画。
        setMD2Animation ( const c8 * animationName)自定义
        setMD2Animation ( EMD2_ANIMATION_TYPE anim)预设
        EMAT_STAND、EMAT_RUN、EMAT_ATTACK、EMAT_PAIN_A、EMAT_PAIN_B、EMAT_PAIN_C、EMAT_JUMP、EMAT_FLIP、EMAT_SALUTE、EMAT_FALLBACK、
       EMAT_WAVE、EMAT_POINT、EMAT_CROUCH_STAND、EMAT_CROUCH_WALK、EMAT_CROUCH_ATTACK、EMAT_CROUCH_PAIN、EMAT_CROUCH_DEATH、EMAT_DEATH_FALLBACK、
        EMAT_DEATH_FALLFORWARD、EMAT_DEATH_FALLBACKSLOW、EMAT_BOOM、EMAT_COUNT(不是动画,而是动画类型的数量)
        ----------------------怎么设置多个?

    */
        node->setMaterialTexture( 0, driver->getTexture("http://www.cnblogs.com/media/sydney.bmp") );
    /*
        参数解释:
        1 材质层:0=<材质应该放在底基层<=MATERIAL_MAX_TEXTURES.
        2 材质:所用的材质
    */
    }

    /*
    为了可以看到网格,我们在3d空间里放置一个摄像机在(0, 30, -40)的位置。
    摄像机从那儿看向(0,5,0)。
    */
    smgr->addCameraSceneNode(0, vector3df(0,30,-40),vector3df(0,5,0));
    /*
        参数解释:
            1 位置:摄像机所在的空间中所应该放置的相对于其父节点的位置。
            2 看向:摄像机应该看相的位置。也叫目标。
            3 父节点:摄像机的父场景节点。可以为空。父节点移动时,摄像机跟随移动。
            4 id号:摄像机的id号。可用于设别摄像机。
        -----------父节点id号为什么不能设为-1?
    */

    /*
        好了,现在我们建立起了这个场景,让我们来绘出所有东西。
        我们在一个while循环中启用设备,知道设备不想绘出东西。
        这应该是用户关闭窗口或者按下了ALT+F4。
    */
    while(device->run())
    {
    /*
        所有东西的绘制都在beginScene()和endScene()的调用之间。
        beginScene用一种颜色清除屏幕上的颜色和深度(如果需要的话)。
        然后我们让场景管理器和gui环境绘制他们所含有的。
        用endScene来将所有东西呈现到屏幕上。
    */
        driver->beginScene(true, true, SColor(255,100,101,140));
    /*
        纯虚函数
        参数解释:
        1 后备缓冲:指定是否后备缓冲应该被清空,这就意味着指定屏幕将被单色填充。
                    如果参数为空,则后备缓冲不清空,此时颜色参数可忽视。
        2 z缓冲:指定深度缓冲是否被清空。如果只是2d绘制的话就没有必要清空z缓冲。
        3 颜色:用于清除缓冲的颜色。
    */

        smgr->drawAll();
        guienv->drawAll();

        driver->endScene();
    }

    /*
    结束后我们要删除我们之前建立的鬼火设备,之后才可以再次建立设备。
    在鬼火引擎中你可以删除任何你用(以create开头的)类函数或函数建立对象,仅需要使用函数->drop()。
   
    可以在下面这个网站查看资料以获取更多信息
    http://irrlicht.sourceforge.net//docu/classirr_1_1IUnknown.html#a3
    */
    device->drop();

    return 0;
}

转载于:https://www.cnblogs.com/ducky/archive/2010/07/08/1773528.html

 类似资料: