国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用C++實(shí)現(xiàn)跨平臺(tái)游戲開發(fā)之Irrlicht引擎

2019-11-17 05:08:09
字體:
供稿:網(wǎng)友

  一、 引言

  Irrlicht引擎是一個(gè)用C++書寫的高性能實(shí)時(shí)的3D引擎,可以應(yīng)用于C++程序或者.NET語言中。通過使用Direct3D(Windows平臺(tái)),OpenGL 1.2或它自己的軟件著色程序,可以實(shí)現(xiàn)該引擎的完全跨平臺(tái)。盡管是開源的,該Irrlicht庫提供了可以在商業(yè)級(jí)的3D引擎上具有的藝術(shù)特性,例如動(dòng)態(tài)的陰影,粒子系統(tǒng),角色動(dòng)畫,室內(nèi)和室外技術(shù)以及碰撞檢測(cè)等(見圖1)。

用C++實(shí)現(xiàn)跨平臺(tái)游戲開發(fā)之Irrlicht引擎
圖1.Irrlicht 3D引擎

  Irrlicht是一個(gè)德國神話故事中的一種動(dòng)物的名字,它能夠發(fā)光和翱翔,可以在大部分的沼澤地四周發(fā)現(xiàn)它。單詞"Irrlicht"是兩個(gè)德國單詞("irr"意思是瘋狂的;而"Licht"意思是光)的組合。在英語中,它被譯為"鬼火"。

  Irrlicht十分幸運(yùn)地為一個(gè)巨大的活躍的開發(fā)團(tuán)隊(duì)以大量的工程所支持。然而,因?yàn)镮rrlicht主要由游戲名家Nikolaus Gebhardt所設(shè)計(jì),所以該游戲在設(shè)計(jì)上十分連貫。你可以在網(wǎng)上到處發(fā)現(xiàn)有Irrlicht的增強(qiáng)程序,如可選用的地形生成器,入口生成器,輸出器,world層生成器,相關(guān)教程和編輯器等。而且,它獨(dú)立地創(chuàng)建了到java,Perl,Ruby,BASIC,Python,LUA甚至更多種語言的綁定。而最為重要的是,它是完全自由的。

  二、 Irrlicht特性

  在深入分析API之前,請(qǐng)讓我更具體地介紹一下Irrlicht提供給了3D游戲開發(fā)者哪些功能:

  ·一個(gè)可以運(yùn)行于linux以及Windows 98,ME,NT,2000和XP(MacOS在計(jì)劃之中)等操作系統(tǒng)之上的引擎

  ·針對(duì)Direct3D 8生成器或Direct3D 9生成器(可選)提供了Anti-aliasing支持

  ·可換膚的GUI環(huán)境(包括一個(gè)很酷的具有金屬質(zhì)地的帶陰影的皮膚),給一些老式的對(duì)話框加上漂亮的外觀

  ·場(chǎng)景治理系統(tǒng),它答應(yīng)無縫的室內(nèi)/室外過渡

  ·角色動(dòng)畫系統(tǒng),帶有骨骼和變形目標(biāo)動(dòng)畫功能

  ·一個(gè)非凡的效果系統(tǒng),包括粒子效果(雨,煙,火,雪,等等),告示板,燈光貼圖,環(huán)境,地圖,模板緩沖區(qū)陰影,霧,紋理動(dòng)畫,視差貼圖,凹凸貼圖,還有更多

  ·內(nèi)建的材質(zhì)支持,包括支持Pixel and Vertex Shaders版本1.1到3.0,ARB Fragment and Vertex程序以及HLSL(GLSL正在計(jì)劃中)

  ·.NET語言綁定,這使得引擎可用于所有的.NET語言例如C#,Visual Basic.NET以及Delphi.NET

  ·一內(nèi)建的平臺(tái)獨(dú)立的軟件生成器,特性有:z-緩沖,Gouraud陰影,alpha混合和透明性,還有快速的2D繪圖(見圖2)

  ·你久已期待的2D繪圖功能,例如alpha混合,基于要害色的位圖復(fù)制,字體繪制,以及混合3D與2D圖形

  ·能直接導(dǎo)入常見的建模文件格式:Maya,3DStudio Max,COLLADA,DeleD,Milkshape,Quake 3 levels,Quake2 models,DirectX,Pulsar,My3DTools,F(xiàn)SRad以及Cartography Shop

  ·能直接從BMP,PNG,photoshop,JPEG,Targa和PCX導(dǎo)入紋理

  ·快速而易用的碰撞檢測(cè)與響應(yīng)

  ·為快速的3D運(yùn)算和容器模板庫進(jìn)行了優(yōu)化處理

  ·直接讀取檔案(可能是壓縮的,如.zip文件)

  ·集成了快速的xml分析器


  ·為實(shí)現(xiàn)輕易的本地化開發(fā)提供Unicode支持

