用C++實現跨平台遊戲開發之Irrlicht引擎(2)

來源:互聯網
上載者:User

三、 在Irrlicht中的特殊效果

  在本文的例子中,我將向你展示怎樣使用樣板緩衝區影子技術,還有粒子系統,告示板,動態光以及水表面情境結點等技術。參見圖3。

圖3.結合動態光和水進行的情境著色

  Irrlicht引擎自動地檢查是否你的硬體支援模板緩衝;而如果不支援,則不啟動陰影。在這個示範程式中,在方法createDevice()中的’shadows’標誌被置位,以產生從一個動畫角色投下的動態影子。如果這個執行個體程式在你的PC上運行太慢,可以把這個標誌設定為false或者乾脆再買一塊更好些的圖形加速卡。

  為能夠使用Irrlicht.DLL檔案,你需要連結到Irrlicht.lib庫檔案。你可以在工程設定對話方塊中設定這個選項;但是為了容易實現,你可以使用一個pragma先行編譯注釋命令。方法createDevice()負責執行個體化根對象-它使用引擎完成一切事情。參數如下:

  ·deviceType:裝置類型。當前你可選取Null裝置以及軟裝置,如DirectX8,DirectX9或OpenGL。

  ·windowSize:要建立的視窗的大小或全螢幕模式。這個例子中使用512x384。

  ·bits:每一像素位元數(當在全螢幕情況時)。僅允許值為16或者32。

  ·fullscreen:指定是否你想使裝置運行於全螢幕方式。

  ·stencilbuffer:指定是否你想使用樣板緩衝區以用於繪製陰影。

  ·vsync:指定是否你想啟動vsync(僅在全螢幕情況),可選。

  ·eventReceiver:一個接收事件的對象,可選。

  為適合於本執行個體環境,你將裝載一個3D Studio Max檔案(一幢房子)。該房子看起來並沒有什麼特別的,但是Irrlicht引擎能為你建立一個相當酷的紋理貼圖。只需使用造型操縱器並為之建立一個planar紋理貼圖即可:

#include <irrlicht.h>
#include <iostream>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
int main()
{
 //讓我們假定使用者在本例中使用OpenGL
 //當然,也可以指定DirectX 8, 9, 等等.
 video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
 //建立裝置,如果建立失敗立即退出。
 IrrlichtDevice *device = createDevice(driverType,
 core::dimension2d(640, 480), 16, false, true);
 if (device == 0)
  return 1;
 video::IVideoDriver* driver = device->getVideoDriver();
 scene::ISceneManager* smgr = device->getSceneManager();
 

  我對從這個匯入檔案產生的發射光線顏色的效果並不滿意。下列代碼顯示怎樣實現這些步驟:

scene::IAnimatedMesh* mesh = smgr->getMesh("room.3ds");
smgr->getMeshManipulator()->makePlanarTextureMapping(
mesh->getMesh(0), 0.008f);
scene::ISceneNode* node = 0;
node = smgr->addAnimatedMeshSceneNode(mesh);
node->setMaterialTexture(0, driver->getTexture("wall.jpg"));
node->getMaterial(0).EmissiveColor.set(0,0,0,0);

  四、 水動畫

  你將添加的第一個特殊的效果是水動畫。為此,WaterSurfaceSceneNode匯入一個造型檔案並使之象水表面一樣地波動。如果你讓這個情境結點使用一種相當好的材質如MT_REFLECTION_2_LAYER,那麼它看起來相當酷:

mesh = smgr->addHillPlaneMesh("myHill",
core::dimension2d(20,20),
core::dimension2d(40,40), 0, 0,
core::dimension2d(0,0),
core::dimension2d(10,10));
node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0),3,300,30);
node->setPosition(core::vector3df(0,7,0));
node->setMaterialTexture(0,driver->getTexture("water.jpg"));
node->setMaterialTexture(1,driver->getTexture("stones.jpg"));
node->setMaterialType(video::EMT_REFLECTION_2_LAYER);

  作為輸入造型,你可以建立一個陡峭的平面造型,但是你也可以為此使用任何其它的造型。你甚至能重用room.3ds輸入檔案(它看上去確實很奇怪)。該執行個體還用一個普通的石頭紋理模型來繪製所有另外的表面。

  五、透明的告示板和燈光

  第二個特殊的效果是很基本的但是非常有用:一個透明的告示板,伴之有一個動態燈光。為產生這種效果,你只需要產生一個燈光情境結點,並讓它四處飛行;而且,為了讓它看起來更酷一些,可以把一個告示板情境結點依附到它上面:

//建立燈光
node = smgr->addLightSceneNode(0, core::vector3df(0,0,0),
video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 600.0f);
scene::ISceneNodeAnimator* anim = 0;
anim = smgr->createFlyCircleAnimator(core::vector3df(0,150,0),250.0f);
node->addAnimator(anim);
anim->drop();
// 把告示板依附到燈光
node = smgr->addBillboardSceneNode(node, core::dimension2d(50, 50));
node->setMaterialFlag(video::EMF_LIGHTING, false);
node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
node->setMaterialTexture(0,driver->getTexture("particlewhite.bmp"));

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/huangchonghai/archive/2007/09/02/1768847.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.