動(dòng)畫與游戲設(shè)計(jì) 課程設(shè)計(jì)報(bào)告_第1頁
動(dòng)畫與游戲設(shè)計(jì) 課程設(shè)計(jì)報(bào)告_第2頁
動(dòng)畫與游戲設(shè)計(jì) 課程設(shè)計(jì)報(bào)告_第3頁
動(dòng)畫與游戲設(shè)計(jì) 課程設(shè)計(jì)報(bào)告_第4頁
動(dòng)畫與游戲設(shè)計(jì) 課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 動(dòng)畫與游戲開發(fā)課程報(bào)告學(xué) 號(hào): 111102020103 姓 名: 張慧 專業(yè)班級(jí): 11級(jí)計(jì)科本01班 日 期: 2013-12-9 電子信息工程學(xué)院目錄一、 課程內(nèi)容及應(yīng)用領(lǐng)域1. 1基于DirectX的粒子系統(tǒng).3 1.1.1 粒子系統(tǒng)簡(jiǎn)介.3 1.1.2廣告板技術(shù). 3 1.1.3粒子系統(tǒng)的基本原理. 31.2粒子系統(tǒng)的應(yīng)用領(lǐng)域 . 3二、 課程內(nèi)容的難點(diǎn)、疑點(diǎn)2.1課程要點(diǎn). 42.2課程難點(diǎn). 42.3課程疑點(diǎn). 43、 實(shí)例開發(fā)3.1實(shí)例題目及說明. 43.2關(guān)鍵技術(shù). 5 3.2.1系統(tǒng)完成的四部曲. 5 3.2.2星光粒子結(jié)構(gòu)構(gòu)成技術(shù). 5 3.2.3 MyPaint()繪

2、圖函數(shù).53.3開發(fā)過程.9 3.3.1案例所需背景圖.10 3.3.2程序部分代碼.10 3.3.3運(yùn)行結(jié)果截圖.153.4總結(jié).17四、談?wù)勛约簩?duì)課程內(nèi)容的掌握程度18一、課程內(nèi)容及應(yīng)用領(lǐng)域1.課程內(nèi)容:基于DirectX的粒子系統(tǒng) 相關(guān)內(nèi)容簡(jiǎn)介:(1)粒子系統(tǒng)簡(jiǎn)介粒子系統(tǒng)是三維圖形編程領(lǐng)域中用于實(shí)現(xiàn)特殊效果的一種非常重要的技術(shù).該技術(shù)是由Reeves于1983年首次提出來的.通過粒子系統(tǒng)可以使用非常簡(jiǎn)單的粒子來構(gòu)造復(fù)雜的物體,它為模擬動(dòng)態(tài)的不規(guī)則物體,提供了強(qiáng)有力的技術(shù)手段。一般情況下,粒子的幾何特征十分簡(jiǎn)單,可以用一個(gè)像素或一個(gè)小的多邊形來表示.如果給出了粒子中心點(diǎn)的坐標(biāo)和粒子大小,不

3、難計(jì)算出繪制粒子所需要的四個(gè)頂點(diǎn)的位置坐標(biāo).(2)廣告板技術(shù)由于通常使用平面圖形而不是立體圖形表示一個(gè)粒子,所以需要使用的粒子四邊形始終面向觀察者.這就要使用廣告板技術(shù).廣告板技術(shù)的原理是,在渲染一個(gè)多邊形時(shí),首先根據(jù)觀察方向構(gòu)造一個(gè)旋轉(zhuǎn)矩陣,利用該矩陣旋轉(zhuǎn)多邊形使其面向觀察者,如果觀察方向不斷變化,就要不斷旋轉(zhuǎn)多邊形. (3)粒子系統(tǒng)的基本原理 粒子通常都是一個(gè)帶有紋理的四邊形。我們通過這個(gè)使用了紋理映射的四邊形,可以認(rèn)為粒子實(shí)際上是一個(gè)很小的網(wǎng)格模型,只不過是紋理賦予了它特殊的外表罷了。繪制粒子就如果繪制多邊形一樣簡(jiǎn)單,因?yàn)橐粋€(gè)粒子說白了就是一個(gè)可改變大小并映射了紋理的四邊形罷了。 粒子系