用C++實(shí)現(xiàn)跨平臺(tái)游戲開發(fā)之Irrlicht引擎
圖2:基于Irrlicht的游戲Yet Another Space Shooter(YASS),這里顯示的是一個(gè)靜態(tài)游戲幀中的令人吃驚的著色效果

更多文章 更多內(nèi)容請(qǐng)看C/C++相關(guān)文章  程序設(shè)計(jì)  網(wǎng)絡(luò)游戲開發(fā)專題,或
  三、 在Irrlicht中的非凡效果

  在本文的例子中,我將向你展示怎樣使用模板緩沖區(qū)影子技術(shù),還有粒子系統(tǒng),告示板,動(dòng)態(tài)光以及水表面場(chǎng)景結(jié)點(diǎn)等技術(shù)。參見圖3。

用C++實(shí)現(xiàn)跨平臺(tái)游戲開發(fā)之Irrlicht引擎
圖3.結(jié)合動(dòng)態(tài)的光和水進(jìn)行的場(chǎng)景著色

  Irrlicht引擎自動(dòng)地檢查是否你的硬件支持模板緩沖;而假如不支持,則不啟動(dòng)陰影。在這個(gè)演示程序中,在方法createDevice()中的’shadows’標(biāo)志被置位,以產(chǎn)生從一個(gè)動(dòng)畫角色投下的動(dòng)態(tài)影子。假如這個(gè)實(shí)例程序在你的PC上運(yùn)行太慢,可以把這個(gè)標(biāo)志設(shè)置為false或者干脆再買一塊更好些的圖形加速卡。

  為能夠使用Irrlicht.DLL文件,你需要鏈接到Irrlicht.lib庫文件。你可以在工程設(shè)置對(duì)話框中設(shè)置這個(gè)選項(xiàng);但是為了輕易實(shí)現(xiàn),你可以使用一個(gè)PRagma預(yù)編譯注釋命令。方法createDevice()負(fù)責(zé)實(shí)例化根對(duì)象-它使用引擎完成一切事情。參數(shù)如下:

  ·deviceType:設(shè)備類型。當(dāng)前你可選取Null設(shè)備以及軟設(shè)備,如DirectX8,DirectX9或OpenGL。

  ·windowSize:要?jiǎng)?chuàng)建的窗口的大小或全屏幕模式。這個(gè)例子中使用512x384。

  ·bits:每像素位數(shù)(當(dāng)在全屏幕情況時(shí))。僅答應(yīng)值為16或者32。

  ·fullscreen:指定是否你想使設(shè)備運(yùn)行于全屏幕方式。

  ·stencilbuffer:指定是否你想使用模板緩沖區(qū)以用于繪制陰影。

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

  ·eventReceiver:一個(gè)接收事件的對(duì)象,可選。

  為適合于本實(shí)例環(huán)境,你將裝載一個(gè)3D Studio Max文件(一幢房子)。該房子看起來并沒有什么非凡的,但是Irrlicht引擎能為你創(chuàng)建一個(gè)相當(dāng)酷的紋理貼圖。只需使用造型操縱器并為之創(chuàng)建一個(gè)planar紋理貼圖即可:

