【正文】
若干時(shí)間后球o運(yùn)動(dòng)到如圖16的位置。如圖14,假想o是桌面上的一個(gè)球,沿圓心作4個(gè)向量把圓平均分為4份。則v1在t上的分量v1t與v2在t上的分量v2t 動(dòng)量守恒,由于兩球質(zhì)量相同~聯(lián)立動(dòng)能守恒公式可得:碰撞后兩球的速度在t上的分量被交換。總的來說碰撞就是預(yù)測未來幀—N物體是否發(fā)生接觸,如果物體發(fā)生了接觸則在第N1幀做出反射動(dòng)作。先定義了一個(gè)LPDIRECT3DVERTEXBUFFER8類型變量m_pVertexBuffer,然后通過向頂點(diǎn)緩沖區(qū)內(nèi)填充點(diǎn)信息(包括材質(zhì)信息與頂點(diǎn)位置),這樣建立的模型不會(huì)有冗余信息,執(zhí)行效率非常高。g_pBackSurface, MAKEINTRESOURCE( IDB_BMP_BACK ),SCREEN_WIDTH, SCREEN_HEIGHT ) ) )來建立一個(gè)有目標(biāo)位圖的Surface對(duì)象。Desc,amp。得到一個(gè)將要使用的DirectDraw7對(duì)象指針;⑶ 用SetCooperativeLevel(GetSafeHwnd(),DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN| DDSCL_ALLOWMODEX)函數(shù)設(shè)置程序的協(xié)作級(jí)別。但是作為一個(gè)游戲,必須要有一個(gè)游戲循環(huán),使游戲能夠不停的執(zhí)行下去,從PeekMessage()到DispathcMessage()都在While(TRUE)循環(huán)當(dāng)中,如果沒有外部消息時(shí),就進(jìn)行GameLoop處理下一幀信息。5. ChangeSprites()決定場景中所有精靈的變化,這種改變是按照預(yù)定義的規(guī)則進(jìn)行的。它的判斷條件是:如果最下面的一個(gè)板上升到一定的高度的時(shí)候,就隨機(jī)的生成一個(gè)新板并加入到精靈隊(duì)列中。LeapMan游戲中,游戲循環(huán)的主體是ProcessNextFrame()函數(shù),如果程序沒有收到WM_QUIT消息時(shí)就反復(fù)的執(zhí)行。程序中相應(yīng)代碼是: LONG lRand = rand()%max。Sprite_Queue在滿足條件時(shí)更新角色隊(duì)列,從而實(shí)現(xiàn)這個(gè)動(dòng)態(tài)變化的效果。 // INT nTop。//Player的運(yùn)動(dòng)方向}Player1。有了精靈的位置信息后,還需要考慮第二個(gè)問題:這些精靈最終要顯示在屏幕上的什么位置呢?同時(shí),每個(gè)精靈是動(dòng)態(tài)的,有速度的和次態(tài)的,這些信息又該如何表示呢?解決的方案如下:struct Player{ INT nmenIndex。SpriteInfo g_planeSprite[NUM_PLANE]。程序中利用宏定義一些標(biāo)識(shí)個(gè)數(shù)的常量:define NUM_STING 1define NUM_SLIDE 8define NUM_SINK 6define NUM_SPRING 7define NUM_PLANE 1define NUM_MEN 80精靈鏈表如下:SpriteInfo g_menSprite[NUM_MEN+2]。 //標(biāo)識(shí)Sprite在位圖中高度信息 }。 //標(biāo)識(shí)Sprite在位圖中上臨界邊的象素值 INT nRight。也就是說需要六個(gè)精靈鏈表。在這個(gè)軟件當(dāng)中,總共有六種Sprite,一種為Player,其它的就是程序中將要出來的五種檔板(普通板、彈板、滾板、軟板和釘板)。LeapMan中這么多的Sprite都在一張圖形當(dāng)中(見附件)。顯示時(shí)圖片中像素值與ColorKey相同的就不會(huì)顯示在圖層上。根據(jù)系統(tǒng)時(shí)間,再結(jié)合BitBlt函數(shù),得到的效果圖如圖5和圖6: 圖5 動(dòng)畫效果圖B圖6 動(dòng)畫效果圖C很明顯,現(xiàn)在已經(jīng)能夠?qū)崿F(xiàn)動(dòng)畫效果了,但是整個(gè)的畫面卻始終有一個(gè)黑的背景,如果能去掉背景色使之不顯示的話,才具備游戲開發(fā)的基本要求。倘若現(xiàn)在程序要求:原來顯示 的地方顯示為 ,如果能把已經(jīng)顯示了后者的內(nèi)存區(qū)域的拷貝到前者現(xiàn)有的內(nèi)存塊內(nèi),就可以達(dá)到了這種變化的效果。程序最終顯示出的程序拼圖效果如圖4。如果軟件中調(diào)用的功能硬件功能不支持時(shí), DirectDraw 便利用硬件仿真層(HEL)來完成請(qǐng)求的這項(xiàng)操作。每一個(gè)三維游戲都需要很多物體,這里所述的物體不一定是玩家,它還包括場景中的房屋,樹木等三維物體,當(dāng)物體太多的時(shí)候,每個(gè)角色不可能都靠軟件設(shè)計(jì)師計(jì)算得到,如果那樣的話工作量太大了。ViewPort決定程序顯示出三維場景的哪一部分,即看到計(jì)算機(jī)中的哪些場景。⑶ 支持光照與投影。這是3D的前提,實(shí)際上就是在計(jì)算機(jī)中建立一個(gè)三維坐標(biāo)系。 開發(fā)3D游戲所需要的技術(shù)要開發(fā)一個(gè)三維游戲,首先要解決的問題就是構(gòu)造一個(gè)虛擬的三維世界,給玩家的感覺如置身在現(xiàn)實(shí)世界一樣。⑹ 支持字體顯示、調(diào)色板技術(shù)和繪圖功能。如果能夠控制顯卡中顯示出來的數(shù)據(jù)區(qū)域,切換時(shí)只更換主顯存基址即實(shí)現(xiàn)了動(dòng)畫。⑶ 支持ColorKey效果。在DirectDraw的誕生之前,每個(gè)游戲廠商都不得不寫自己的游戲引擎,而這種游戲引擎過多的依賴機(jī)器硬件所提供的圖形功能,而且往往會(huì)局限在某一種硬件平臺(tái),所以當(dāng)時(shí)的游戲開發(fā)具有相當(dāng)大的困難。DirectX在開發(fā)游戲方面的強(qiáng)大功能將會(huì)在本文的論述中看到。這樣用DirectX編出的游戲不再擔(dān)心硬件功能不支持的問題了。為了解決這個(gè)問題,微軟公司開發(fā)出了DirectX SDK。圖形技術(shù)的解決方案有OpenGL和DirectX,OpenGL是三維圖形的API標(biāo)準(zhǔn),但DirectX除了能解決三維圖形問題,而且支持2D圖形、音效管理、網(wǎng)絡(luò)互連、外設(shè)控制等,它作為一套完整的游戲開發(fā)包而成為事實(shí)上的行業(yè)標(biāo)準(zhǔn)。關(guān)鍵詞:游戲開發(fā) 游戲開發(fā)包 DirectDraw Direct3D DirectMusic DirectInput 游戲引擎Application of DirectX In Game DevelopmentHao xuefang(Department of Computer Science Hubei Normal University Huangshi 435002)Abstract: When Game was accepted by many people as a very important enterainment means,Gameindustry will bring to us enormous economic benefit indisputably. This dissertation aim to the most popular Operating System Windows and using the leading game development tools’ kits DirectX base it, discussing elementary how to develop a emphases is the use of DirectDraw and Direct3D in graphics processing in two dimension and three the simply introduce of DirectSound and DirectInput.Keywords: GameDevelopment DirectXSDK DirectDraw Direct3D DirectMusic DirectInput GameEngine目 錄一、引言…………………………………………………………...1二、游戲開發(fā)所需技術(shù)及DirectX簡介………………………….11.DirectX概述…………………………………………….…….12.開發(fā)平面游戲所需要的技術(shù)分析……………………………..23.開發(fā)3D游戲所需要的技術(shù)分析………………………………3三、平面游戲LeapMan的實(shí)現(xiàn)………………………………….41. DirectDraw在二維圖形處理方面的功能分析………………42.LeapMan游戲中圖片素材預(yù)置………………………………..73.概要設(shè)計(jì)與算法分析……………………………….. ………..74.LeapMan的詳細(xì)設(shè)計(jì)……………………………….. ………...10四、三維游戲Pool’s Up實(shí)現(xiàn)………………………………….121.三維模型的建立……………………………………………..122.碰撞算法分析………………………………………………..133.Direct3D在Pool’s Up中的應(yīng)用……………………………15五、DirectInput與DirectSound在游戲開發(fā)中的應(yīng)用…19六、結(jié)束語………………………………………………………..21致 謝………………………………………………………………...22參考文獻(xiàn)…………………………………………………………..23一、引言從2001年開始,游戲作為一種產(chǎn)業(yè)已經(jīng)漸漸的為中國大眾接受,它所帶來的經(jīng)濟(jì)效益和社會(huì)效益更是人們之前沒有估計(jì)到的。文章針對(duì)目前市場上流行的Windows平臺(tái)下的主導(dǎo)開發(fā)工具DirectX對(duì)游戲開發(fā)進(jìn)行初步的探討,以兩個(gè)不同類型的游戲的實(shí)現(xiàn)過程來研究DirectDraw、Direct3D 在二維和三維圖形處理方面的應(yīng)用,同時(shí)也對(duì)DirectSound、DirectInput也進(jìn)行了初步的研究。游戲開發(fā)相對(duì)其他軟件開發(fā)來說特別復(fù)雜,它需要解決圖形顯示、網(wǎng)絡(luò)傳輸、聲音處理、I/O控制等問題,這些一般都必須借助游戲開發(fā)包(游戲引擎)來實(shí)現(xiàn)。游戲?qū)?shí)時(shí)性要求特別高,這使得稍大規(guī)模的游戲都無法在Windows GDI環(huán)境下運(yùn)行。同時(shí),DirectX也具有各種硬件仿真功能,如果調(diào)用的功能硬件加速器不支持,DirectX就利用自己的仿真加速器來實(shí)現(xiàn)同樣的效果。其他組件的功能也進(jìn)行了進(jìn)一步的擴(kuò)展。2.開發(fā)平面游戲所需要的技術(shù)DirectDraw技術(shù)主要是為了解決二維平面游戲的問題而引入的。很多時(shí)候游戲中都會(huì)出現(xiàn)一些圖形相同的地方,例如兩位游戲角色的衣服,如果能指定圖片的某一部分顯示在指定的位置,不僅可以提高開發(fā)的靈活性,還可以使游戲所使用的圖片大大減少,這對(duì)提高游戲的執(zhí)行效率是非常關(guān)鍵的。在游戲中需要高頻率的切換場景時(shí),如果通過不斷的調(diào)入內(nèi)存、顯示、調(diào)出內(nèi)存這樣一個(gè)反復(fù)的過程來切換圖片,效率將會(huì)變得很低。充分發(fā)揮計(jì)算機(jī)的并行處理能力,在顯示器輸出圖像的同時(shí),把下一幀將要顯示的圖形拷貝到在另個(gè)顯存區(qū)域處理好,顯示的時(shí)候只要改變顯卡的顯示區(qū)域基址即可。⑼ 支持多種圖形格式。能夠開發(fā)一個(gè)三維游戲的游戲開發(fā)包都具有以下功能[9]:⑴ 構(gòu)造虛擬的三維世界。這些功能都是基于坐標(biāo)變換[14]的。⑸ 支持