4、統(tǒng)由大量的粒子構(gòu)成,粒子是一種微小的物體,每個(gè)粒子都具有一定的屬性,如位置、大小以及紋理,可能還需要顏色、透明度、運(yùn)動(dòng)速度、加速度、生命期等屬性。我們可以把粒子想象成顆粒狀的物體,如雪花,雨滴,沙塵,煙霧等特殊的事物。又比如游戲中的怪物,晶體,材料,在需要的時(shí)候,也可以通過粒子來實(shí)現(xiàn)。俗話說“不積跬步,無以至千里,不積小流,何以成江?!?,單個(gè)的粒子是比較平凡的存在,但是如果將大量的粒子聚到一起,就可以實(shí)現(xiàn)很多神奇的效果了。在C/C+中,結(jié)構(gòu)體“是用來定義粒子類型的絕佳武器,原則上用“類”也可以實(shí)現(xiàn)。2.應(yīng)用領(lǐng)域: 1983年,奇才Reeves.V.T在它發(fā)表的論文Particle System

5、s A Technique for Modeling a Class of Fuzzy Objects中首次提出了粒子系統(tǒng)的概念。從此,粒子系統(tǒng)就開始廣泛運(yùn)用于計(jì)算機(jī)中各種模糊景物的模擬。經(jīng)常使用粒子系統(tǒng)模擬的現(xiàn)象有火焰、爆炸、煙、水流、火花、落葉、云、霧、雪、塵、流星尾跡或者像發(fā)光軌跡這樣的抽象視覺效果等等。這些物體模型在計(jì)算機(jī)中往往很難用具體的形狀、大小來描述,但是我們可以通過粒子系統(tǒng)的思想,去描述組成這些物體的每個(gè)元素和它的變化。 一般情況下,粒子的幾何特征都十分的簡(jiǎn)單,可以采用一個(gè)像素或者是一個(gè)小的多邊形來表示。需要注意的是,粒子系統(tǒng)的最大的缺陷是,當(dāng)粒子數(shù)量達(dá)到很大的規(guī)模的時(shí)候,對(duì)運(yùn)

6、行時(shí)機(jī)器性能的要求會(huì)更加苛刻,如果機(jī)器的性能跟不上,就會(huì)顯得達(dá)不到實(shí)時(shí)的運(yùn)行效果。 在許多三維建模及渲染包內(nèi)部就可以創(chuàng)建、修改粒子系統(tǒng),如 3D Studio Max、Maya 以及 Blender 等。這些編輯程序使藝術(shù)家能夠立即看到他們?cè)O(shè)定的特性或者規(guī)則下粒子系統(tǒng)的表現(xiàn),另外還有一些插件能夠提供增強(qiáng)的粒子系統(tǒng)效果,例如 AfterBurn 以及用于流體的 RealFlow。而2D的粒子特效軟件中particleIllusion最為出色,因?yàn)樗匿秩颈纫话愕?D軟件快較為平面化。Combustion 這樣的多用途軟件或者只能用于粒子系統(tǒng)的Particle Studio 等都可以用來生成電影或

7、者視頻中的粒子系統(tǒng)。而目前,粒子系統(tǒng)技術(shù)被廣泛用于大型3D游戲地制作中。二、課程內(nèi)容的難點(diǎn)、疑點(diǎn)1.課程要點(diǎn):(1)星光粒子的結(jié)構(gòu)構(gòu)造:struct flystarint x; /星光所在的x坐標(biāo)int y; /星光所在的y坐標(biāo)int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在的時(shí)間BOOL exist; /星光是否存在flystar50;6個(gè)成員分別為,粒子坐標(biāo)兩個(gè)值,粒子方向兩個(gè)值,持續(xù)時(shí)間lasted,和粒子是否存在的標(biāo)識(shí)exist。(2)星光粒子系統(tǒng)的更新 典型的粒子系統(tǒng)更新循環(huán)可以分為兩個(gè)不同的階段:模擬階段和渲染階段.每個(gè)循環(huán)執(zhí)行