#include <irrlicht.h>
#include <iostream>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
int main()
{
 //讓我們假定用戶在本例中使用OpenGL
 //當(dāng)然,也可以指定DirectX 8, 9, 等等.
 video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
 //創(chuàng)建設(shè)備,假如創(chuàng)建失敗立即退出。
 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();

  我對(duì)從這個(gè)導(dǎo)入文件產(chǎn)生的發(fā)射光線顏色的效果并不滿足。下列代碼顯示怎樣實(shí)現(xiàn)這些步驟:

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);
  四、 水動(dòng)畫

  你將添加的第一個(gè)非凡的效果是水動(dòng)畫。為此,WaterSurfaceSceneNode導(dǎo)入一個(gè)造型文件并使之象水表面一樣地波動(dòng)。假如你讓這個(gè)場(chǎng)景結(jié)點(diǎn)使用一種相當(dāng)好的材質(zhì)如MT_REFLECTION_2_LAYER,那么它看起來相當(dāng)酷:

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);
  作為輸入造型,你可以創(chuàng)建一個(gè)陡峭的平面造型,但是你也可以為此使用任何其它的造型。你甚至能重用room.3ds輸入文件(它看上去確實(shí)很希奇)。該實(shí)例還用一個(gè)普通的石頭紋理模型來繪制所有另外的表面。

  五、透明的告示板和燈光

  第二個(gè)非凡的效果是很基本的但是非常有用:一個(gè)透明的告示板,伴之有一個(gè)動(dòng)態(tài)的燈光。為產(chǎn)生這種效果,你只需要產(chǎn)生一個(gè)燈光場(chǎng)景結(jié)點(diǎn),并讓它四處飛行;而且,為了讓它看起來更酷一些,可以把一個(gè)告示板場(chǎng)景結(jié)點(diǎn)依附到它上面:

//創(chuàng)建燈光
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"));
更多文章 更多內(nèi)容請(qǐng)看C/C++相關(guān)文章  程序設(shè)計(jì)  網(wǎng)絡(luò)游戲開發(fā)專題,或   六、 粒子系統(tǒng)

  下面介紹的這個(gè)非凡效果更有趣:一個(gè)粒子系統(tǒng)。在Irrlicht引擎中,粒子系統(tǒng)既是組件化的,也是可擴(kuò)展的,但是仍然易于使用。你只需要簡單地把粒子發(fā)射器放到一個(gè)粒子系統(tǒng)場(chǎng)景結(jié)點(diǎn),這樣以來粒子看上去沒有產(chǎn)生源。
這些發(fā)射器可以據(jù)需要進(jìn)行靈活配置,并經(jīng)常帶有許多參數(shù),如粒子方向,粒子數(shù)量,以及粒子顏色等。

  當(dāng)然,發(fā)射器類型有區(qū)別(例如,一個(gè)點(diǎn)發(fā)射器能夠使粒子從一個(gè)固定的點(diǎn)上發(fā)出粒子)。假如該引擎提供的粒子發(fā)射器還不能滿足你的要求,你可以輕易地創(chuàng)建你自己的發(fā)射器。這只需簡單地從IParticleEmitter接口派生一個(gè)新類并使用setEmitter()方法把它依附到粒子系統(tǒng)上去即可。

  下一個(gè)實(shí)例將創(chuàng)建一個(gè)盒子粒子發(fā)射器。你可能已經(jīng)猜出,它從一個(gè)跳躍的盒中隨機(jī)生成粒子。由參數(shù)來定義盒子,粒子的方向,每秒產(chǎn)生粒子的最小和最大數(shù)目,顏色以及粒子的最小和最大生命周期。

  一個(gè)完全由發(fā)射器組成的粒子系統(tǒng)將是令人生厭的,因?yàn)槿狈φ鎸?shí)感。因此,Irrlicht支持粒子影響器-它負(fù)責(zé)在粒子到處飛揚(yáng)時(shí)予以修整。一旦添加到粒子系統(tǒng)上,它們就能模擬另外的更真實(shí)的效果,象重力或風(fēng)。在本例中的粒子影響器只是簡單地修改粒子的顏色來產(chǎn)生一種淡出效果。

  可能你已經(jīng)猜出,粒子影響器是通過派生IParticleAffector接口實(shí)現(xiàn)的,然后通過使用addAffector()方法把它添加到粒子系統(tǒng)上去。在你為該粒子系統(tǒng)設(shè)置了一種好看的材質(zhì)后,你就有了一個(gè)看上去相當(dāng)酷的野外宿營火的效果。通過調(diào)整材質(zhì),紋理,粒子發(fā)射器,還有影響器參數(shù),你能輕易地創(chuàng)建煙霧,下雨,爆炸,下雪等效果:

