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

正文內(nèi)容

二d賽車游戲的設(shè)計與實現(xiàn)畢業(yè)設(shè)計(編輯修改稿)

2024-08-23 15:01 本頁面
 

【文章內(nèi)容簡介】 移變化得出當(dāng)前的位置坐標,并進行越界檢測,若賽車超出世界范圍,則強制將賽車位置約束在范圍之內(nèi)。 ( 3)移動窗口位置 這一部分的功能是為保證主視角以玩家控制的賽車為中心,但不超過世界范圍1000 1000。窗口在世界中有它的坐標,窗口坐標在 360 520 范圍之內(nèi),不可超出此范圍,當(dāng)賽車超出窗口中心時,窗口坐標則移動以確保賽車在中心處,中心范圍為 x坐標在 200 到 240, y 坐標在 160 到 320。 ( 4)繪制賽道 賽道的繪制一定要在顏色識別之前進行,不然,顏色識別將無法進行。本游戲的賽道種類共有 10 種,外加一個草 地,形成游戲的地形,每個位圖大小為 200 200 大小。世界地形是存儲在一個二維字符數(shù)組里,此字符數(shù)組內(nèi)字符種類為 0~9 和‘ g’,0~9 代表各個種類的賽道,‘ g’代表草地,字符數(shù)組的存儲如下所示: char *world[5]= { 61117, 02g30, 0ggg0, 05g40, 91118, 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 11 }。 賽道在游戲世界里的排列如圖 23 所示。 圖 23 賽道顯示圖 由圖中可以看到有些位圖完全在窗口內(nèi),有些完全在窗口外,有些部分在窗口內(nèi),有兩種方法可以將位圖繪制在后備緩沖表面,下面是 兩種方法: 第一種方法:可以將所有位圖直接繪制在后備緩沖表面,賽道對象為 road,這是一個 BOB 對象,其中存儲了 10 張賽道位圖,可遍歷字符數(shù)組,因為每張圖在世界中的坐標可以算出,都為 200 的倍數(shù),在由世界坐標算出他在窗口的坐標,之后,調(diào)用Draw_BOB( amp。road,lpddsback),將位圖繪制進后備緩沖表面,在這里,將重復(fù)調(diào)用 road和 grass 對象進行繪制,因為 Draw_BOB 的繪制是采用 DirectDraw 中的 blt()函數(shù),它支持硬件加速,所以,即使繪制的位圖看不見或數(shù)量多一點,也不會影響速度。 第二種方法:因為只要位圖在窗口內(nèi)就要進行繪制,所以將窗口坐標對 200 進行整除就能得到對應(yīng)的數(shù)組位置,代碼如下: x_l=view_x/200。//左側(cè)位圖在數(shù)組的 x 位置 x_r=(view_x+639)/200。// 右側(cè)位圖在數(shù)組的 x 位置 y_t=view_y/200。// 上側(cè)位圖在數(shù)組的 y 位置 y_b=(view_y+479)/200。// 下側(cè)位圖在數(shù)組的 y 位置 然后依據(jù)上述值,將所選中的位圖 blt 到后備緩沖表面。 ( 5)實行 AI算法 AI 算法是對所有非玩家控制的賽車進行的,首先,當(dāng) gameready 信號為 3 時,打開引擎,之后對賽車左右兩邊 30 度距離賽車中心 60 像素的區(qū)域進行顏色識別,若為綠色,那么將方向變化改為相反方向,最后進行邊界檢測。 ( 6)檢測摩擦力 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 12 路面摩擦力為 ,草地摩擦力為 ,并且,當(dāng)賽車在草地行駛時,摩擦力會達到 ,所以在路面行駛的加速度會比草地的加速度大,而且,路面速度的最大值比草地的最大值要大,實際行駛時,在路面行如風(fēng),而在草地則非常慢,這是為了不讓玩家從草地走。 ( 7)繪制各種物體以及賽車 這一部分十分簡單,就是調(diào)用 Draw_BOB 將地圖上的各個物體繪制上去, 包括終點、賽車、紅綠燈,這些物體都要先計算在窗口的位置,之后繪制。 ( 8)判斷勝負 本游戲的勝負判斷一定要依次通過地圖上的 6個區(qū)域,這是為了讓玩家走完全程 ,因為此賽車游戲的賽道是一個環(huán)狀賽道,所以,終點也是起點,勝負判斷也是判斷誰先走完一圈,其中,終點與起點的判別是一樣的,而其余四種則是判斷是否走過賽道的四個角落,這四種的判別十分容易,這里不做說明,由于賽車可以繞過起點線,在草地上行駛,所以要判斷賽車是向上穿過終點或起點,判斷穿過只需判斷賽車中心進入終點,而要確保賽車向上穿過可以同時判斷賽車此時的方向是否向 上。當(dāng)賽車依次通過這 6 個區(qū)域,就將當(dāng)時賽車的排名記錄下來,保存在此時的賽車對象里,當(dāng)有三輛賽車經(jīng)過終點,則將 game_type 賦值 GAME_TYPE_WIN,進入游戲勝利模塊。 多人游戲邏輯 多人游戲的實現(xiàn)是靠 Socket 網(wǎng)絡(luò)編程實現(xiàn)的,它分為服務(wù)器端和客戶端,這兩個的游戲邏輯不一樣。主要的游戲數(shù)據(jù)處理都在服務(wù)器端進行,并且進行發(fā)送數(shù)據(jù)和顯示等操作,而客戶端則接收數(shù)據(jù)并發(fā)送用戶所控制的賽車的引擎狀態(tài)和方向變化等信息。 多人游戲服務(wù)器端邏輯 多人游戲服務(wù)器端流程如圖 24所示。 圖 24 多人游戲服務(wù)器端流程 各個模塊的功能如下 : 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 13 創(chuàng)建線程 創(chuàng)建一個主線程,用來對 Socket 的設(shè)置,創(chuàng)建其他線程用來接收或發(fā)送數(shù)據(jù)。 鏈接界面 這部分是顯示當(dāng)前鏈接上的玩家,在屏幕上顯示 player x in,并不斷地發(fā)送給相應(yīng)玩家對應(yīng)的賽車號碼,若檢測到有玩家鏈接,則將下一個賽車控制權(quán)轉(zhuǎn)交到新連接的玩家手中,直到服務(wù)器端玩家按下回車鍵,之后向所有玩家發(fā)出游戲開始信號,客戶端接收到信號后開始游戲。 游戲進行 此部分與單人游戲相似,詳情可以參照圖 25,不同之處在兩處,下面是不同之處: ( 1)在檢測摩 擦力之后進行的是發(fā)送數(shù)據(jù),將各個玩家控制的賽車數(shù)據(jù)發(fā)給相應(yīng)玩家,如賽車的車號、坐標、引擎狀態(tài)、方向。 ( 2)在判斷勝負部分里,當(dāng)有賽車走完一圈時,向所有玩家發(fā)送這輛賽車的車號以及名次,當(dāng)有三輛賽車到達終點時,向所有玩家發(fā)送游戲結(jié)束信號。 圖 25 服務(wù)器端游戲運行流程 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 14 多人游戲客戶端邏輯 客戶端的游戲流程與服務(wù)器端類似,可參見圖 24,但具體實現(xiàn)上有很大差別,下面是客戶端各個模塊的功能: 創(chuàng)建線程 創(chuàng)建一個主線程,用來對 Socket 的設(shè)置,用來接收或發(fā)送數(shù)據(jù)。 鏈接界面 這部分是顯示當(dāng) 前鏈接上的玩家的狀態(tài),如果連接上在屏幕上顯示 player x in,如果沒有鏈接上,就不顯示。 游戲進行 這一部分只依次進行判斷準備、接收輸入信號、賽車數(shù)據(jù)處理、移動窗口、發(fā)送數(shù)據(jù)和繪圖,其中移動窗口是以當(dāng)前玩家所控制的賽車為主視角,賽車數(shù)據(jù)處理只進行賽車聲音以及方向的處理,勝負判斷是依據(jù)服務(wù)器發(fā)送過來的信號進行的。具體流程如圖 26 所示。 圖 26 客戶端游戲運行流程 顯示游戲勝利 當(dāng)游戲判斷結(jié)束時,游戲?qū)?zhí)行這部分,此部分執(zhí)行時,游戲畫面 將不動,并在畫面上打出信息。第一行根據(jù)不同的名次打出不同的信息,如果是第一名將顯示 Y O U 判斷準備 賽車數(shù)據(jù)處理 移動窗口位置 繪制賽道 繪制各種物體以及賽車 判斷勝負 發(fā)送數(shù)據(jù) 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 15 W I N字樣,而第 3 名顯示具體的名次,如“ N U M 2”,如果是第四名則顯示“ Y O U f A I L”字樣。第二行打出“ PRESS ESCAPE”,按下 Escape 鍵,則進入菜單選擇界面,并將游戲數(shù)據(jù)初始化。 本章小結(jié) 本章主要介紹了賽車游戲的游戲邏輯,其中包含好幾個部分,如單人游戲邏輯和多人游戲邏輯,游戲邏輯至關(guān)重要,因為它將具體實現(xiàn)游戲各個方面的內(nèi)容,如具體的圖 片繪制以及繪制順序、勝負判別等等,游戲邏輯是運用游戲引擎提供的一些方法并將其有序的組織起來來具體實現(xiàn)游戲的。 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 16 第四章 賽車碰撞檢測技術(shù) 碰撞檢測是賽車游戲設(shè)計中最關(guān)鍵的一項技術(shù),一個好的碰撞檢測往往會使游戲變得更真實,而粗略的碰撞算法會出現(xiàn)許多 bug 使玩家無法玩下去。在此畢業(yè)設(shè)計所實現(xiàn)的賽車游戲中,涉及到的碰撞檢測共有兩種,第一種是邊界矩形盒方法,第二種是顏色識別算法,下面將分別介紹。 邊界矩形盒方法 邊界矩形盒方法是檢測兩個矩形是否重疊的方法,矩形可以代表任何東西,在這里代表賽車,你必須給出他們的 左上角坐標以及高度和寬度,如果有重疊,則返回 TRUE,否則返回 FALSE。下面是它的代碼: int Collision_Test(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) { // this function tests if the two rects overlap // get the radi of each rect int width1 = (w11) (w13)。 int height1 = (h11) (h13)。 int width2 = (w21) (w23)。 int height2 = (h21) (h23)。 // pute center of each rect int cx1 = x1 + width1。 int cy1 = y1 + height1。 int cx2 = x2 + width2。 int cy2 = y2 + height2。 // pute deltas int dx = abs(cx2 cx1)。 int dy = abs(cy2 cy1)。// abs()是取絕對值 // test if rects overlap if (dx (width1+width2) amp。amp。 dy (height1+height2)) return(1)。 else // else no collision return(0)。 } // end Collision_Test 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 17 這個函數(shù)實現(xiàn)的基本思想是分別計算兩個矩形的中心坐標,然后根據(jù)中心坐標的 x和 y 軸的距離判斷兩個矩形是否重疊。如果兩個矩形相交,如圖 31 所示。 圖 31 兩矩形相交 設(shè)這兩個矩形的各個數(shù)據(jù)和函數(shù)的參數(shù)一樣,頂點坐標為( x1,y1)和 (x2,y2),矩形 1 的寬為 w1,高為 h1,矩形 2 的寬為 w2,高為 h2,那么兩矩形的中點坐標為(x1+w1/2,y1+h1/2),(x2+w2/2,y2+h2/2),因為這兩個矩形相交,所以,他們的中點坐標必有如下關(guān)系: |x1+w1/2(x2+w2/2)|(w1+w2)/2 并且 |y1+h1/2(y2+h2/2)|(h1+h2)/2。 這里必須注意,在這個矩形重疊判斷算法中,判斷方法并不是 本系統(tǒng) 所 使用 的方法 ,形式如下 。 int width1 = (w11) (w13)。 int height1 = (h11) (h13)。 int width2 = (w21) (w23)。 int height2 = (h21) (h23)。 其中, width1 為八分之三 w1,并不是本系統(tǒng) 所用的二分之一,這是因為此函數(shù)通常用于位圖的碰撞檢測,而位圖是以長方形載入的,且物體的圖像通常在長方形的中央,但不會占滿整個長方形,如圖 32 所示, X Y 矩 形1 矩形 2 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 18 圖 32 賽車位圖資源 賽車實體與 矩形是有區(qū)別的,雖然 本系統(tǒng)所列的判別方法可以準確判斷矩形重疊,但當(dāng) 判斷重疊時,屏幕上所顯示的物體并沒有發(fā)生碰撞,而上述函數(shù)所用的方法雖然不準確(實際矩形重疊但檢測不出來),但在游戲運行時,實際看上去效果會好很多,也更加真實,所以用八分之三比用二分之一要好。 還有一點“ (w11) (w13)”就是 w1*3/8,但為什么要這么麻煩呢?這主要是考慮到執(zhí)行速度,位移與加減法比做乘除法要快的多,游戲要考慮到速率,所以,盡量用快速的方法。 顏色識別算法 顏色識別算法在此游戲中被頻繁用到,這是一個非常好 用的算法,它沒有非常復(fù)雜的原理,只是讀出顏色值,然后進行判別,它的速度也很快,對在窗口內(nèi)的碰撞檢測十分有效,下面是它的具體實現(xiàn): int Color_Scan(int x1, int y1, int x2, int y2, UCHAR scan_start, UCHAR scan_end, UCHAR *scan_buffer, int scan_lpitch) { // this function implements a crude collision technique // based on scanning for a range of colors within a rectangle if (x1 = screen_width) x1=screen_width1。 else if (x1 0) x1=0。 if (x2 = screen_width) x2=screen_width1。 計算機信息工程學(xué)院畢業(yè)設(shè)計說明書 19 else if (x2 0) x2=0。 // now ycoords if (y1 = screen_height) y1=screen_height1。 else if
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1