8、每一幀動(dòng)畫. 成員函數(shù)Update負(fù)責(zé)根據(jù)當(dāng)前運(yùn)行時(shí)間更新整個(gè)粒子系統(tǒng).該函數(shù)首先遍歷離子鏈表中的所有粒子,根據(jù)當(dāng)前粒子的存活時(shí)間計(jì)算粒子的當(dāng)前位置和速度,從而實(shí)現(xiàn)對(duì)粒子運(yùn)動(dòng)軌跡的控制.然后根據(jù)粒子是否已經(jīng)落到地面上,判斷當(dāng)前例子是否已經(jīng)死亡,并刪除死亡的粒子.(3)星光粒子的運(yùn)動(dòng)軌跡2.課程難點(diǎn): 粒子運(yùn)動(dòng)軌跡的實(shí)現(xiàn)、粒子的更新渲染等3.課程疑點(diǎn):(1)并不是所有的粒子都是使用由兩個(gè)三角形組成的矩形來表示的。例如,在模擬雨景時(shí),可以用兩個(gè)頂點(diǎn)構(gòu)成的一條線段來表示一個(gè)雨點(diǎn)粒子。同時(shí),即使某個(gè)粒子系統(tǒng)中的粒子都是用矩形表示,也并不意味著在渲染粒子時(shí),一定要使用廣告板技術(shù)。例如,在模擬雪景時(shí),通常

9、是用矩形表示一個(gè)雪花粒子,但為了模擬學(xué)花在下降過程中隨風(fēng)飄舞的姿態(tài),就不能使用廣告板技術(shù)。(2)可以不使用點(diǎn)精靈,而完全由程序控制每個(gè)粒子的渲染,也可以在初始化時(shí)一次性產(chǎn)生所有的粒子。(3)粒子系統(tǒng)的效果與應(yīng)用,關(guān)鍵在于如何描述粒子的運(yùn)動(dòng)軌跡,也就是構(gòu)造粒子的運(yùn)動(dòng)函數(shù).運(yùn)動(dòng)函數(shù)構(gòu)造的恰當(dāng)與否,直接決定仿真效果的逼真程度.三、 實(shí)例開發(fā)1.實(shí)例題目及說明 題目:基于DirectX的星光綻放 說明:本設(shè)計(jì)的星光綻放相當(dāng)于是一個(gè)模擬爆炸(或者說是煙花)特效的展示,在這個(gè)案例之中,綻放點(diǎn)為在窗口中由隨機(jī)數(shù)產(chǎn)生的一個(gè)位置,綻放后,會(huì)出現(xiàn)很多星光以不同的速度向四方飛散而去,當(dāng)粒子飛出窗口后或者超出時(shí)間后便

10、會(huì)消失。每一次爆炸所出現(xiàn)的粒子全部消失后,便會(huì)重新出現(xiàn)綻放的畫面,以產(chǎn)生不斷綻放星光的效果。該設(shè)計(jì)運(yùn)用DirectX中的粒子系統(tǒng)等的知識(shí)點(diǎn),可在VC+的環(huán)境下進(jìn)行運(yùn)行,2.關(guān)鍵技術(shù) 2.1粒子系統(tǒng)在宏觀和微觀上都是隨時(shí)間不斷變化的,一套粒子系統(tǒng)在它生命周期的每一刻,一般都需完成以下的四步曲的工作: (1)產(chǎn)生新的粒子:這一步當(dāng)中,我們會(huì)根據(jù)預(yù)定的要求,產(chǎn)生一定數(shù)目的新粒子。粒子的各項(xiàng)初始屬性都可以用rand函數(shù)來在一定的范圍內(nèi)賦上隨機(jī)的值。 (2)更新現(xiàn)有粒子的屬性:比如粒子有位置和移動(dòng)速度,自旋速度等等屬性,這就需要在每一幀當(dāng)中根據(jù)原來的粒子的位置移動(dòng)速度和自旋速度重新進(jìn)行計(jì)算和賦值更新。

