freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

論directx在游戲開發(fā)中的應(yīng)用(doc畢業(yè)設(shè)計(jì)論文)-在線瀏覽

2025-08-12 02:22本頁面
  

【正文】 retching)操作;支持同時(shí)訪問標(biāo)準(zhǔn)的和增強(qiáng)的顯示設(shè)備內(nèi)存區(qū),包括動(dòng)態(tài)改變調(diào)色板,獨(dú)占訪問硬件,和分辨率切換等等。圖1 背景圖圖1和圖2是將要使用的兩張圖片,圖1是背景圖,圖2為前景圖,利用圖片局部顯示功能,在程序中分別取出0、:、等數(shù)據(jù)塊 (如圖3)圖2 前景圖圖3 程序定位圖圖4 程序拼圖效果當(dāng)然,這里所謂的“取”并不是把圖片給分割出來,而是指程序在圖片中定位,顯示的時(shí)候只顯示其中的一部分。需要強(qiáng)調(diào)的是,游戲中所用到的素材圖片只有圖1和圖2,所有的游戲都是利用這種原理,把基本的圖片在一起組合而構(gòu)成大規(guī)模的場景。所以,一張圖片在調(diào)入內(nèi)存后,盡可能的不要再次調(diào)入。這個(gè)功能就是顯示內(nèi)數(shù)據(jù)塊移動(dòng)功能。這個(gè)函數(shù)的原型就是:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop)。圖7 透明效果圖A圖8 透明效果圖B在游戲開發(fā)技術(shù)當(dāng)中,這種指定色不顯示的效果叫做ColorKey(關(guān)鍵色)技術(shù),每張圖片都可以指定若干種ColorKey。但是每個(gè)圖片都有一個(gè)背景色,為了方便程序控制,根據(jù)制作者的要求,將這種顏色設(shè)為統(tǒng)一的顏色。在DirectDraw中,這種功能對應(yīng)的函數(shù)是:HRESULT SetColorKey(DWORD dwFlags,LPDCOLORKEY lpDDColorKey)。最終實(shí)現(xiàn)效果如圖7和圖8(透明的背景)圖9 Player1圖10 彈板鏈圖11 Player2在LeapMan游戲當(dāng)中,因?yàn)橛泻芏嗟膱鼍?,也有很多的角色,所以,在編程之前一定要把這些圖片全部都按照一定的規(guī)則排列,手工的計(jì)算各個(gè)子圖形的位置,這些有序的圖片叫作Sprite(精靈)。通過PhotoShop把這些圖片有規(guī)律的排列,同時(shí)記錄下這些信息:角色Player(如圖9):(0,0),(32,0),(64,0),(96,0),(0,32),(32,32),(64,32),(96,32),(0,64),(32,64),(64,64),(96,64),這些值都是以像素為單位。這些數(shù)據(jù)都將在程序控制時(shí)用到。軟件中玩家的動(dòng)作都是通過不斷地切換人物角色圖片來實(shí)現(xiàn)的,當(dāng)切換頻率達(dá)到一定值的時(shí)候就成了流暢的動(dòng)畫。這些值都存放在一個(gè)鏈表當(dāng)中。實(shí)際上是一個(gè)位置信息表。 //標(biāo)識Sprite在位圖中左臨界邊的象素值 INT nTop。 //標(biāo)識Sprite在位圖中右臨界邊的象素值 INT nBottom。 //標(biāo)識Sprite在位圖中寬度信息 INT nHeight。同時(shí),程序執(zhí)行時(shí)擋板是不斷的由底向上逐一出現(xiàn)的,當(dāng)上升到一定高度的時(shí)候就從屏幕上消失,這剛好可以用一個(gè)隊(duì)列來實(shí)現(xiàn)。由于每種精靈的個(gè)數(shù)都是不同的。SpriteInfo g_springSprite[NUM_SPRING]。SpriteInfo g_slideSprite[NUM_SLIDE]。SpriteInfo g_stingSprite[NUM_STING]。在函數(shù)BOOL InitSprite()中,把通過計(jì)算得到值都賦給隊(duì)列中的每一個(gè)變量。//Player的角色索引 INT nleft。//Player在屏幕上的位置 INT Tending。struct Board{ BoardType enumType。//擋板的索引 INT nLeft。 //擋板位置 INT Tending。其中Player變量只定義了一個(gè)表示一個(gè)玩家,但是擋板不同的是它有很多個(gè),構(gòu)成一個(gè)角色隊(duì)列,程序中用一個(gè)類封裝的。游戲中需要一個(gè)函數(shù)動(dòng)態(tài)而隨機(jī)的生成擋板隊(duì)列,功能的實(shí)現(xiàn)在CQueue::CreateQueue()當(dāng)中。這里,隨機(jī)函數(shù)的生成是使用Rand(),它可以隨機(jī)的生成0 RAND_MAX之間的任意一個(gè)數(shù),其中RAND_MAX 的宏定義如下:define RAND_MAX 0x7fff,如果希望得到一個(gè)1100之間的整數(shù),把Rand()函數(shù)返回值對100求余就可以了。 return lRand。這種定界方法可以解決任何一種隨機(jī)數(shù)生成的問題。函數(shù)中分別進(jìn)行下列操作: InitSprite()。()更新精靈隊(duì)列。函數(shù)UpdateSprites()更新游戲中精靈的狀態(tài),包括人物角色狀態(tài)的變化和板狀態(tài)位置的變化。角色的變化控制函數(shù)UpdateSprites()包括1. MoveAllUP()把所有的Sprite上移2. MovePlayerUpDown()來確定玩家是否懸空下落或者是碰彈板上移3. MoveLeftOrRight()來根據(jù)外部按鍵狀態(tài)左右移動(dòng)玩家角色,如果按左鍵,MoveLeft狀態(tài)為1,那么Player1就向左移動(dòng)若干單位;如果右就為1,右移若干單位;同樣如果沒有按鍵就為0,表示不移動(dòng)4. CheckIfInAire()函數(shù)來檢測是否懸空,它通過索引來逐一檢索精靈串,取得現(xiàn)在的位置信息,看看它們的區(qū)域是否重合,如果有的話就表明Player站在板上,否則就在使Player下落,并顯示下一個(gè)角色圖。最后一步操作是DisplayFrame(),把所有的角色與場景顯示到屏幕上,在顯示的時(shí)候,不同角色優(yōu)先級不同,先用冒泡排序法將它們的位置排序后,使最后面的Sprite圖就先顯示出來,而最前面的圖就后顯示出來。圖12 windows程序結(jié)構(gòu)程序結(jié)構(gòu)如圖12:任何一個(gè)Windows程序都有這種結(jié)構(gòu)。具體的DirectDraw使用方式如下[2] [3]: ⑴ DirectDrawCreate(NULL,amp。pDD2)。般的來說,最常用的有WINDOWS和FULLSCREEN兩種,F(xiàn)ULLSCREEN模式是一種獨(dú)占模式,即不與其他的應(yīng)用程序共享內(nèi)存。先填充DDSURFACEDESC2結(jié)構(gòu),然后調(diào)用pDD2 CreateSurface(amp。pPri,NULL));⑹ 利用LoadImage()函數(shù)載入將要使用的位圖;⑺ CreateCompatibleDC()來創(chuàng)建與系統(tǒng)兼容的設(shè)備DC.;⑻ BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop)來進(jìn)行位塊傳輸;⑼ pDD2SetColorKey(DDCKEY_SRCBLT,amp。使用的時(shí)候使用函數(shù)g_pDisplayCreateSurfaceFromBitmap( amp。當(dāng)所有的Sprites都在內(nèi)存Surface上繪制完畢,調(diào)用g_pDisplay()將這些畫面輸出到顯示屏上。由于球桿與臺球的Mesh比較簡單,程序中用填充自定義頂點(diǎn)方式建立。房屋與球桌相對來說比較復(fù)雜,所以先在3DSMax中建立好模型,這種格式DirectX可以直接支持。碰撞包括球與球的碰撞、球與球臺的碰撞。否則運(yùn)動(dòng)物體間會(huì)發(fā)生明顯嵌入或粘連現(xiàn)象。而球之間的碰撞反應(yīng)如圖13:假設(shè)兩球是完全彈性碰撞,向量t為兩球心間的連線,n是垂直于MO的向量。而在n方向上v1n,v2n 將保持不變。球與球臺的碰撞實(shí)作起來相對復(fù)雜,因?yàn)榍蚺_是一個(gè)網(wǎng)格模型,頂點(diǎn)數(shù)目較多而且形狀不規(guī)則,所以只有另想辦法。每當(dāng)球移動(dòng)后就判斷這些個(gè)向量是否有和桌面相交??紤]到球臺幾何形狀的特殊性,在圖15情況下球與球臺的碰撞會(huì)發(fā)生異常。圖18 檢測碰撞回退a圖19 檢測碰撞回退b圖17 增加檢測矢量方法顯然,球o與球臺發(fā)生了碰撞,但是由于向量a,b,c,d的方向問題,此時(shí)無法判斷球與球臺的碰撞。很顯然增加方向向量的數(shù)量可以很好地解決這個(gè)問題,如圖17。但卻有一個(gè)非常明顯的缺點(diǎn)——增加了系統(tǒng)負(fù)擔(dān),在每一幀都必須對球體的36個(gè)方向進(jìn)行檢測,大大降低運(yùn)行速度。也就是說~如果方向向量的數(shù)目從36減少至8,那么至少將fps提升4。效果驚人!下面介紹另一個(gè)方法如圖18:這時(shí)雖然球已經(jīng)與桌面相交,但方向向量并沒有檢測出碰撞若此時(shí)球繼續(xù)沿v方向移動(dòng)那么會(huì)出現(xiàn)下列狀況(圖19),此時(shí)向量a檢測出了球體與球臺發(fā)生碰撞,設(shè)球與桌面的交點(diǎn)為p,并設(shè)m_fDis是球心到p的距離, R為球半徑。球與球臺的碰撞反應(yīng)涉及到向量的反射問題,基本方法如圖20:圖20 碰撞后方向求解圖AB為反射平面,N為平面AB的法線,向量o為平行四邊形的對角線。根據(jù)圖示可知:a+ an =1/2 * o = o=2*( a+ an ),因?yàn)?a, = oa 所以 a, =a+2* an(考慮到復(fù)雜性問題,目前這個(gè)臺球使用的還是后滯碰撞算法,只是在第N幀時(shí)才作出判斷,因此,球球碰撞時(shí)還會(huì)有嵌入的現(xiàn)象。 只有創(chuàng)建D3D設(shè)備的步驟是不可以倒置的,其他的步驟都要在設(shè)備建立好后才可以進(jìn)行。不同的程序有不同的結(jié)構(gòu),但是上面的技術(shù)都會(huì)用到。收到退出消息之前,它會(huì)一直在While(TRUE){}這個(gè)語句中l(wèi)oop下去。//創(chuàng)建全局設(shè)備m_pD3DGetAdapterDisplayMode( D3DADAPTER_DEFAULT, amp。}//設(shè)置顯示模式并調(diào)用InitializeLights()創(chuàng)建燈光:通過給D3DLIGHT8賦值,并執(zhí)行m_pD3DDeviceSetLight(0,amp。最后兩句m_pD3DDeviceLightEnable(0,TRUE) m_pD3DDeviceSetRenderState(D3DRS_LIGHTING,TRUE)// 并改變D3D的狀態(tài),使燈光生效在函數(shù)GameLoop中,每次渲染之前先根據(jù)變量的值來確定物體的顯示狀態(tài)。amp。msg)。msg)。如果檢測消息隊(duì)列為空時(shí),就對改變后的場景進(jìn)行渲染。在Render()函數(shù)當(dāng)中,先判斷球是否全部靜止,如果還有運(yùn)動(dòng)著的,就控制玩家不能再次擊球,這是通過變量beSend控制的。m_pD3DDeviceEndScene()。//設(shè)置攝像機(jī)Render3D()。//文字輸出}輸出游戲中的每一幀信息。⑴ 確定輸出視角,即設(shè)置在三維空間里物體的顯示畫面。原理如下:D3DXMATRIX matWorld。matWorld,0,0,0)。matWorld)。matWorldRotationX,D3DX_PI/)。matWorldRotationY,D3DX_PI/)。matWorld,)。matWorld,amp。matWorldRotationX)。matWorld,amp。matWorldRotationY)。即按照游戲的要求把想觀察到的物理顯
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1