scene::IParticleSystemSceneNode* ps = 0;
ps = smgr->addParticleSystemSceneNode(false);
ps->setPosition(core::vector3df(-70,60,40));
ps->setScale(core::vector3df(2,2,2));
ps->setParticleSize(core::dimension2d(20.0f, 10.0f));
scene::IParticleEmitter* em = ps->createBoxEmitter(
core::aabbox3d(-7,0,-7,7,1,7),
core::vector3df(0.0f,0.03f,0.0f),
80,100,
video::SColor(0,255,255,255), video::SColor(0,255,255,255),
800,2000);
ps->setEmitter(em);
em->drop();
scene::IParticleAffector* paf =ps->createFadeOutParticleAffector();
ps->addAffector(paf);
paf->drop();
ps->setMaterialFlag(video::EMF_LIGHTING, false);
ps->setMaterialTexture(0, driver->getTexture,"particle.bmp"));

ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
  七、 影子投射

  最后但也不容忽視一個(gè)問題是,你需要為一個(gè)動(dòng)畫角色產(chǎn)生一個(gè)動(dòng)態(tài)的影子。為此,你裝載一個(gè)Quake2.md2模型文件并把它放到你的world上去。為了創(chuàng)建影子,你只需要調(diào)用方法addShadowVolumeSceneNode()。你可能通過調(diào)用ISceneManager::setShadowColor()來控制影子的顏色;注重,這僅是全局可調(diào)整的,并影響所有的影子。好,下面就是你的產(chǎn)生動(dòng)態(tài)影子效果的代碼:

mesh = smgr->getMesh("../../media/faerie.md2");
scene::IAnimatedMeshSceneNode* anode = 0;
anode = smgr->addAnimatedMeshSceneNode(mesh);
anode->setPosition(core::vector3df(-50,45,-60));
anode->setMD2Animation(scene::EMAT_STAND);
anode->setMaterialTexture(0, driver->getTexture("../../media/Faerie5.BMP"));
anode->addShadowVolumeSceneNode();
smgr->setShadowColor(video::SColor(220,0,0,0));
  八、 游戲循環(huán)

  最后,你能進(jìn)入由device->run()方法控制的游戲循環(huán)。該循環(huán)將不斷運(yùn)行,直到通過獲取一個(gè)關(guān)閉窗口事件(例如在Windows操作系統(tǒng)下的ALT-F4擊鍵)來退出設(shè)備。你必須在一個(gè)beginScene()和endScene()命令對(duì)之間繪制每樣?xùn)|西。beginScene()用指定的一種顏色清屏,假如需要的話,可以同時(shí)清除深度緩沖區(qū)。然后你就可以讓場(chǎng)景治理器和GUI環(huán)境來繪制它們的內(nèi)容。隨著調(diào)用endScene(),每一樣?xùn)|西都被繪制到屏幕上去。在本例中,你還可以動(dòng)態(tài)地在標(biāo)題欄上顯示幀每秒(FPS)數(shù),這對(duì)于嚴(yán)厲的游戲開發(fā)者是十分重要的事情:

scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
camera->setPosition(core::vector3df(-50,50,-150));
int lastFPS = -1;
while(device->run())
{
 driver->beginScene(true, true, 0);
 smgr->drawAll();
 driver->endScene();
 int fps = driver->getFPS();
 if (lastFPS != fps)
 {
  core::stringw str = L"Campfire FX example [";
  str += driver->getName();
  str += "] FPS:";
  str += fps;
  device->setWindowCaption(str.c_str());
  lastFPS = fps;
 }
}
device->drop();
  結(jié)束循環(huán)后,你必須刪除先前用createDevice()方法創(chuàng)建的Irrlicht設(shè)備。通過使用Irrlicht引擎,你應(yīng)該刪除所有你用以’create’開頭的方法或函數(shù)創(chuàng)建的所有對(duì)象。你可以通過簡單地調(diào)用device->drop()來刪除該設(shè)備對(duì)象。

  九、你可能喜歡的Irrlicht插件

  正如在前面所介紹的,Irrlicht有一群勤奮的獨(dú)立開發(fā)人員并為之產(chǎn)生了大量的插件,也用之開發(fā)了相當(dāng)多的游戲。這些開發(fā)者中提出的許多的改進(jìn)被再次集成到Irrlicht的隨后的發(fā)行版本中。下面我列舉其中的幾個(gè)例子,我想這會(huì)吸引許多頗有前程的開發(fā)者感愛好:

  ·OCTTools,是一套用于Irrlicht的工具,由Murphy McCauley所創(chuàng)建,用于操作OCT文件相關(guān)的:輸出器,加載器,甚至更多。

  ·ICE(Irrlicht通用引擎)是一個(gè)開發(fā)框架,它提供了一個(gè)工程的輪廓實(shí)現(xiàn),從而加快了新工程的開發(fā)。

  ·MIM,由Murphy McCauley所創(chuàng)建,是一個(gè)非常有用的基于XML的文件格式,可用于Irrlicht的加載器,轉(zhuǎn)換器及其各種工具。

  ·My3D是一個(gè)開發(fā)工具包,它能夠使你把來自于各種3D包(3DStudio MAX,Giles,等等)中的燈光貼圖場(chǎng)景直接輸出到Irrlicht中。

  ·Dusty引擎答應(yīng)程序員創(chuàng)建"任務(wù)"-這些"任務(wù)"可以完成程序員想做的任何事情。之后,這些任務(wù)被添加到一棵普通的任務(wù)樹上去,而每個(gè)任務(wù)可以有它們希望數(shù)目的孩子任務(wù)。任務(wù)"組"答應(yīng)游戲設(shè)計(jì)者在一棵完整的樹上執(zhí)行普通的操作,例如暫停,繼續(xù)或破壞等。

  ·Irrlicht RPG(Erring Light)是一個(gè)3D 繞行走游戲引擎,最初是針對(duì)RPG類游戲開發(fā)的。

  ·2D 圖像和精靈類組成了一個(gè)很有用的庫,它擴(kuò)展了Irrlicht的2D能力。

  ·Zenprogramming站點(diǎn),提供第一個(gè)針對(duì)Irrlicht的非正式的外部地形生成器,此處也提供很多相關(guān)的教程。 更多文章 更多內(nèi)容請(qǐng)看C/C++相關(guān)文章  程序設(shè)計(jì)  網(wǎng)絡(luò)游戲開發(fā)專題,或

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蛟河市| 贺兰县| 铁岭县| 广昌县| 靖西县| 张家界市| 保山市| 榆社县| 崇仁县| 凤阳县| 上思县| 綦江县| 潜江市| 靖远县| 洪泽县| 象州县| 固安县| 马公市| 新安县| 吴堡县| 乌拉特中旗| 兴山县| 卓资县| 信丰县| 眉山市| 双城市| 肇源县| 莎车县| 宜良县| 怀化市| 三都| 大荔县| 始兴县| 明水县| 甘谷县| 甘谷县| 汝城县| 广昌县| 唐海县| 邢台县| 蓝田县|