11、(3)刪除已經(jīng)消亡的粒子:這一步是可選的,具體情況具體分析,因?yàn)橛行┝W酉到y(tǒng)中粒子是一直都存在的,沒有消亡一說。在規(guī)定了粒子生命周期的一套粒子系統(tǒng)中,就需要判斷每個(gè)粒子是否生命走到了盡頭,如果是的話,那么它就game over,消亡了,得用相關(guān)代碼把它從粒子系統(tǒng)中消除。(4) 繪制出粒子:這步?jīng)]有的話什么都不是,不顯示出來叫什么粒子系統(tǒng)啊。人家可不管你在之前做了多少工作,算了多少東西,反正玩家是要看到最終的顯示效果的。 2.2 星光粒子的結(jié)構(gòu)構(gòu)造技術(shù):struct flystarint x; /星光所在的x坐標(biāo)int y; /星光所在的y坐標(biāo)int vx; /星光x方向的速度int vy; /

12、星光y方向的速度int lasted; /星光存在的時(shí)間BOOL exist; /星光是否存在flystar50; 2.3主要函數(shù)之一MyPaint()繪圖函數(shù):/全局變量聲明HINSTANCE hInst;HBITMAP bg,star,mask; /用于貼圖的三個(gè)HBITMAP變量HDChdc,mdc,bufdc;HWNDhWnd;RECTrect;int i,count; /定義count用于計(jì)數(shù)struct flystarint x; /星光所在的x坐標(biāo)int y; /星光所在的y坐標(biāo)int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在

13、的時(shí)間BOOL exist; /星光是否存在flystar50;/全局函數(shù)聲明ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);voidMyPaint(HDC hdc);/WinMain函數(shù),程序入口點(diǎn)函數(shù)int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow

14、)MSG msg;MyRegisterClass(hInstance);/初始化if (!InitInstance (hInstance, nCmdShow) return FALSE;/消息循環(huán) while (GetMessage(&msg, NULL, 0, 0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wParam;/設(shè)計(jì)一個(gè)窗口類,類似填空題,使用窗口結(jié)構(gòu)體ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSi

15、ze = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= NULL;wcex.hCursor= NULL;wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName

16、= NULL;wcex.lpszClassName= "maple"wcex.hIconSm= NULL;return RegisterClassEx(&wcex);/初始化函數(shù) / 1.加載位圖資源/ 2.取得內(nèi)部窗口區(qū)域信息 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)HBITMAP bmp;hInst = hInstance;hWnd = CreateWindow("maple", "星光綻放展示窗口" , WS_OVERLAPPEDWINDOW,CW_USED

17、EFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)return FALSE;MoveWindow(hWnd,10,10,600,450,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc); bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(m

18、dc,bmp);bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); star = (HBITMAP)LoadImage(NULL,"star.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); mask = (HBITMAP)LoadImage(NULL,"mask.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRec

19、t(hWnd,&rect);SetTimer(hWnd,1,0,NULL);MyPaint(hdc);return TRUE;/自定義繪圖函數(shù)/ 1.窗口貼圖/ 2.實(shí)現(xiàn)星光綻放的效果void MyPaint(HDC hdc)/創(chuàng)建粒子if(count = 0) /隨機(jī)設(shè)置爆炸點(diǎn)intx=rand()%rect.right;inty=rand()%rect.bottom;for(i=0;i<50;i+) /產(chǎn)生星光粒子flystari.x = x;flystari.y = y;flystari.lasted = 0; /設(shè)定該粒子存在的時(shí)間為零if(i%2=0) /按粒子編號(hào)i來

20、決定粒子在哪個(gè)象限運(yùn)動(dòng),且x,y方向的移動(dòng)速度隨機(jī)為115之間的一個(gè)值,由1+rand()%15來完成。flystari.vx = -(1+rand()%15);flystari.vy = -(1+rand()%15);if(i%2=1)flystari.vx = 1+rand()%15;flystari.vy = 1+rand()%15; if(i%4=2)flystari.vx = -(1+rand()%15);flystari.vy = 1+rand()%15;if(i%4=3)flystari.vx = 1+rand()%15;flystari.vy = -(1+rand()%15);

21、flystari.exist = true; /設(shè)定粒子存在count = 50; /50個(gè)粒子由for循環(huán)設(shè)置完成后,我們將粒子數(shù)量設(shè)為50,代表目前有50顆星光/先在內(nèi)存dc中貼上背景圖片SelectObject(bufdc,bg);BitBlt(mdc,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY);for(i=0;i<50;i+)if(flystari.exist) /判斷粒子是否還存在,若存在,則根據(jù)其坐標(biāo)(flystari.x,flystari.y)進(jìn)行貼圖操作SelectObject(bufdc,mask);BitBlt(mdc,

22、flystari.x,flystari.y,30,30,bufdc,0,0,SRCAND);SelectObject(bufdc,star);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCPAINT);/計(jì)算下一次貼圖的坐標(biāo)flystari.x+=flystari.vx;flystari.y+=flystari.vy;/在每進(jìn)行一次貼圖后,將粒子的存在時(shí)間累加1.flystari.lasted+;/進(jìn)行條件判斷,若某粒子跑出窗口區(qū)域一定的范圍,則將該粒子設(shè)為不存在,且粒子數(shù)隨之遞減if(flystari.x<=-10 | flys

23、tari.x>rect.right | flystari.y<=-10 | flystari.y>rect.bottom | flystari.lasted>50)flystari.exist = false; /刪除星光粒子 count-; /遞減星光總數(shù)/將mdc中的全部?jī)?nèi)容貼到hdc中BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);3. 開發(fā)過程(1) 對(duì)案例整體進(jìn)行選取和分析在之前課堂做過相關(guān)案例的基礎(chǔ)上,進(jìn)行修改和創(chuàng)新,添加一些其他的內(nèi)容.這個(gè)案例用到的知識(shí)緊扣教材,是對(duì)本學(xué)期學(xué)習(xí)程度的一個(gè)很好的檢測(cè),而且,這個(gè)實(shí)驗(yàn)也是在自己的

