版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2d 賽車(chē)游戲的設(shè)計(jì)與實(shí)現(xiàn) 摘摘 要要 隨著電腦的普及,游戲已成為大多數(shù)年青人的主要休閑方式,賽車(chē)價(jià)格比較昂貴, 而賽車(chē)游戲則可以讓那些想玩賽車(chē)卻沒(méi)法玩的人體驗(yàn)一把。愛(ài)好賽車(chē)競(jìng)速游戲的玩家 們以體驗(yàn)比賽中的刺激為樂(lè)趣,玩家唯一的真實(shí)目的就是 “最快”。 本設(shè)計(jì)所實(shí)現(xiàn)的賽車(chē)游戲是基于 c 語(yǔ)言設(shè)計(jì)開(kāi)發(fā)的,所選用的游戲引擎是基于 directx8.0 編寫(xiě)的。能進(jìn)行賽車(chē)、賽道以及各種圖片的繪制,實(shí)現(xiàn)各種游戲音效,獲 取鍵盤(pán)輸入,單人游戲時(shí),可與電腦控制的賽車(chē)競(jìng)速,多人游戲時(shí)可與其他玩家或電 腦 ai 競(jìng)速。 與其他類(lèi)似游戲相比,本設(shè)計(jì)所采用的碰撞檢測(cè)算法,像邊界矩形盒算法和顏色識(shí) 別算法,不僅速度
2、快,而且檢測(cè)靈敏。多人游戲的實(shí)現(xiàn)是靠 socket 網(wǎng)絡(luò)編程與多線 程的聯(lián)用,socket 提供 c/s 模式下數(shù)據(jù)的可靠傳輸,多線程解決了 socket 等待問(wèn)題, 兩者結(jié)合使得在局域網(wǎng)內(nèi)的多人游戲運(yùn)行比較流暢。 關(guān)關(guān)鍵鍵詞詞:2d,directx,賽車(chē),游戲 design and implementation of 2d racing game abstract with the popularity of computer games has become a major leisure activity for most young people , cars are expensiv
3、e , and racing games for those who want to play can play racing who had no opportunity to experience one. hobby car racing game players to experience the game for fun stimulation , players only real purpose is the fastest . this design is realized racing game based on the c language design and devel
4、opment , the choice of the game engine is based on directx8.0 written . capable of racing, track and draw various pictures , sound effects to achieve a variety of games to get keyboard input, single- player game, with computer-controlled car racing , multiplayer games with other players or computer
5、ai racing . compared with other similar games , collision detection algorithms used in the design , like the bounding rectangle box algorithm and color recognition algorithm , not only fast, but also detection sensitivity . multiplayer is achieved by the socket network programming and multi-threaded
6、 ms , socket provides reliable data transmission under c / s mode , multi-threaded socket waiting to solve the problem , a combination that makes the lan multiplayer games run more smooth. keywords : : 2d, directx, racing, game 目目 錄錄 第第一一章章 緒緒論論 . . . . . . . . . . . . . . . . . . . . . . . . . . .
7、. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 1 1.1 研究背景及意義 .1 1.2 賽車(chē)游戲開(kāi)發(fā)環(huán)境和語(yǔ)言 .1 1.3 賽車(chē)游戲的主要功能 .1 1.4 賽車(chē)游戲開(kāi)發(fā)的主要步驟 .2 第第二二章章 d di ir re ec ct tx x、游游戲戲引引擎擎和和游游戲戲結(jié)結(jié)構(gòu)構(gòu) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 3 2.1 directx 概述 .3 2.2 游戲
8、引擎 .3 2.2.1 選用的游戲引擎結(jié)構(gòu) .4 2.3 游戲結(jié)構(gòu) .5 2.4 本章小結(jié) .6 第第三三章章 游游戲戲邏邏輯輯 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 8 3.1 游戲主邏輯 .8 3.2 單人游戲邏輯 .9 3.3 多人游戲邏輯 .13 3.3.1 多人游戲服務(wù)器端邏輯 .13 3.3.2 多人游戲客戶(hù)端邏輯 .15 3.4 顯示游戲勝利 .15 3.5 本章小結(jié) .16 第第四
9、四章章 賽賽車(chē)車(chē)碰碰撞撞檢檢測(cè)測(cè)技技術(shù)術(shù) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 17 7 4.1 邊界矩形盒方法 .17 4.2 顏色識(shí)別算法 .19 4.3 本章小結(jié) .24 第第五五章章 s so oc ck ke et t 網(wǎng)網(wǎng)絡(luò)絡(luò)通通信信實(shí)實(shí)現(xiàn)現(xiàn)多多人人游游戲戲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 25
10、5 5.1 socket簡(jiǎn)介 .25 5.1.1 什么是 socket.25 5.1.2 windows socket 編程模型 .25 5.1.3 游戲所使用的 socket 模型 .31 5.2 粘包問(wèn)題 .32 5.2.1 粘包出現(xiàn)的原因.32 5.2.2 粘包問(wèn)題解決辦法.33 5.2.3 關(guān)閉優(yōu)化算法.34 5.3 多線程與 socket組合實(shí)現(xiàn)多人游戲.34 5.3.1 多線程的使用.34 5.3.2 多線程與 socket 的聯(lián)用.36 5.4 本章小結(jié) .39 第第六六章章 游游戲戲調(diào)調(diào)試試及及運(yùn)運(yùn)行行 . . . . . . . . . . . . . . . . . . .
11、 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 40 0 6.1 游戲程序的環(huán)境 .40 6.2 游戲運(yùn)行界面 .40 結(jié)結(jié)論論 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 42 2 致致謝謝 . . . . . . . . . . . . . . . . . . . . .
12、. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 43 3 參參考考文文獻(xiàn)獻(xiàn) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 44 4 第第一一章章 緒緒論論 1 1. .1 1 研研究究背背景景及及意意義義 游戲可以鍛煉我們的大腦,提高大腦
13、思維的敏捷性和靈活性,讓我們暫時(shí)拋開(kāi)自 己的煩惱,緩解現(xiàn)實(shí)生活給予我們的壓力。玩游戲可以讓我們適當(dāng)?shù)姆潘?,緩解精?疲勞。 中國(guó)的游戲產(chǎn)業(yè)在多年里迅猛的發(fā)展。一開(kāi)始主要依靠國(guó)外代理,而現(xiàn)在自主研 發(fā)的游戲已經(jīng)占了大部分的市場(chǎng)份額,現(xiàn)在的游戲產(chǎn)業(yè),在中國(guó)的經(jīng)濟(jì)發(fā)展中發(fā)揮著 不可替代的作用。 隨著國(guó)際國(guó)內(nèi)的游戲產(chǎn)業(yè)的發(fā)展,三維游戲逐漸成為游戲市場(chǎng)中的主要形式,但 2d 游戲因?yàn)樽约旱莫?dú)特的優(yōu)點(diǎn)并沒(méi)有退出人們的視野,反而在網(wǎng)頁(yè)游戲、娛樂(lè)休閑游 戲等領(lǐng)域快速的發(fā)展。和歐美、日韓游戲產(chǎn)業(yè)發(fā)展比較成熟的國(guó)家相比,中國(guó)的3d 技術(shù)并不成熟,很多游戲公司的精力主要放在技術(shù)方面的處理,想盡量模仿國(guó)外優(yōu)秀 游戲的
14、處理技術(shù),而且 3d 游戲的投資比較大,只有一小部分大型公司有實(shí)力進(jìn)行開(kāi)發(fā)。 與此相對(duì)的是,因?yàn)?2d 游戲的技術(shù)處理難度比較低,游戲公司不僅可以將精力放在技 術(shù)處理方面,還可以多花些精力在游戲策劃方面,以豐富游戲的內(nèi)容,它的整體開(kāi)發(fā) 周期短,投入的資金少得多,這些優(yōu)點(diǎn)使得 2d 游戲非常適合在中國(guó)發(fā)展。 從中國(guó)游戲玩家的反應(yīng)來(lái)看, 3d 游戲的吸引力比 2d 游戲強(qiáng)的多,玩家都更加喜 歡畫(huà)面質(zhì)量?jī)?yōu)秀的游戲。大多數(shù) 2d 游戲通常比較輕松、休閑、操作難度低,并且對(duì)硬 件和系統(tǒng)沒(méi)什么要求,非常適合那些喜歡休閑娛樂(lè)、交友的人。現(xiàn)在的 2d 游戲中也 利用不少的 3d 處理技術(shù)來(lái)優(yōu)化游戲畫(huà)面,如粒子
15、系統(tǒng)、水波特效、爆炸特效等。所以, 中國(guó)的 2d 游戲還是有比較好的發(fā)展前途的,尤其是在手機(jī)游戲中,在電腦游戲里也不 會(huì)被取代,因此,2d 游戲的開(kāi)發(fā)是我們值得關(guān)注和研究的問(wèn)題。 1 1. .2 2 賽賽車(chē)車(chē)游游戲戲開(kāi)開(kāi)發(fā)發(fā)環(huán)環(huán)境境和和語(yǔ)語(yǔ)言言 本設(shè)計(jì)所用的語(yǔ)言是c語(yǔ)言實(shí)現(xiàn)的,軟件使用的是 vc+6.0,還要directx8.0。 directx是微軟公司開(kāi)發(fā)的基于windows系統(tǒng)的多媒體編程接口,編寫(xiě)的語(yǔ)言是 c+,并且遵循com。它可以提高在window平臺(tái)運(yùn)行的游戲或者多媒體程序的運(yùn)行速度, 有很強(qiáng)的3d圖像處理能力,并且支持2d3d圖形加速。使得開(kāi)發(fā)人員在創(chuàng)建 3d場(chǎng)景時(shí) 不需要考慮
16、硬件的類(lèi)型,只需要通過(guò) direct3d調(diào)用設(shè)備接口就可以操作圖形設(shè)備,簡(jiǎn) 化了游戲開(kāi)發(fā)難度。 1 1. .3 3 賽賽車(chē)車(chē)游游戲戲的的主主要要功功能能 本設(shè)計(jì)可實(shí)現(xiàn)較真實(shí)的游戲音效、鍵盤(pán)接口、局域網(wǎng)內(nèi)通信 等功能。所設(shè)計(jì)的游 戲可以進(jìn)行兩種類(lèi)型的游戲即單人和多人游戲,游戲包括賽車(chē)創(chuàng)建、賽道載入、碰撞 檢測(cè)、控制在跑賽車(chē)、賽車(chē)數(shù)據(jù)處理。單人游戲中有電腦控制的賽車(chē)可以與玩家進(jìn)行 賽車(chē),多人游戲是可以各自控制賽車(chē),在不同的賽道上有不同的速度,第一個(gè)到終點(diǎn) 勝利。編譯通過(guò)或找出查出的問(wèn)題,進(jìn)行最終調(diào)試,完成游戲。 1 1. .4 4 賽賽車(chē)車(chē)游游戲戲開(kāi)開(kāi)發(fā)發(fā)的的主主要要步步驟驟 本游戲利用現(xiàn)在比較常
17、用的 visual c+ 6.0 工具,基于 directx 8.0,用 c 語(yǔ)言 實(shí)現(xiàn),進(jìn)行系統(tǒng)的分析,從玩家的角度去思考,怎么實(shí)現(xiàn)開(kāi)賽車(chē)時(shí)的快感與激情。 實(shí)現(xiàn)賽車(chē)的控制、賽道載入、碰撞檢測(cè)、賽車(chē)數(shù)據(jù)處理和多人游戲 等。主要步驟 為: (1)設(shè)計(jì)并畫(huà)游戲的場(chǎng)景; (2)設(shè)計(jì)界面; (3)游戲邏輯的設(shè)計(jì)與實(shí)現(xiàn); (4)游戲功能模塊設(shè)計(jì)與實(shí)現(xiàn); (5)游戲測(cè)試; 第第二二章章 d di ir re ec ct tx x、游游戲戲引引擎擎和和游游戲戲結(jié)結(jié)構(gòu)構(gòu) directx 是 pc 平臺(tái)上開(kāi)發(fā)游戲的事實(shí)上的標(biāo)準(zhǔn),而游戲引擎能使開(kāi)發(fā)游戲的工作 量大大的減少,本畢業(yè)設(shè)計(jì)所使用的游戲引擎是在 dire
18、ctx8.0 上編寫(xiě)的。下面是 directx8.0、游戲引擎的一些介紹。 2 2. .1 1 d di ir re ec ct tx x 概概述述 microsoft 公司的 directx 是一個(gè)多媒體應(yīng)用編程接口,它實(shí)際上是一種軟件系 統(tǒng),抽象出音頻、輸入、視頻、網(wǎng)絡(luò)以及安裝等內(nèi)容,由 c+語(yǔ)言實(shí)現(xiàn),遵循 com(組件對(duì)象模型) 。你可以使用相同的代碼,而不管計(jì)算機(jī)的具體硬件配置怎么樣。 另外,directx 比 windows 系統(tǒng)自帶的 gdi 要快很多,而且系統(tǒng)更穩(wěn)定。 directx 的主要組件有 directdraw、directgraphic、directinput、dire
19、ctplay、directmusic 和 directsound。不同的 api 負(fù)責(zé)完成 directx 內(nèi)核中不同的功能。directx 中的每個(gè) api 都可以通過(guò)硬件加速。這意味著只要是 directx 支持的硬件,都可以用程序訪問(wèn) 到,而不用關(guān)心它的具體實(shí)現(xiàn)。下面是它的主要組件和功能: directdraw:主要負(fù)責(zé) 2d 圖像加速,所有圖像的繪制都要用到它,因此它是十分 重要的。在 8.0 之后的版本已沒(méi)有了。 directgraphic:主要負(fù)責(zé)向屏幕上渲染二維圖形和三維圖形。它實(shí)際是 directdraw 和 direct3d 合并起來(lái)的。 directinput:它可以直接使
20、用所有與計(jì)算機(jī)關(guān)聯(lián)的輸入設(shè)備。這些設(shè)備包括鍵盤(pán)、 鼠標(biāo)、游戲控制桿、操作桿、空間定位球等設(shè)備。重要的是, directinput 可以和所 有現(xiàn)在的或?qū)?lái)的輸入設(shè)備對(duì)話。 directplay:可以通過(guò)因特網(wǎng)、調(diào)制解調(diào)器或直接連接來(lái)建立抽象的連接。 directmusic:支持 midi。 directsound:聲音組件,支持?jǐn)?shù)字化聲音( wav) ,但不支持 midi。 directx 目前已經(jīng)發(fā)展到到 directx12,一開(kāi)始,directx 1 很不成功,當(dāng)?shù)搅?directx 8 時(shí),它引發(fā)了顯卡革命,引入像素渲染概念。 directx 11 增加了新的計(jì)算 shader 技術(shù),它
21、允許 gpu 從事更多的計(jì)算工作,而不僅是 3d 運(yùn)算,這可以將 gpu 作 為并行處理器使用。directx 11 還支持 tessellation 鑲嵌化技術(shù),這有助于開(kāi)發(fā)人 員創(chuàng)建更為細(xì)膩流暢的模型,實(shí)現(xiàn)高質(zhì)量實(shí)時(shí)渲染和預(yù)渲染場(chǎng)景。 directx 11 另外一 大亮點(diǎn)是可以更好地利用多線程資源,從而使游戲更有效地利用多核處理器。目前, 已更新到 directx12, 毫無(wú)疑問(wèn) directx 給游戲業(yè)帶來(lái)了巨大的發(fā)展。 2 2. .2 2 游游戲戲引引擎擎 游戲引擎是游戲中與游戲具體實(shí)現(xiàn)無(wú)關(guān)的核心技術(shù)部分,可以說(shuō)是游戲的心臟, 而游戲的部分就是場(chǎng)景模型、角色模型、動(dòng)畫(huà)、聲音等其他控制部
22、分。經(jīng)過(guò)幾十年不 斷的發(fā)展,現(xiàn)在的游戲引擎已經(jīng)發(fā)展成一個(gè)由多個(gè)子系統(tǒng)共同構(gòu)成的復(fù)雜系統(tǒng)。 游戲 引擎就是為了降低游戲開(kāi)發(fā)者們重復(fù)勞動(dòng),節(jié)省開(kāi)發(fā)時(shí)間和開(kāi)發(fā)費(fèi)用而誕生的,它封 裝了很多在游戲制作中常用的功能,讓我們能直接調(diào)用這些功能而不用再?gòu)念^編寫(xiě)。 下面是游戲引擎主要的結(jié)構(gòu)。 2 2. .2 2. .1 1 選選用用的的游游戲戲引引擎擎結(jié)結(jié)構(gòu)構(gòu) 畢業(yè)設(shè)計(jì)所設(shè)計(jì)的賽車(chē)游戲中所使用的的游戲引擎由 3 個(gè)庫(kù)函數(shù)組成: t3dlib1、t3dlib2、t3dlib3。 1、t3dlib1:這是一個(gè)相當(dāng)簡(jiǎn)單的二維 8/16 位色,并具有后備緩沖的 directx 引擎,支持任何分辨率,并且不在意是否為窗口
23、模式。主要包含: (1)direct 接口函數(shù)如: ddraw_init(int width, int height, int bpp, int windowed=0):?jiǎn)?dòng)并初始 化 directdraw,可以選擇任何分辨率和顏色色深, windowed 為 0 表示全屏,若想為 窗口模式,應(yīng)置 1,并且不可選擇分辨率和顏色深度。 ddraw_shutdown(void):關(guān)閉 directdraw 并釋放所有接口。 ddraw_attach_clipper()給發(fā)送的表面關(guān)聯(lián)一個(gè)裁剪器等等。 (2)2d 多邊形函數(shù) 包含點(diǎn)、線、多邊形的繪制以及繪制 gdi 文字等。 (3)數(shù)學(xué)和誤差函數(shù)
24、包含計(jì)算兩點(diǎn)間的距離、打開(kāi)誤差文件等。 (4)位圖函數(shù) 包括加載位圖函數(shù)、釋放位圖函數(shù)、創(chuàng)建內(nèi)存位圖、繪制位圖等 (5)調(diào)色板函數(shù) 這些函數(shù)只用于 256 色,即 8 位模式,包含讀取調(diào)色板函數(shù)、更新調(diào)色板、保存 調(diào)色板等。 (6)實(shí)用工具函數(shù) 如 get_clock()、start_clock()等時(shí)間函數(shù)以及矩形碰撞檢測(cè)和顏色檢測(cè)函數(shù)。 (7)bob 對(duì)象(類(lèi)似精靈)及其處理函數(shù) 包含對(duì) bob 操作的各種函數(shù)。 2、t3dlib2:輸入系統(tǒng)。此系統(tǒng)比較簡(jiǎn)單主要功能如下: (1)初始化 directinput 系統(tǒng)。 (2)設(shè)置并獲取鍵盤(pán)、鼠標(biāo)、游戲桿。 (3)從輸入設(shè)備中讀取數(shù)據(jù)。 (4
25、)關(guān)閉設(shè)備。 3、t3dlib3:聲音控制。包含 directsound 和 directmusic: (1)directsound 實(shí)現(xiàn).wav 格式的波形聲音數(shù)據(jù)的播放控制 ,它的 api 封裝功 能如下: directsound 的初始化及關(guān)閉。 用 11khz、8 聲道載入.wav 文件。 播放加載的聲音文件。 停止播放。 檢測(cè)聲音的播放狀態(tài)。 改變音量、回放速率或立體聲的聲道平衡。 刪除聲音數(shù)據(jù)。 (2)directmusic 實(shí)現(xiàn) midi 文件的播放控制,其 api 封裝功能如下: directmusic 的初始化及關(guān)閉。 加載 midi 文件。 播放 midi 文件。 停止正在
26、播放的 midi 文件。 檢測(cè)聲音播放狀態(tài)。 如果 directsound 已被初始化,則自動(dòng)連接 directsound。 刪除 midi。 2 2. .3 3 游游戲戲結(jié)結(jié)構(gòu)構(gòu) 所有的游戲本質(zhì)上是一個(gè)持續(xù)不斷的 while循環(huán),它執(zhí)行邏輯并在屏幕上不間斷的 繪制更新圖像,通常以3060幀每秒速度不斷的繪制,本設(shè)計(jì)所實(shí)現(xiàn)的賽車(chē)游戲也是如 此,但圖像是以30幀每秒的速度繪制。本設(shè)計(jì)所實(shí)現(xiàn)的賽車(chē)游戲流程如圖 2-1,下面 是游戲的每個(gè)子流程的說(shuō)明。 winmian() createwindow(); gameinit(); 主事件循環(huán) game_shutdown(); gameinit() wi
27、nproc() process messages game_mian() game_shutdown() game_main() 輸入 人工智能和邏輯 . 渲染 圖2-1 游戲程序流程圖 (1)game_init()初始化 在這一部分中,游戲執(zhí)行初始化操作,此賽車(chē)游戲主要的初始化工作有對(duì)三角函 數(shù)、directdraw、directsound、directinput的初始化、鍵盤(pán)的初始化、聲音的載入、 創(chuàng)建裁剪器、游戲開(kāi)始畫(huà)面載入與繪制、各個(gè)位圖(包括賽車(chē)、終點(diǎn)、賽道、指示燈、 菜單畫(huà)面)的載入。 (2)game_main() 這一部分是游戲的主要部分,包括獲取玩家的輸入信息、執(zhí)行人工智能、游
28、戲邏 輯、繪制。 (3)game_shutdown () 此部分是在退出游戲循環(huán)后執(zhí)行的,用來(lái)釋放資源。先釋放各種位圖資源(如賽 車(chē)、終點(diǎn)、指示燈等) ,再將directdraw對(duì)象釋放掉,這兩個(gè)的順序不能搞錯(cuò),刪除所 有聲音,釋放directsound對(duì)象,釋放鍵盤(pán)設(shè)備。 2 2. .4 4 本本章章小小結(jié)結(jié) 本章主要介紹了 directx8.0、游戲引擎和游戲基本結(jié)構(gòu)。在列舉的 directx8.0 的主要組件中,directdraw、directinput、directmusic 和 directsound 是和本畢業(yè) 設(shè)計(jì)所設(shè)計(jì)的游戲相關(guān)的,并且是選用的游戲引擎的基礎(chǔ)。所列出的游戲引擎
29、中的功 能模塊是本畢業(yè)設(shè)計(jì)主要用到的,是實(shí)際編寫(xiě)過(guò)程中必須要調(diào)用的部分。本設(shè)計(jì)的游 戲的基本結(jié)構(gòu)與其他游戲類(lèi)似,本質(zhì)上就 是一個(gè)持續(xù)不斷的 while 循環(huán),它執(zhí)行邏輯, 并根據(jù)邏輯計(jì)算出下一幀圖像, 并在屏幕上不間斷的繪制更新圖像。 游戲最終表現(xiàn)出 來(lái)的就是一幀又一幀連續(xù)的畫(huà)面,本設(shè)計(jì)所要做的就是在循環(huán)中,不斷的獲取鍵盤(pán)的 輸入,根據(jù)輸入執(zhí)行游戲邏輯,生成下一個(gè)游戲動(dòng)畫(huà)幀,最后渲染該動(dòng)畫(huà)幀。 第第三三章章 游游戲戲邏邏輯輯 3 3. .1 1 游游戲戲主主邏邏輯輯 游戲主邏輯如圖 21 所示。 圖 21 游戲主邏輯流程圖 開(kāi)始時(shí)鐘,將后備緩沖填充黑色,依據(jù) game_state 的值選擇相應(yīng)
30、的功能, game_state 值類(lèi)型有 game_state_init(初始狀態(tài)) 、game_state_menu(菜單選擇) 、 game_state_running(游戲進(jìn)行) 、game_state_exit(退出) 、 game_state_wait_exit(等待退出) 。 如果 game_state 為 game_state_init 為游戲初始狀態(tài),停止準(zhǔn)備音樂(lè),將 game_state 置 game_state_menu,并重置游戲數(shù)據(jù),進(jìn)入菜單選擇界面,讀取鍵盤(pán)鍵 值,上、下移動(dòng)箭頭,enter 為確認(rèn)選擇,若為單人游戲或多人游戲則將當(dāng)前狀態(tài)置 為 game_state_
31、running,將游戲種類(lèi)置為當(dāng)前值,退出選項(xiàng)與 escape 鍵為退出,當(dāng) 為可識(shí)別鍵時(shí),播放按鍵音,然后將菜單選擇界面與箭頭繪制在后備緩沖表面,換頁(yè), 并等待 100 毫秒,等待時(shí)間不宜太短,否則會(huì)出現(xiàn)連擊的現(xiàn)象。 當(dāng) game_state 為 game_state_running 時(shí)為游戲進(jìn)行時(shí),之后判斷 game_type 的 值,game_type_singleplayer 為單人模式,game_type_multiplayer 為多人游戲, game_type_win 為勝利狀態(tài),換頁(yè),并等待 30ms。期間如果檢測(cè)到 escape 鍵,則將 game_state 置為 game_
32、state_menu,并重置游戲數(shù)據(jù)。 當(dāng) game_state 為 game_state_exit 為游戲退出狀態(tài),則將 game_state 置 game_state_wait_exit(游戲退出等待狀態(tài)) ,發(fā)送消息 wm_destroy,之后將進(jìn)入退 出等待階段,期間游戲不進(jìn)行操作,等待退出。 3 3. .2 2 單單人人游游戲戲邏邏輯輯 單人游戲的總的游戲邏輯如圖 2-2 所示。 圖 2-2 單人游戲流程圖 具體模塊如下: (1)判斷準(zhǔn)備 判斷 gameready 是否為 3,若為 3,則讀取鍵值,若不為 3,將當(dāng)前的 gameready 的值賦給指示燈當(dāng)前動(dòng)畫(huà)幀 light.cur
33、r_frame,等待一秒鐘,播放準(zhǔn)備聲音, gameready 自加,并將 0 號(hào)車(chē)的狀態(tài)改為玩家狀態(tài)。之后對(duì)讀取的鍵值進(jìn)行相應(yīng)的操 作,上鍵為打開(kāi)引擎前進(jìn),左鍵與右鍵改變方向。 (2)賽車(chē)數(shù)據(jù)處理 這一部分是關(guān)鍵部分,決定了賽車(chē)的具體位置、引擎聲音以及各種狀態(tài)。賽車(chē)是 bob 對(duì)象,本部分分別對(duì)各個(gè)對(duì)象進(jìn)行數(shù)據(jù)處理。 首先對(duì)按鍵所產(chǎn)生的信號(hào)和 ai 所產(chǎn)生的信號(hào)進(jìn)行處理,無(wú)論信號(hào)是來(lái)自接受來(lái)自 輸入或 ai 算法,他們對(duì)賽車(chē)對(duì)象所產(chǎn)生的變化是同一種類(lèi)型,所以處理時(shí),只要根據(jù) 賽車(chē)對(duì)象的內(nèi)部數(shù)據(jù)執(zhí)行相應(yīng)的改變,如果引擎打開(kāi),則提高當(dāng)前速度(不超過(guò)最大 速度) ,并提高引擎發(fā)聲頻率,若引擎關(guān)閉,
34、則減小引擎發(fā)聲頻率,方向向哪個(gè)方向變, 則將相應(yīng)的加或減相應(yīng)的方向數(shù)值。 第二步算出賽車(chē)在 x 和 y 方向上這一幀的位移變化,進(jìn)行碰撞檢測(cè),因?yàn)橘愜?chē)之 間只能進(jìn)行一次檢測(cè),所以,將當(dāng)前賽車(chē)與之后的賽車(chē)進(jìn)行碰撞檢測(cè),若檢測(cè)到碰撞, 則將位移大的賽車(chē)減小位移,將位移小的增加位移,之后重新算出賽車(chē)的速度以及方 向,查三角函數(shù)表,找出與賽車(chē)實(shí)際方向最接近的表中方向,并將該方向值賦給賽車(chē) 方向。 第三步,將賽車(chē)在世界坐標(biāo)中的位置加上位移變化得出當(dāng)前的位置坐標(biāo),并進(jìn)行 越界檢測(cè),若賽車(chē)超出世界范圍,則強(qiáng)制將賽車(chē)位置約束在范圍之內(nèi)。 (3)移動(dòng)窗口位置 這一部分的功能是為保證主視角以玩家控制的賽車(chē)為中心,
35、但不超過(guò)世界范圍 10001000。窗口在世界中有它的坐標(biāo),窗口坐標(biāo)在 360520 范圍之內(nèi),不可超出 此范圍,當(dāng)賽車(chē)超出窗口中心時(shí),窗口坐標(biāo)則移動(dòng)以確保賽車(chē)在中心處,中心范圍為 x 坐標(biāo)在 200 到 240,y 坐標(biāo)在 160 到 320。 (4)繪制賽道 賽道的繪制一定要在顏色識(shí)別之前進(jìn)行,不然,顏色識(shí)別將無(wú)法進(jìn)行。本游戲的 賽道種類(lèi)共有 10 種,外加一個(gè)草地,形成游戲的地形,每個(gè)位圖大小為 200200 大 小。世界地形是存儲(chǔ)在一個(gè)二維字符數(shù)組里,此字符數(shù)組內(nèi)字符種類(lèi)為 09 和g , 09 代表各個(gè)種類(lèi)的賽道, g代表草地,字符數(shù)組的存儲(chǔ)如下所示: char *world5= 6
36、1117, 02g30, 0ggg0, 05g40, 91118, ; 賽道在游戲世界里的排列如圖 2-3 所示。 圖 2-3 賽道顯示圖 由圖中可以看到有些位圖完全在窗口內(nèi),有些完全在窗口外,有些部分在窗口內(nèi), 有兩種方法可以將位圖繪制在后備緩沖表面,下面是兩種方法: 第一種方法:可以將所有位圖直接繪制在后備緩沖表面,賽道對(duì)象為 road,這是 一個(gè) bob 對(duì)象,其中存儲(chǔ)了 10 張賽道位圖,可遍歷字符數(shù)組,因?yàn)槊繌垐D在世界中的 坐標(biāo)可以算出,都為 200 的倍數(shù),在由世界坐標(biāo)算出他在窗口的坐標(biāo),之后,調(diào)用 draw_bob(/左側(cè)位圖在數(shù)組的 x 位置 x_r=(view_x+639)/
37、200;/ 右側(cè)位圖在數(shù)組的 x 位置 y_t=view_y/200;/ 上側(cè)位圖在數(shù)組的 y 位置 y_b=(view_y+479)/200;/ 下側(cè)位圖在數(shù)組的 y 位置 然后依據(jù)上述值,將所選中的位圖 blt 到后備緩沖表面。 (5)實(shí)行 ai 算法 ai 算法是對(duì)所有非玩家控制的賽車(chē)進(jìn)行的,首先,當(dāng) gameready 信號(hào)為 3 時(shí),打 開(kāi)引擎,之后對(duì)賽車(chē)左右兩邊 30 度距離賽車(chē)中心 60 像素的區(qū)域進(jìn)行顏色識(shí)別,若為 綠色,那么將方向變化改為相反方向,最后進(jìn)行邊界檢測(cè)。 (6)檢測(cè)摩擦力 路面摩擦力為 0.15,草地摩擦力為 0.19,并且,當(dāng)賽車(chē)在草地行駛時(shí),摩擦力會(huì) 達(dá)到 0
38、.34,所以在路面行駛的加速度會(huì)比草地的加速度大,而且,路面速度的最大值 比草地的最大值要大,實(shí)際行駛時(shí),在路面行如風(fēng),而在草地則非常慢,這是為了不 讓玩家從草地走。 (7)繪制各種物體以及賽車(chē) 這一部分十分簡(jiǎn)單,就是調(diào)用 draw_bob 將地圖上的各個(gè)物體繪制上去,包括終點(diǎn)、 賽車(chē)、紅綠燈,這些物體都要先計(jì)算在窗口的位置,之后繪制。 (8)判斷勝負(fù) 本游戲的勝負(fù)判斷一定要依次通過(guò)地圖上的 6 個(gè)區(qū)域,這是為了讓玩家走完全程 ,因 為此賽車(chē)游戲的賽道是一個(gè)環(huán)狀賽道,所以,終點(diǎn)也是起點(diǎn),勝負(fù)判斷也是判斷誰(shuí)先 走完一圈,其中,終點(diǎn)與起點(diǎn)的判別是一樣的,而其余四種則是判斷是否走過(guò)賽道的 四個(gè)角落,
39、這四種的判別十分容易,這里不做說(shuō)明,由于賽車(chē)可以繞過(guò)起點(diǎn)線,在草 地上行駛,所以要判斷賽車(chē)是向上穿過(guò)終點(diǎn)或起點(diǎn),判斷穿過(guò)只需判斷賽車(chē)中心進(jìn)入 終點(diǎn),而要確保賽車(chē)向上穿過(guò)可以同時(shí)判斷賽車(chē)此時(shí)的方向是否向上。當(dāng)賽車(chē)依次通 過(guò)這 6 個(gè)區(qū)域,就將當(dāng)時(shí)賽車(chē)的排名記錄下來(lái),保存在此時(shí)的賽車(chē)對(duì)象里,當(dāng)有三輛 賽車(chē)經(jīng)過(guò)終點(diǎn),則將 game_type 賦值 game_type_win,進(jìn)入游戲勝利模塊。 3 3. .3 3 多多人人游游戲戲邏邏輯輯 多人游戲的實(shí)現(xiàn)是靠 socket 網(wǎng)絡(luò)編程實(shí)現(xiàn)的,它分為服務(wù)器端和客戶(hù)端,這兩個(gè) 的游戲邏輯不一樣。主要的游戲數(shù)據(jù)處理都在服務(wù)器端進(jìn)行,并且進(jìn)行發(fā)送數(shù)據(jù)和顯 示等
40、操作,而客戶(hù)端則接收數(shù)據(jù)并發(fā)送用戶(hù)所控制的賽車(chē)的引擎狀態(tài)和方向變化等信 息。 3 3. .3 3. .1 1 多多人人游游戲戲服服務(wù)務(wù)器器端端邏邏輯輯 多人游戲服務(wù)器端流程如圖 2-4 所示。 圖 2-4 多人游戲服務(wù)器端流程 各個(gè)模塊的功能如下: 1、創(chuàng)建線程 創(chuàng)建一個(gè)主線程,用來(lái)對(duì) socket 的設(shè)置,創(chuàng)建其他線程用來(lái)接收或發(fā)送數(shù)據(jù)。 2、鏈接界面 這部分是顯示當(dāng)前鏈接上的玩家,在屏幕上顯示 player x in,并不斷地發(fā)送給 相應(yīng)玩家對(duì)應(yīng)的賽車(chē)號(hào)碼,若檢測(cè)到有玩家鏈接,則將下一個(gè)賽車(chē)控制權(quán)轉(zhuǎn)交到新連 接的玩家手中,直到服務(wù)器端玩家按下回車(chē)鍵,之后向所有玩家發(fā)出游戲開(kāi)始信號(hào), 客戶(hù)端
41、接收到信號(hào)后開(kāi)始游戲。 3、游戲進(jìn)行 此部分與單人游戲相似,詳情可以參照?qǐng)D 2-5,不同之處在兩處,下面是不同之 處: (1)在檢測(cè)摩擦力之后進(jìn)行的是發(fā)送數(shù)據(jù),將各個(gè)玩家控制的賽車(chē)數(shù)據(jù)發(fā)給相應(yīng) 玩家,如賽車(chē)的車(chē)號(hào)、坐標(biāo)、引擎狀態(tài)、方向。 (2)在判斷勝負(fù)部分里,當(dāng)有賽車(chē)走完一圈時(shí),向所有玩家發(fā)送這輛賽車(chē)的車(chē)號(hào) 以及名次,當(dāng)有三輛賽車(chē)到達(dá)終點(diǎn)時(shí),向所有玩家發(fā)送游戲結(jié)束信號(hào)。 圖 2-5 服務(wù)器端游戲運(yùn)行流程 3 3. .3 3. .2 2 多多人人游游戲戲客客戶(hù)戶(hù)端端邏邏輯輯 客戶(hù)端的游戲流程與服務(wù)器端類(lèi)似,可參見(jiàn)圖 2-4,但具體實(shí)現(xiàn)上有很大差別, 下面是客戶(hù)端各個(gè)模塊的功能: 1、創(chuàng)建線程
42、創(chuàng)建一個(gè)主線程,用來(lái)對(duì) socket 的設(shè)置,用來(lái)接收或發(fā)送數(shù)據(jù)。 2、鏈接界面 這部分是顯示當(dāng)前鏈接上的玩家的狀態(tài),如果連接上在屏幕上顯示 player x in,如果沒(méi)有鏈接上,就不顯示。 3、游戲進(jìn)行 這一部分只依次進(jìn)行判斷準(zhǔn)備、接收輸入信號(hào)、賽車(chē)數(shù)據(jù)處理、移動(dòng)窗口、發(fā)送 數(shù)據(jù)和繪圖,其中移動(dòng)窗口是以當(dāng)前玩家所控制的賽車(chē)為主視角,賽車(chē)數(shù)據(jù)處理只進(jìn) 行賽車(chē)聲音以及方向的處理,勝負(fù)判斷是依據(jù)服務(wù)器發(fā)送過(guò)來(lái)的信號(hào)進(jìn)行的。具體流 程如圖 2-6 所示。 判斷準(zhǔn)備 賽車(chē)數(shù)據(jù)處理 移動(dòng)窗口位置 繪制賽道 繪制各種物體以及賽車(chē) 判斷勝負(fù) 發(fā)送數(shù)據(jù) 圖 2-6 客戶(hù)端游戲運(yùn)行流程 3 3. .4 4 顯
43、顯示示游游戲戲勝勝利利 當(dāng)游戲判斷結(jié)束時(shí),游戲?qū)?zhí)行這部分,此部分執(zhí)行時(shí),游戲畫(huà)面將不動(dòng),并在 畫(huà)面上打出信息。第一行根據(jù)不同的名次打出不同的信息,如果是第一名將顯示 y o u w i n字樣,而第 2、3 名顯示具體的名次,如“n u m 2” ,如果是第四名則 顯示“y o u f a i l”字樣。第二行打出“press ” ,按下 escape 鍵,則進(jìn)入菜單選擇界面,并將游戲數(shù)據(jù)初始化。 3 3. .5 5 本本章章小小結(jié)結(jié) 本章主要介紹了賽車(chē)游戲的游戲邏輯,其中包含好幾個(gè)部分,如單人游戲邏輯和 多人游戲邏輯,游戲邏輯至關(guān)重要,因?yàn)樗鼘⒕唧w實(shí)現(xiàn)游戲各個(gè)方面的內(nèi)容,如具體 的圖片繪制
44、以及繪制順序、勝負(fù)判別等等,游戲邏輯是運(yùn)用游戲引擎提供的一些方法 并將其有序的組織起來(lái)來(lái)具體實(shí)現(xiàn)游戲的。 第第四四章章 賽賽車(chē)車(chē)碰碰撞撞檢檢測(cè)測(cè)技技術(shù)術(shù) 碰撞檢測(cè)是賽車(chē)游戲設(shè)計(jì)中最關(guān)鍵的一項(xiàng)技術(shù),一個(gè)好的碰撞檢測(cè)往往會(huì)使游戲 變得更真實(shí),而粗略的碰撞算法會(huì)出現(xiàn)許多 bug 使玩家無(wú)法玩下去。在此畢業(yè)設(shè)計(jì)所 實(shí)現(xiàn)的賽車(chē)游戲中,涉及到的碰撞檢測(cè)共有兩種,第一種是邊界矩形盒方法,第二種 是顏色識(shí)別算法,下面將分別介紹。 4 4. .1 1 邊邊界界矩矩形形盒盒方方法法 邊界矩形盒方法是檢測(cè)兩個(gè)矩形是否重疊的方法,矩形可以代表任何東西,在這 里代表賽車(chē),你必須給出他們的左上角坐標(biāo)以及高度和寬度,如果有
45、重疊,則返回 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) - (h2
46、3); / compute center of each rect int cx1 = x1 + width1; int cy1 = y1 + height1; int cx2 = x2 + width2; int cy2 = y2 + height2; / compute deltas int dx = abs(cx2 - cx1); int dy = abs(cy2 - cy1);/ abs()是取絕對(duì)值 / test if rects overlap if (dx (width1+width2) else / else no collision return(0); / end coll
47、ision_test 這個(gè)函數(shù)實(shí)現(xiàn)的基本思想是分別計(jì)算兩個(gè)矩形的中心坐標(biāo),然后根據(jù)中心坐標(biāo)的 x 和 y 軸的距離判斷兩個(gè)矩形是否重疊。如果兩個(gè)矩形相交,如圖 3-1 所示。 x y 矩形 1 矩形 2 圖 3-1 兩矩形相交 設(shè)這兩個(gè)矩形的各個(gè)數(shù)據(jù)和函數(shù)的參數(shù)一樣,頂點(diǎn)坐標(biāo)為( x1,y1)和(x2,y2), 矩形 1 的寬為 w1,高為 h1,矩形 2 的寬為 w2,高為 h2,那么兩矩形的中點(diǎn)坐標(biāo)為 (x1+w1/2,y1+h1/2),(x2+w2/2,y2+h2/2),因?yàn)檫@兩個(gè)矩形相交,所以,他們的中點(diǎn)坐 標(biāo)必有如下關(guān)系: |x1+w1/2-(x2+w2/2)|(w1+w2)/2 并
48、且|y1+h1/2-(y2+h2/2)|1) - (w13); int height1 = (h11) - (h13); int width2 = (w21) - (w23); int height2 = (h21) - (h23); 其中,width1 為八分之三 w1,并不是本系統(tǒng)所用的二分之一,這是因?yàn)榇撕瘮?shù)通 常用于位圖的碰撞檢測(cè),而位圖是以長(zhǎng)方形載入的,且物體的圖像通常在長(zhǎng)方形的中 央,但不會(huì)占滿整個(gè)長(zhǎng)方形,如圖 3-2 所示, 圖 3-2 賽車(chē)位圖資源 賽車(chē)實(shí)體與矩形是有區(qū)別的,雖然 本系統(tǒng)所列的判別方法可以準(zhǔn)確判斷矩形重疊, 但當(dāng)判斷重疊時(shí),屏幕上所顯示的物體并沒(méi)有發(fā)生碰撞,而上
49、述函數(shù)所用的方法雖然 不準(zhǔn)確(實(shí)際矩形重疊但檢測(cè)不出來(lái)),但在游戲運(yùn)行時(shí),實(shí)際看上去效果會(huì)好很多, 也更加真實(shí),所以用八分之三比用二分之一要好。 還有一點(diǎn)“(w11) - (w13)”就是 w1*3/8,但為什么要這么麻煩呢?這主要是 考慮到執(zhí)行速度,位移與加減法比做乘除法要快的多,游戲要考慮到速率,所以,盡 量用快速的方法。 4 4. .2 2 顏顏色色識(shí)識(shí)別別算算法法 顏色識(shí)別算法在此游戲中被頻繁用到,這是一個(gè)非常好用的算法,它沒(méi)有非常復(fù) 雜的原理,只是讀出顏色值,然后進(jìn)行判別,它的速度也很快,對(duì)在窗口內(nèi)的碰撞檢 測(cè)十分有效,下面是它的具體實(shí)現(xiàn): int color_scan(int x1
50、, 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_width-1; else if (x1 = screen_width) x2=screen_width-1
51、; else if (x2 = screen_height) y1=screen_height-1; else if (y1 = screen_height) y2=screen_height-1; else if (y2 0) y2=0; / scan the region scan_buffer +=y1*scan_lpitch; for (int scan_y=y1; scan_y=y2; scan_y+) for (int scan_x=x1; scan_x= scan_start / end for x / move down a line scan_buffer+=scan_lpi
52、tch; / end for y /a=scan_bufferx2; /sprintf(s,%d,a); /draw_text_gdi(s,8,8,rgb(255,255,255),lpddsback); / return failure return(0); / end color_scan 這個(gè)函數(shù)使用時(shí)須要的參數(shù)有很多,如下: 1、需要掃描的區(qū)域,掃描區(qū)域是一個(gè)矩形,需要傳入矩形的左上頂點(diǎn)坐標(biāo)和右下 頂點(diǎn)坐標(biāo),即參數(shù)列表中的 x1,y1,x2,y2。 2、需要給出要尋找的顏色值范圍即 scan_start 和 scan_end,這是 8 位模式下 的狀態(tài),它的數(shù)據(jù)也是應(yīng)該是 8 位索引值
53、,而 uchar 是 8 位,函數(shù)會(huì)在尋找范圍里尋 找從 scan_start 到 scan_end 的顏色,如果找到則返回 1,否則返回 0。 3、uchar *scan_buffer 是要傳入一個(gè)指向表面的指針,通常是指向后備緩沖表 面的指針,因?yàn)橹鞅砻嫱ǔJ沁M(jìn)過(guò)換頁(yè)而來(lái)的,換頁(yè)是與后備緩沖表面交換的,即主 表面顯示的是當(dāng)時(shí)的前一幀的狀態(tài),無(wú)法對(duì)當(dāng)前狀況作出反應(yīng),所以,不用主表面進(jìn) 行顏色識(shí)別,而掃描離屏表面沒(méi)有任何意義,因?yàn)殡x屏表面是儲(chǔ)存位圖的表面,所以 也不用離屏表面,繪圖的實(shí)際操作是在后備緩沖表面上進(jìn)行的,所以,通常傳入指向 后備緩沖表面的指針。 4、int scan_lpitch,
54、這個(gè)參數(shù)通常傳入的是 lpitch(或 back_lpitch,這兩個(gè) 的只是一樣的) ,即你所在顯示模式的水平內(nèi)存間距。如圖 3-3 所示,lpitch 是該顯 示模式中每行上的字?jǐn)?shù),也被稱(chēng)為步幅( stride)或內(nèi)存寬度(memory width) 。這 個(gè)參數(shù)也可以傳入一個(gè)具體的值,如果當(dāng)時(shí)的顯示模式是 6404808,那么,該模 式下每行有 640 個(gè)像素,每個(gè)像素為 8 位(或者說(shuō)一個(gè)字節(jié)) ,因此,實(shí)際每行應(yīng)該 恰為 640 個(gè)字節(jié),即傳入的值為 640,如果在 64048016 模式下,傳入的值是 1280(每像素 2 個(gè)字節(jié)為 6402) 。雖然可以傳入一個(gè)具體的值,但這確有
55、一定危險(xiǎn), lpitch 可以是任何值,視 vram 布局而定。因此當(dāng)逐行訪問(wèn)一個(gè) directdraw 顯示表面 內(nèi)存時(shí)(這里訪問(wèn)的是后備緩沖表面),必須利用 lpitch 移到下一行,而不是用像素 字節(jié)數(shù)乘寬度,總之,如果使用 lpitch 來(lái)進(jìn)行內(nèi)存計(jì)算,這樣,所寫(xiě)的代碼就總是安 全的。 圖 3-3 訪問(wèn)的表面 該函數(shù)一開(kāi)始就對(duì)傳入的矩形的頂點(diǎn)做判斷,保證掃描區(qū)域在窗口范圍之內(nèi),如 果矩形超出掃描范圍,則只掃描在窗口范圍里的矩形大小。在上述代碼中,對(duì)x1 的 越界操作為“x1=0;”和“x1=screen_width-1;” ,這里不將 x1 置為 screen_width 是 有理由的
56、,分辨率為 640480,表示水平方向含有像素?cái)?shù)為 640 個(gè),垂直方向像素?cái)?shù) 480 個(gè),而在程序里,后備緩沖表面 back_buffer 的存儲(chǔ)是從 0 開(kāi)始的,所以,當(dāng) x1 為 screen_width 時(shí),實(shí)際上已不在表面的工作區(qū)了,要它的最大邊界是 screen_width-1,其他坐標(biāo)點(diǎn)類(lèi)似。 接下來(lái)該函數(shù)開(kāi)始逐行訪問(wèn)后備緩沖表面的內(nèi)存。因?yàn)?,后備緩沖表面的內(nèi)存實(shí) 際是一個(gè)線性數(shù)組,所以在換行時(shí)需要加上 lpitch。 上面所列出的顏色識(shí)別函數(shù)實(shí)際上是在 8 位模式下的才能用的,指向表面的指針 定義為 uchar *scan_buffer,這是一個(gè)指向 uchar 的指針,而 u
57、char 是 8 位,正巧這 個(gè)表面所儲(chǔ)存的一個(gè)顏色值是一個(gè) 8 位索引值,所以,在查找對(duì)應(yīng)像素的顏色時(shí),指 針的下標(biāo)值就是 lpitch 的整數(shù)倍再加上橫坐標(biāo)。 這個(gè)函數(shù)不能在十六位模式下工作,但是如果要在十六位模式下進(jìn)行顏色識(shí)別呢? t3dlib1 函數(shù)庫(kù)提供了一個(gè)工作于 16 位模式下的顏色識(shí)別算法: color_scan16() , 雖然本游戲沒(méi)有用到,但還是要說(shuō)明一下。 color_scan16()與上述所列的 8 位模式 下的函數(shù)的實(shí)現(xiàn)原理基本相同,不同的只是在顏色比較時(shí),他們的數(shù)據(jù)類(lèi)型為 ushort(16 位) ,查找時(shí)只將存儲(chǔ)的顏色值與開(kāi)始顏色或末尾的顏色值比較,所以只 能查
58、找這兩種顏色,不能像 8 位那樣查找一段顏色范圍,這是因?yàn)?16 位模式下,是 rgb 編碼的像素值,如果要查一個(gè)從紅色( red 的值為 10,green 的值為 0,blue 的 值為 0)到深一點(diǎn)的紅色(red 的值為 11,green 的值為 0,blue 的值為 0) ,若按 8 位方法查詢(xún),就會(huì)將其他顏色范圍也一并包含進(jìn)來(lái),如顏色值 (0,01010,11110,00000) 。 t3dlib1 函數(shù)庫(kù)沒(méi)有給出 24 和 32 位模式下的顏色識(shí)別函數(shù),顏色識(shí)別也可以在 其他模式下進(jìn)行。8 位模式,存儲(chǔ)一個(gè)像素的顏色要一個(gè)字節(jié),而 16 位模式下,存儲(chǔ) 一個(gè)像素的顏色要 2 個(gè)字節(jié),
59、同樣 24 位要 3 個(gè)字節(jié),32 位要 4 個(gè)字節(jié),除了 8 位模 式外,其他模式都是 rgb 編碼的像素值,如圖 3-4 所示。 圖 3-4 16/24/32 位 rgb 像素編碼 因?yàn)楦鱾€(gè)模式下的 rgb 像素編碼的模式不同,所以,建立他們時(shí),也要用不同的 算法,基本上可以通過(guò)簡(jiǎn)單的移位和掩碼操作來(lái)完成此算法,算法表示為如下的宏: / this builds a 16 bit color value in 5.5.5 format (1-bit alpha mode) #define _rgb16bit555(r,g,b) (b hthreadsok_num=createthread(n
60、ull,null,answerthread, (lpvoid)acceptsocket,0, 此功能的主要思想是在監(jiān)聽(tīng)函數(shù)調(diào)用后,進(jìn)入循環(huán),循環(huán)內(nèi)先調(diào)用 accept() , 如果沒(méi)有客戶(hù)端連接,就等待,這不影響進(jìn)程的執(zhí)行;如果有客戶(hù)端連接,則建立連 接,返回一個(gè)套接字,之后對(duì)連接數(shù)進(jìn)行判斷,決定是否跳出循環(huán),如果連接數(shù)在最 大車(chē)數(shù)內(nèi),則建立子線程,并傳入分配的套接字。流程可見(jiàn)圖 4-6。 accept()等待連 接 建立子線程 sok_num max_ca r n y 退出 圖 4-6 多線程創(chuàng)建流程 (2)子線程要執(zhí)行的函數(shù)很簡(jiǎn)單,主要實(shí)現(xiàn)接收并處理數(shù)據(jù)的功能。循環(huán)調(diào)用 recv()函數(shù)和
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025三人合伙開(kāi)店合同
- 2025農(nóng)田承包合同范本
- 2025關(guān)于電子元件加工合同的范本
- 20252項(xiàng)目任務(wù)合同書(shū)(模板)x
- 課題申報(bào)參考:勞動(dòng)就業(yè)、人力資本積累與消費(fèi)研究
- 穿越星際科技前沿的宇宙探索
- 2024年便攜溫度校驗(yàn)儀項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 職業(yè)技能提升的多元化教學(xué)方法
- 江蘇省南通市如皋市2024-2025學(xué)年八年級(jí)上學(xué)期1月期末道德與法治試題(含答案)
- 安徽省阜陽(yáng)市太和縣2023-2024學(xué)年八年級(jí)下學(xué)期4月期中物理試題【含答案、解析】
- 化學(xué)-河南省TOP二十名校2025屆高三調(diào)研考試(三)試題和答案
- 智慧農(nóng)貿(mào)批發(fā)市場(chǎng)平臺(tái)規(guī)劃建設(shè)方案
- 林下野雞養(yǎng)殖建設(shè)項(xiàng)目可行性研究報(bào)告
- 2023年水利部黃河水利委員會(huì)招聘考試真題
- Python編程基礎(chǔ)(項(xiàng)目式微課版)教案22
- 01J925-1壓型鋼板、夾芯板屋面及墻體建筑構(gòu)造
- 欠電費(fèi)合同范本
- 2024年新高考地區(qū)數(shù)學(xué)選擇題填空壓軸題匯編十八含解析
- 網(wǎng)易云音樂(lè)用戶(hù)情感畫(huà)像研究
- 小學(xué)四年級(jí)奧數(shù)題平均數(shù)問(wèn)題習(xí)題及答案
- 工作違紀(jì)違規(guī)檢討書(shū)范文
評(píng)論
0/150
提交評(píng)論