24、能力范圍之內(nèi)的,可以做出來。(2)分析清楚該案例要用到的技術(shù)和必要的環(huán)境 該案例主要運(yùn)用DirectX中的粒子系統(tǒng)、紋理映色、點(diǎn)的坐標(biāo)變換、光照等技術(shù),運(yùn)行環(huán)境為VC+及DirectX.(3) 找出基本的函數(shù)及坐標(biāo)應(yīng)用,包括所需粒子的形狀、大小、顏色和位置(4) 加入所需圖片和粒子,如下:背景圖:星光粒子圖: (5) 案例總體實(shí)現(xiàn)的部分程序代碼:#include "stdafx.h"#include <stdio.h>/全局變量聲明HINSTANCE hInst;HBITMAP bg,star,mask; /用于貼圖的三個(gè)HBITMAP變量HDChdc,mdc,

25、bufdc;HWNDhWnd;RECTrect;int i,count; /定義count用于計(jì)數(shù)struct flystarint x; /星光所在的x坐標(biāo)int y; /星光所在的y坐標(biāo)int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在的時(shí)間BOOL exist; /星光是否存在flystar50;/全局函數(shù)聲明ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARA

26、M, LPARAM);voidMyPaint(HDC hdc);/WinMain函數(shù),程序入口點(diǎn)函數(shù)int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)MSG msg;MyRegisterClass(hInstance);/初始化if (!InitInstance (hInstance, nCmdShow) return FALSE;/消息循環(huán) while (GetMessage(&msg, NULL, 0, 0) TranslateMessag

27、e(&msg); DispatchMessage(&msg); return msg.wParam;/設(shè)計(jì)一個(gè)窗口類,類似填空題,使用窗口結(jié)構(gòu)體ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hIns

28、tance;wcex.hIcon= NULL;wcex.hCursor= NULL;wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= NULL;wcex.lpszClassName= "maple"wcex.hIconSm= NULL;return RegisterClassEx(&wcex);/初始化函數(shù) / 1.加載位圖資源/ 2.取得內(nèi)部窗口區(qū)域信息 BOOL InitInstance(HINSTAN

29、CE hInstance, int nCmdShow)HBITMAP bmp;hInst = hInstance;hWnd = CreateWindow("maple", "星光綻放展示窗口" , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)return FALSE;MoveWindow(hWnd,10,10,600,450,true);ShowWindow(hWnd, nCmdShow);UpdateWind

30、ow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc); bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(mdc,bmp);bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); star = (HBITMAP)LoadImage(NULL,"star.bm

31、p",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); mask = (HBITMAP)LoadImage(NULL,"mask.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRect(hWnd,&rect);SetTimer(hWnd,1,0,NULL);MyPaint(hdc);return TRUE;/自定義繪圖函數(shù)/ 1.窗口貼圖/ 2.實(shí)現(xiàn)星光綻放的效果void MyPaint(HDC hdc)/創(chuàng)建粒子if(count = 0) /隨機(jī)設(shè)置爆炸點(diǎn)intx=rand(

32、)%rect.right;inty=rand()%rect.bottom;for(i=0;i<50;i+) /產(chǎn)生星光粒子flystari.x = x;flystari.y = y;flystari.lasted = 0; /設(shè)定該粒子存在的時(shí)間為零if(i%2=0) /按粒子編號(hào)i來決定粒子在哪個(gè)象限運(yùn)動(dòng),且x,y方向的移動(dòng)速度隨機(jī)為115之間的一個(gè)值,由1+rand()%15來完成。flystari.vx = -(1+rand()%15);flystari.vy = -(1+rand()%15);if(i%2=1)flystari.vx = 1+rand()%15;flystari.

33、vy = 1+rand()%15; if(i%4=2)flystari.vx = -(1+rand()%15);flystari.vy = 1+rand()%15;if(i%4=3)flystari.vx = 1+rand()%15;flystari.vy = -(1+rand()%15);flystari.exist = true; /設(shè)定粒子存在count = 50; /50個(gè)粒子由for循環(huán)設(shè)置完成后,我們將粒子數(shù)量設(shè)為50,代表目前有50顆星光/先在內(nèi)存dc中貼上背景圖片SelectObject(bufdc,bg);BitBlt(mdc,0,0,rect.right,rect.bott

34、om,bufdc,0,0,SRCCOPY);for(i=0;i<50;i+)if(flystari.exist) /判斷粒子是否還存在,若存在,則根據(jù)其坐標(biāo)(flystari.x,flystari.y)進(jìn)行貼圖操作SelectObject(bufdc,mask);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCAND);SelectObject(bufdc,star);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCPAINT);/計(jì)算下一次貼圖的坐標(biāo)flystari.x+=f

35、lystari.vx;flystari.y+=flystari.vy;/在每進(jìn)行一次貼圖后,將粒子的存在時(shí)間累加1.flystari.lasted+;/進(jìn)行條件判斷,若某粒子跑出窗口區(qū)域一定的范圍,則將該粒子設(shè)為不存在,且粒子數(shù)隨之遞減if(flystari.x<=-10 | flystari.x>rect.right | flystari.y<=-10 | flystari.y>rect.bottom | flystari.lasted>50)flystari.exist = false; /刪除星光粒子 count-; /遞減星光總數(shù)/將mdc中的全部?jī)?nèi)容貼到

36、hdc中BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);/消息處理函數(shù)LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)switch (message)case WM_TIMER: /時(shí)間消息 MyPaint(hdc); /在消息循環(huán)中加入處理WM_TIMER消息,當(dāng)接收到此消息時(shí)便調(diào)用MyPaint()函數(shù)進(jìn)行窗口繪圖 break; case WM_KEYDOWN: /按鍵消息 if(wParam=VK_ESCAPE) /按下【Esc】鍵PostQuit

37、Message(0);break;case WM_DESTROY: /窗口結(jié)束消息 DeleteDC(mdc);DeleteDC(bufdc);DeleteObject(bg);DeleteObject(star);DeleteObject(mask);KillTimer(hWnd,1); /窗口結(jié)束時(shí),刪除所建立的定時(shí)器 ReleaseDC(hWnd,hdc);PostQuitMessage(0);break;default:/其他消息return DefWindowProc(hWnd, message, wParam, lParam); return 0;(6) 運(yùn)行結(jié)果截圖:星光左側(cè)綻放星光中間綻放星光綻放到邊界 4.總結(jié) 此次試驗(yàn)案例是基于DirectX技術(shù)構(gòu)建的粒子系統(tǒng),能夠?qū)嵙W酉到y(tǒng)的基本內(nèi)容,前面也提到過,本設(shè)計(jì)的星光綻放相當(dāng)于是一個(gè)模擬爆炸

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論