




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、本科生畢業(yè)設(shè)計 基于 Visual C+實現(xiàn)的單機(jī)版俄羅斯方塊游戲的設(shè)計I摘摘 要要俄羅斯方塊是非常傳統(tǒng)的游戲,操作簡單,難度卻不低,廣受娛樂界歡迎。給人們的生活帶來了健康愉快的補(bǔ)充,唯美的藝術(shù)享受。本文在基于 Visual C+實現(xiàn)的單機(jī)版俄羅斯方塊游戲的基礎(chǔ)上,深入的研究 MFC 框架中的各個類的關(guān)系和它們內(nèi)部之間的聯(lián)系。主要工作和結(jié)論:1. 分析了俄羅斯游戲規(guī)則。2.系統(tǒng)的介紹了實現(xiàn)俄羅斯方塊游戲的算法設(shè)計過程。3. 將研究的思路運(yùn)用于實際,在 VC+6.0 平臺下實現(xiàn)了俄羅斯方塊游戲。 關(guān)鍵詞關(guān)鍵詞 :俄羅斯方塊游戲;VC+;MFC 框架AbstractRussia is a very
2、 traditional box of the game, simple operation, the difficulty is not low, widely welcomed by the entertainment industry. To the peoples life a happy and healthy complement to the flavor of the enjoyment of the arts. In this paper, based on the Visual C + + to achieve the single version of the Russi
3、an box on the basis of the game, MFC-depth study in the framework of various types and their internal relations between the links. And the main conclusions : 1. Analysis of the Russian rules of the game. 2. The system introduces a game of Russian box algorithm design process. 3. Will examine the pra
4、ctical application of ideas, in VC + +6.0 platform under the Russian box game. Key words : Russian box game; VC + +; MFC framework 本科生畢業(yè)設(shè)計 基于 Visual C+實現(xiàn)的單機(jī)版俄羅斯方塊游戲的設(shè)計II目目 錄錄摘摘 要要.IABSTRACT.I1 引言引言 .31.1 選題及研究意義選題及研究意義 .31.2 論文研究的主要內(nèi)容論文研究的主要內(nèi)容 .32.1 APPAPP 應(yīng)用程序類物件應(yīng)用程序類物件 .42.2 文檔文檔視圖機(jī)制視圖機(jī)制 .52.3 DOC
5、UMENTDOCUMENT 文擋操作文擋操作 .62.4 文檔文檔- -視圖的關(guān)聯(lián)視圖的關(guān)聯(lián) .63 俄羅斯游戲分析和總體設(shè)計俄羅斯游戲分析和總體設(shè)計 .73.1 俄羅斯方塊俄羅斯方塊游戲游戲功能描述功能描述 .83.2 游戲游戲規(guī)則規(guī)則分析分析 .84 俄羅斯方塊游戲的實現(xiàn)俄羅斯方塊游戲的實現(xiàn) .94.1 游戲游戲核心數(shù)據(jù)的抽象與設(shè)計核心數(shù)據(jù)的抽象與設(shè)計 .104.2 操作方法的抽象與設(shè)計操作方法的抽象與設(shè)計 .134.3 流程的設(shè)計流程的設(shè)計與實現(xiàn)與實現(xiàn) .154.3.1 正常流程的設(shè)計正常流程的設(shè)計 .154.3.2 正常流程的實現(xiàn)正常流程的實現(xiàn)( (定時處理定時處理) ) .164.3
6、.3 中斷操作流程的設(shè)計中斷操作流程的設(shè)計 .194.3.3 中斷操作流程的實現(xiàn)中斷操作流程的實現(xiàn) .204.4 游戲區(qū)域繪圖的實現(xiàn)游戲區(qū)域繪圖的實現(xiàn) .214.4.1 位圖資源的準(zhǔn)備位圖資源的準(zhǔn)備 .214.4.2 繪圖機(jī)制設(shè)計繪圖機(jī)制設(shè)計 .224.4.3 繪圖環(huán)境資源的初始化和釋放繪圖環(huán)境資源的初始化和釋放 .224.4.4 游戲區(qū)域的繪制游戲區(qū)域的繪制 .245. .功能的完善功能的完善 .275.1 游戲背景音樂的實現(xiàn)游戲背景音樂的實現(xiàn) .295.2 工具欄快捷鍵的實現(xiàn)工具欄快捷鍵的實現(xiàn) .30結(jié)束語結(jié)束語 .33參考文獻(xiàn)參考文獻(xiàn) .33致致 謝謝 .34本科生畢業(yè)論文2俄羅斯方塊游
7、戲的實現(xiàn)1 引言我們國家正處于全球文化產(chǎn)業(yè)日新月異大格局中,電子游戲、網(wǎng)絡(luò)游戲的發(fā)展速度之快,更是令人眼花繚亂,目不暇接。未來的電子和游戲發(fā)展趨勢必將是更智能化、更藝術(shù)性、更人性味。在高性能的硬件設(shè)備的支持下,游戲的驅(qū)動引擎更具威力,控制功能更加完備,在一個錯綜復(fù)雜的極度擴(kuò)張的游戲大世界中,帶著超乎常人智慧的人工智能的應(yīng)對力,使得所有要素包括藝術(shù)的風(fēng)格、情感的互動、故事的鋪展、視覺的表現(xiàn)、用戶的界面,融合為有機(jī)的一體,給人們帶來更豐富的娛樂和體驗。好的游戲給人們的生活帶來了健康愉快的補(bǔ)充,唯美的藝術(shù)享受,潛默的教育功效。本系統(tǒng)采用VC+為主要開發(fā)工具設(shè)計實現(xiàn)了一個單機(jī)板的俄羅斯方塊游戲。與其他
8、程序相比,筆者的作品有三個特色:一是精心設(shè)計的人機(jī)界面,不僅友好而且易于操作。二是筆者的游戲采用的是單機(jī)板。三是采用MFC應(yīng)用程序開發(fā)模型進(jìn)行編制,使開發(fā)人員減輕創(chuàng)建Windows應(yīng)用程序的負(fù)擔(dān)。網(wǎng)絡(luò)版的俄羅斯方塊游戲是兩個玩家通過網(wǎng)絡(luò)進(jìn)行較量,但在游戲過程中數(shù)據(jù)要通過服務(wù)器進(jìn)行傳送,網(wǎng)絡(luò)版游戲經(jīng)常會出現(xiàn)斷線、超時等情況這些都是因為網(wǎng)絡(luò)的速度比較慢造成的。而筆者設(shè)計的俄羅斯游戲雖然是單機(jī)版的,但速度快,提高了效率。1.1 選題及研究意義選題及研究意義俄羅斯方塊游戲是一個比較經(jīng)典的游戲,根據(jù)軟件工程有關(guān)的規(guī)范,以合理的開發(fā)原則,設(shè)計出單機(jī)的俄羅斯方塊游戲,并給人們的生活帶來唯美的藝術(shù)享受和健康愉
9、快的補(bǔ)充。游戲軟件是一種與文化背景密切聯(lián)系的產(chǎn)品,具有很強(qiáng)的民族性和豐富的文化內(nèi)涵。伴隨著游戲軟件在市場上的銷售,與其相關(guān)的文化也隨之傳播。因此發(fā)展我國自主的益智、健康的游戲軟件已是當(dāng)務(wù)之急。游戲是一種基于計算機(jī)的應(yīng)用軟件,是新型的休閑娛樂方式。當(dāng)前開發(fā)的游戲軟件應(yīng)該做到知識性、娛樂性、趣味性、教育性相統(tǒng)一。1.2 論文研究的主要內(nèi)容論文研究的主要內(nèi)容在論文完成過程中,認(rèn)真學(xué)習(xí)了游戲開發(fā)的基本技術(shù),OOD 方法軟件設(shè)計的基礎(chǔ)知識,VC+程序設(shè)計語言等。結(jié)合游戲開發(fā)的過程、算法的設(shè)計與分析(如下墜物的生成、下墜物隨機(jī)選擇、游戲區(qū)畫板實現(xiàn)的方法等)、軟件工程等角度重點研究了實現(xiàn)游戲的算法和采用 V
10、C+平臺設(shè)計游戲的優(yōu)點和現(xiàn)存結(jié)構(gòu)的不足之處。以下是論文的組織結(jié)構(gòu):第 1 部分是引言,主要介紹論文選題的意義、選題背景等相關(guān)情況。第 2 部分概述 MFC 應(yīng)用程序框架。第 3 部分是游戲規(guī)則的分析。第 4 部分是游戲算法的實現(xiàn)、游戲功能模塊、操作界面以及系統(tǒng)分析及設(shè)計。本科生畢業(yè)論文3第 5 部分是對整個論文的結(jié)束語。對論文的主要工作作了歸納總結(jié),分析了進(jìn)一步需要做的工作。2 MFCMFC 應(yīng)用程序架構(gòu)應(yīng)用程序架構(gòu)傳統(tǒng)的 Windows 應(yīng)用程序的開發(fā)使用 API(Application Programming Interface)函數(shù)。API 函數(shù)的功能主要是為 Windows 應(yīng)用程序開
11、發(fā)提供統(tǒng)一的編程接口。在使用 API 編程的過程中,窗口的創(chuàng)建和消息的處理都需要手工編碼。一個簡單的 Windows 應(yīng)用程序的代碼需要上百行,這使 Windows 應(yīng)用程序開發(fā)變成了一件繁重的工作。現(xiàn)在編程,都是在 Visual C+ 環(huán)境下采用基本 MFC(Microsoft Foundation Class)的 Windows 編程方法。Microsoft 基本類庫 MFC 是一個 Windows 應(yīng)用程序框架,它是 C+類結(jié)構(gòu)的擴(kuò)展。利用 MFC 提供的面向?qū)ο蟪绦蛐猩珯C(jī)的框架,可大大減輕程序開發(fā)人員創(chuàng)建 Windows 應(yīng)用程序的負(fù)擔(dān)。MFC 提供了管理窗口、菜單、對話誆的代碼,可實
12、現(xiàn)基本的輸入輸出和數(shù)據(jù)的存儲。此外,MFC 還提供一個應(yīng)用程序來發(fā)模型,此模型被稱為文檔視圖模型。文檔視圖模型視將應(yīng)用程序數(shù)據(jù)與用戶界面元素分離的一種應(yīng)用編程方法,它允許這兩部分程序獨立存在。這樣,程序員在更改其中部分代碼的時候,不會大幅度地更改另一部分。該游戲的實現(xiàn)采用 MFC 框架。在構(gòu)架類視圖中有 MFC 基本架構(gòu)組合 : App(應(yīng)用程序)類、Document(文檔)類、View(視圖)類、Frame(框架)類和用于提示關(guān)于作者的對話框 CAboutDlg 類。下面對這幾個類做一個簡單的列表,如表 2.1 所示。表 2.1 MFC 應(yīng)用程序架構(gòu)表類別基類 描述ApplicationCw
13、inApp代表應(yīng)用程序的核心DocumentCdocument包含應(yīng)用程序的數(shù)據(jù)集Windows Cwind主要用于圖形用戶界面(GUI)的對象,可以處理常見的 Windows 消息FrameCframeWnd用于應(yīng)用程序的主要 Windows 框架ViewVciew用于顯示數(shù)據(jù)并與文檔 Document 對象交互2.1 APPAPP 應(yīng)用程序類物件應(yīng)用程序類物件每種語言都有一個程序入口(主函數(shù)),如 C/C+語言的 main()函數(shù)。總地來說, main()函數(shù)的調(diào)用與終止代表著程序執(zhí)行的開始與結(jié)束,在程序運(yùn)行的過程中,無非是對一些業(yè)務(wù)性的功能流程進(jìn)行不斷的處理,當(dāng)完成后才退出程序。其實,所
14、有的程序也是采用同樣的方法去實現(xiàn), MFC 機(jī)制巧妙地利用了 Application 類去封裝實現(xiàn)了這樣的效果功能,每個 CWinApp 類對象實體都代表應(yīng)用程序本身,它是基本的 Application Class(應(yīng)用程序類),其封裝了 Windows-based 應(yīng)用程序的初始化、運(yùn)行、 Message 映射和終止等功能。假如創(chuàng)建了這樣的一個對象實體,在運(yùn)行期間處理初始化、消息映射、或者其他本科生畢業(yè)論文4動作時就可以通過屬性操作的調(diào)用去實現(xiàn),而不像擁有結(jié)構(gòu)化設(shè)計思想的 mainO 函數(shù)那樣的順序去實現(xiàn)。那么,現(xiàn)在就來看看這個 CWinApp 類對象的性質(zhì)。在 MFC 框架中,應(yīng)用程序必須
15、有且僅有一個從 CWinApp 派生的 Class Object(類物件),這個 Object 在 Windows 創(chuàng)建之前就會被創(chuàng)建,也就是說這個 Object 會和其他 C+ 全局 Object 同時創(chuàng)建。當(dāng) Windows 調(diào)用 WinMainO 時(在 MFC 應(yīng)用程序中,不必親自調(diào)用 WinMainO,因為機(jī)制已經(jīng)對它封裝好,當(dāng)應(yīng)用程序啟動時會由框架自動調(diào)用),這個 Object 已經(jīng)可用了,并且該 Object 是全局的。 當(dāng)用 AppWizard 創(chuàng)建 DocumentNiew 模式應(yīng)用程序時,AppWizard 會聲明一個從CWinApp 派生的 Application Cla
16、ss, 因此,由 AppWizard 所產(chǎn)生的.cpp 文件中還包括 Message 映射、空的構(gòu)造函數(shù)、一個應(yīng)用程序 Object(即一個變量)和 InitInstanceO 函數(shù)。AppWizard提供的源代碼和 Message 映射可以滿足一些基本的任務(wù),但在通常情況下,還是需要手工修改那些源程序,特別是要修改 Initinstance()函數(shù)。在 CWinApp 中,有以下幾個關(guān)鍵的可重寫的成員數(shù)。 InitInstance(): 此函數(shù)對文檔模板(Document Template)進(jìn)行創(chuàng)建和初始化,即在這過程中伴隨著 Document、View 和 Frame 的創(chuàng)建。 Run()
17、: 初始化后,WinMain 就會調(diào)用這個成員函數(shù)去處理 Message 循環(huán)。 ExitInstance(): 每當(dāng)一個應(yīng)用程序的 Copy (拷貝)終止時,就會調(diào)用這個函數(shù),即發(fā)生在應(yīng)用程序退出時。 OnIdle(): 當(dāng)沒有 Windows Message 處理時,就會由 Framework 調(diào)用這個函數(shù),并重寫這個函數(shù)去執(zhí)行后臺任務(wù)。當(dāng)用戶從 CWinApp 派生一個 Application Class 時,必須重寫成員函數(shù)InitInstance() 去創(chuàng)建應(yīng)用程序的 Main Window Objecto Windows 允許同時運(yùn)行同一個應(yīng)用程序的多個“Copy”, 而且該應(yīng)用程
18、序的每個 Instance(包括第一個的)都會被初始化,而初始化時都會用到被 Override 了的 InitInstance() 函數(shù)所提供的信息。通常情況下,每個 Windows-based 應(yīng)用程序都有一個 Main Window 。因此,在初始化完成后, Framework 就會檢查是否存在一個指向有效 Main Windows( CWinApp:m_pMain Wnd) 的指針,如果不存在的話,應(yīng)用程序就會終止。當(dāng)利用 AppWizard 創(chuàng)建應(yīng)用工程項目時,AppWizard 會重寫缺省的 InitInstance()來創(chuàng)建 Main Window Object,還會使 CWinA
19、pp 的數(shù)據(jù)成員 m_pMainWnd 指向那個 Window 。2.2 文檔文檔視圖機(jī)制視圖機(jī)制文檔對視圖的管理。若用非文檔,視圖機(jī)制的時候,交互界面顯示的只有一種視圖,在這種情況下,可以將內(nèi)部數(shù)據(jù)以一種對應(yīng)規(guī)則用圖像顯示出來。將一份數(shù)據(jù)用不同的方式去展示,并且將它們放在不同的窗口視圖中,MFC 機(jī)制給出了這樣的實現(xiàn)方法:先用一個 CDocument 這樣的物件去處理數(shù)據(jù)的管理,然后用一個 CView 這樣的物件去管理視圖的顯示,這樣一來,所有不同的顯示圖像若要以某種方式反映出數(shù)據(jù)的特性,必須在數(shù)據(jù)源和眾多不同方式的圖像顯示之間有一定的關(guān)聯(lián)。對于它們的關(guān)聯(lián),MFC 機(jī)制用了一個很好的方本科生
20、畢業(yè)論文5法,就是將所有與這個數(shù)據(jù)源相關(guān)的圖像顯示都獨立用 CView 物件去表示,而當(dāng)數(shù)據(jù)源就抽象成 CDocument 物件, 而在 Document 中有這樣的一個指針列表 CPtrList 類型的日 員變量 m_viewList, 將所有這些與之關(guān)聯(lián)的視圖用鏈表串起來。而這些用于顯示不同性質(zhì)的圖像視圖類也可以通過 GetDocument()來獲取其所對應(yīng)的 Document 文檔數(shù)據(jù)。2.3 DocumentDocument 文擋操作文擋操作由于 MFC 機(jī)制設(shè)計出文檔類對象專門負(fù)責(zé)數(shù)據(jù)的 I/O 存取和數(shù)據(jù)的運(yùn)算和操作等。一般來說,數(shù)據(jù)運(yùn)算是通過 Document 類里面的擴(kuò)展功能來
21、實現(xiàn)的,這樣做可以形成一種密集數(shù)據(jù)處理,達(dá)到方便易用和管理的好處。對于一個文件而言,如果文件內(nèi)對象的排列順序是固定的,那么對于文件讀和寫從形式上只有使用的運(yùn)算符的不同。在 MFC 的文檔-視圖-框架結(jié)構(gòu)中,一個文檔的內(nèi)部對象的構(gòu)成往往是固定的,在這種情況下,寫到文件中的對象在文件中的布局也是固定的。因此 CDocument 是利用其基類 CObject 提供的 Serilize()虛函數(shù)實現(xiàn)自動文檔的讀寫操作的。 當(dāng)用戶在界面上選擇文件菜單或打開文件 (ID_FILE_OPEN)時,CWinApp 派生類的 OnFileOpenO 函數(shù)將被自動調(diào)用,它通過文檔模板創(chuàng)建或重用框架、文檔和視圖對象
22、,并最 終調(diào)用 CDocument: :OnOpenDocument()來讀文件。 當(dāng)用戶選擇菜單文件或文件保存(ID_FILE_SAVE) ,選擇文件或另存(ID_FILE_SAVEAS) 時,是通過呼叫函數(shù) CWinApp: :OnFileSave() 和 CWinApp: :OnFileSaveAs()并最終調(diào)用 CDocument: :OnSaveDocument() 實現(xiàn)的。2.4 文檔文檔- -視圖的關(guān)聯(lián)視圖的關(guān)聯(lián)視圖與文檔和窗口的關(guān)聯(lián)和協(xié)調(diào)工作可以從視圖類對象的 OnDraw() 函數(shù)開始,找出關(guān)聯(lián)的物件與關(guān)系。在 MFC 機(jī)制中,關(guān)于 DocumentNiew 架構(gòu)的項目工程和
23、 OnDrawO 函數(shù)的驅(qū)動繪圖觸發(fā)的流程 :CDocument:UpdateAIIViews()-CView:OnUpdate()- CWnd: :Invalidate()-OnPaint()-OnDraw()從流程可知當(dāng)用于裝載重要數(shù)據(jù)的 Document 類對象中的數(shù)據(jù)發(fā)生變化時,為了能讓與其關(guān)聯(lián)的各個視圖實時表現(xiàn)出數(shù)據(jù)的特征性質(zhì),需要通知所有這些關(guān)聯(lián)的視圖進(jìn)行更新重繪 , 而 Document 類對象就擁有通知所有視圖重繪的這樣的一個功能函數(shù)。對于UpdateAIIViews() 函數(shù)實現(xiàn)對各個視圖類對象對數(shù)據(jù)顯示的更新是通過文檔類內(nèi)部CPtrlist 類型的成員變量 m_viewLi
24、st 來維護(hù)和管理所有相關(guān)聯(lián)的視圖對象 , 如圖 1.1所示。 本科生畢業(yè)論文6 Document 圖 1.1 變量 m_viewList 視圖對象而對于該文檔關(guān)聯(lián)視圖的增添,與將 DocumentTemplte 文檔模板添加到模板類表一樣, 也是有相應(yīng)的處理函數(shù),對于文檔模板在模板管理列表的添加是在 App 類的 Initlnstance()里面使用 AddDocTemplate() 函數(shù)去實現(xiàn),而對于視圖在視圖列表的添加, 可以使用 Document 類對象的成員函數(shù) AddView() 去實現(xiàn)。當(dāng)與文檔類關(guān)聯(lián)的視圖類收到文檔類通過 UpdateAIIViews() 函數(shù)發(fā)出的更新重繪通知
25、后 , 會觸發(fā)視圖類的 OnUpdate() 函數(shù)的實現(xiàn)。m_viewListpView_1pView_2pView_3pView_4View_4View_3View_2View_1本科生畢業(yè)論文73 俄羅斯游戲分析和總體設(shè)計俄羅斯游戲分析和總體設(shè)計3.1 俄羅斯方塊俄羅斯方塊游戲游戲功能描述功能描述對于俄羅斯方塊游戲,其功能描述如下:游戲開始,游戲區(qū)域上方不斷地出現(xiàn)預(yù)定義形狀的下墜物件。下墜物件可以通過旋轉(zhuǎn)改變其顯示形態(tài),并且不斷地往下墜, 直到它接觸到游戲區(qū)域底部或其他之前已經(jīng)累疊起的下墜物件。當(dāng)一個下墜物件到達(dá)底部后,其位置則確定下來并占有該空間的位置區(qū)域。當(dāng)游戲區(qū)域的某一行被下墜物件完
26、全填充,則消除該行的所有下墜物,壘在其上的物件將掉下代替該行空間。游戲的結(jié)束是以下墜物件的頂部到達(dá)游戲區(qū)域頂部作為判斷依據(jù),表示裝滿溢出。并且在某一瞬間,下一個下墜物件的形態(tài)在游戲區(qū)域的右上方有預(yù)先提示,同時每抵消一行空間積分自增 100。3.2 游戲游戲規(guī)則規(guī)則分析分析首先,在游戲開始后檢查當(dāng)前的下墜物是否已經(jīng)到了底部,如果不是的話就將下墜物到了該定時器間隔的時間后整體往下移動一個單位,否則,進(jìn)行到達(dá)底部后的操作。對于到達(dá)底部后的操作,可以分成以下幾個步驟來處理。(1)先對進(jìn)行到底部后的所有可以抵消的行進(jìn)行銷行處理。(2)生成一個新的“下一個下墜物”,這個下墜物的形態(tài)需要隨機(jī)地生成。(3)在
27、將舊的“下一個下墜物”置換成新的下一個下墜物,并在屏幕右上方顯示。(4)將當(dāng)前的“下墜物”換成以前產(chǎn)生的舊的“下一個下墜物”,并且馬上使用。由于在這個過程中已經(jīng)重新使用了一個新的下墜物件,在剛使用時并且還沒有下降前,應(yīng)該判斷它是否已經(jīng)不可以下降到底部(也就是說,在方塊己經(jīng)堆砌到接近游戲區(qū)域頂部的時候,下墜物件一旦被使用,就已經(jīng)到達(dá)了底部),如果是剛好到達(dá)底部則實行銷行檢測和操作, 并且判斷頂部(第一行)的某些區(qū)域是否已經(jīng)被占用了,是則表示游戲已經(jīng)觸發(fā)結(jié)束的標(biāo)志時間,應(yīng)該進(jìn)入游戲結(jié)束狀態(tài)。(5)在前面判斷為到達(dá)底部后,進(jìn)行銷行檢測與操作。(6)在下墜物到達(dá)底部的同時,判斷是否已經(jīng)到達(dá)了游戲的頂部
28、,是則表示游戲結(jié)束,進(jìn)行游戲結(jié)束的資源釋放與數(shù)據(jù)環(huán)境清理工作整個流程如圖 1.2 所示。本科生畢業(yè)論文8開始到達(dá)低部1.銷行操作2.生成新的“下一個下墜物”3.將新生的下墜物代替舊的“下一個下墜物”4.將舊的“下一個下墜物”用作當(dāng)前下墜物5.銷行操作6.游戲結(jié)束處理到達(dá)頂部,游戲結(jié)束結(jié)束到達(dá)低部7.下降一個單位本科生畢業(yè)論文9 圖 1.2 流程圖4 俄羅斯方塊游戲的實現(xiàn)俄羅斯方塊游戲的實現(xiàn)俄羅斯方塊游戲設(shè)計的實現(xiàn),主要包括游戲核心數(shù)據(jù)的抽象與設(shè)計、操作方法的抽象與設(shè)計、及流程的設(shè)計與實現(xiàn)等。下面將對這幾個部分作具體的設(shè)計。4.1 游戲游戲核心數(shù)據(jù)的抽象與設(shè)計核心數(shù)據(jù)的抽象與設(shè)計在抽象出方法和屬
29、性前,先來分析一下整個游戲的具體實現(xiàn)。首先 , 游戲有開始、暫停、結(jié)束等操作接口,而在游戲過程中,隨著用戶的按鍵交互,會出現(xiàn)方塊的形態(tài)變化、方塊快速下墜、安放該下墜物件、銷毀填滿的行、產(chǎn)生下一將要出現(xiàn)的方塊等功能。這里,先分析游戲的特點,把整個游戲的核心數(shù)據(jù)結(jié)構(gòu)提取出來,再根據(jù)數(shù)據(jù)結(jié)構(gòu)的特點提取出核心功能模塊的關(guān)聯(lián),然后對這些功能一一進(jìn)行細(xì)化,從而完成整個游戲的設(shè)計。下面就來分析整個游戲的整體狀況,如圖 1.3 所示。 圖 1.3 游戲內(nèi)部方塊從如圖 1.3 所示可以看到,游戲區(qū)域可以看作是由許多個等面積的小方塊構(gòu)成的大面積區(qū)域。而這些區(qū)域的狀態(tài)只有 2 種,被下墜物占據(jù)和空閑(沒有被下墜物占
30、據(jù)),因此,對于整個游戲區(qū)域的數(shù)據(jù),用一塊空間來標(biāo)識即可。其狀態(tài)只有兩種:被占據(jù) 1 和空閑 0。這塊空間的分配,可以采用動態(tài)分配的方式或者靜態(tài)分配的方式去實現(xiàn),至于數(shù)據(jù)結(jié)構(gòu)的選擇,可以是鏈表、隊列或者數(shù)組等,我這里選擇靜態(tài)分配并劃分一個足夠大的二維數(shù)組的方式來實現(xiàn),如下所示。/in file:skyblue_RectView.h#define MAX_ROW 100 /地圖的最大行數(shù)#define MAX_COL 100 /地圖的最大列數(shù)/in file:skyblue_RectView.h class:Cskyblue_RectView/內(nèi)部存取數(shù)據(jù)結(jié)構(gòu)int m_stateMapMAX_
31、ROWMAX_COL本科生畢業(yè)論文10從上述代碼可以看到,在視圖類對象里面分配了一個存儲游戲區(qū)域地圖狀態(tài)的二維數(shù)組 ID_stateMap 成員變量,并定義其最大行數(shù)和列數(shù)都為 100(當(dāng)然,實際可能并不需要那么大,只是先分配好足夠的地圖空間以供使用而已)。同時,還應(yīng)該預(yù)先定義該區(qū)域的兩種狀態(tài)值:#define MAP_state_empty 0 /空(未被占據(jù))#define MAP_state_not_empty 1 /被占據(jù)整個游戲區(qū)域的地圖設(shè)計好后,再來看看具體的下墜物,通過分析它們的特性,還可以抽象出一些物件來。在每個下墜物在下墜的過程中,總是占有地圖中的某一塊區(qū)域,那么怎樣表達(dá)這些
32、下墜物的形態(tài)和它們占有的位置關(guān)系呢?在此,先來看看它們的基本類型,然后進(jìn)行歸納分析,其基本類型如圖 1.4 所示。 圖 1.4 方塊基本類型從圖 1.4 可以看到,這些下墜物的形狀一共有 7 種,對于這些形態(tài)各異的下墜物間存在一個最基本的共性,就是它們占有的位置空間是一樣的,都是 4 個小方塊區(qū)域。對于它們在某一瞬間的位置標(biāo)識,我們可以采用一個 4x2 的小數(shù)組標(biāo)識出來,如圖 1.5 所示。 圖 1.5 方塊位置標(biāo)識 也就是說,用 4 個存儲單位空間存儲當(dāng)前下墜物的每一子塊的位置來對整 個下墜物件的位置進(jìn)行標(biāo)識,而每個存儲空間的大小就是一個點的坐標(biāo)值(x,y),于是就有如下定義。 /in fi
33、le : skyblue_Rectciew.h /用于保存當(dāng)前方塊的動態(tài)位置,4 個小方塊分別在大數(shù)組中的存放位置為先左后右, /每一列又遵循先上后下的原則 Int ActiveStatus42; /存入下一個要出現(xiàn)的方塊形狀的數(shù)組 Int NextStatus42; 本科生畢業(yè)論文11在上述代碼中,分配了一個整型的二維數(shù)組 ActiceStatus來存儲每個下墜物的 4 個子方塊的坐標(biāo)位置,其實在游戲過程中,變動的下墜物件除了當(dāng)前用戶正在操控的下墜物件外,項目程序的右上方還需要顯示出下一個下墜物件的形狀。也就是說,在游戲過程中的某一瞬間,除了需要記錄當(dāng)前用戶正在控制的下墜物狀態(tài)外,還需要記錄
34、預(yù)先隨機(jī)生產(chǎn)出來的下墜物件狀態(tài),于是代碼中多了一個 NextStatus數(shù)組成員變量,用以存儲下墜物的形態(tài)。還有一個問題沒有解決,這些形狀各異的下墜物件,雖然都是由 4 個小方塊構(gòu)成,但是對于它們的編號還沒有一定的規(guī)律,因此需要人為地定下一些規(guī)則,而這個規(guī)則就是:編號從下墜物的左邊起往右編排,而在同一列的方塊中,則從上往下的順序開始編號它們的對應(yīng)關(guān)系如圖 1.6 所示。圖 1.6 方塊類型對應(yīng)位置標(biāo)識如圖 1.6 所示的兩個不同的下墜物,每個方塊按照從左到右的方式進(jìn)行編號,并且在編號過程中對于同一列的方塊實行從上到下進(jìn)行編號,而該方塊所在游戲區(qū)域的位置坐標(biāo) 則 存儲在下標(biāo)與編號所對應(yīng)的 Act
35、iceStatus二維數(shù)組的每個單位里面,如: ActiceStatus00 和 ActiceStatus01則是第 0 號方塊的橫坐標(biāo) X 和縱坐標(biāo)Y。 ActiceStatus20 和 ActiceStatus21則是第 2 號方塊的橫坐標(biāo) X 和縱坐標(biāo) Y。至此,可以實現(xiàn)下墜物件的位置標(biāo)識了,那么對于某一下墜物的形態(tài)特性又怎么標(biāo)識呢?可以使用這樣的方法:用一個宏去標(biāo)識 ,第 1 位的數(shù)值變化范圍為 17,用于標(biāo)識下墜物的種類(7 種),第 2 位標(biāo)識該種類下墜物的不同形態(tài),不同的下墜物,如“田”字形的下墜物只有 1 種形態(tài),所以沒有第 2 位,其他的不同形態(tài)則從 14(最多有 4 種形態(tài)
36、)按順序標(biāo)識即可,如第 2 種下墜物的第 3 種形態(tài),其宏標(biāo)識為 23,如圖 1.7 所示。01232031本科生畢業(yè)論文12下墜物編號:4狀態(tài)編號: 1 2 3 4 形狀宏標(biāo)識 41 42 43 44圖 1.7 方塊變形表示4.2 操作方法的抽象與設(shè)計操作方法的抽象與設(shè)計 當(dāng)完成整個游戲的基本核心數(shù)據(jù)的表達(dá)并進(jìn)行抽象與設(shè)計后,接下來,就可以根據(jù)游戲的特性對核心的基本操作方法進(jìn)行抽象,進(jìn)而實現(xiàn)這些功能。下面將著重分析游戲過程中的實現(xiàn)細(xì)節(jié),以便抽象出基本的操作功能。首先是游戲開始,應(yīng)該有個事件觸發(fā)游戲的開始,譬如菜單欄選項等,相應(yīng)地,也可以 類推出游戲暫停與游戲結(jié)束等操作功能。游戲開始后,產(chǎn)生一
37、個下墜物件,并且在右上角生成下墜物件的基本形態(tài),因此有隨機(jī)物件產(chǎn)生這個操作。在游戲過程中,方塊會自動隨著時間的推移而向下移動,因此有向下移動的操作。在游戲過程中,用戶可以通過按鍵對下墜物的功能進(jìn)行操作,如變形操作、加速下降操作、向左移動操作、向右移動操作等。上面說到的幾點大多是從與用戶交互的角度去觀察分析的,而從游戲的規(guī)則方面,也可以作一下分析,當(dāng)下墜物響應(yīng)用戶的指示向左或向右移動的時候,需要判斷該不墜物件是否已經(jīng)到這了游戲區(qū)域的邊界而無法向左或著向右移動:當(dāng)下墜物的形態(tài)改變的時候,需要計算出應(yīng)該改變成何種形態(tài): 當(dāng)下墜物向下移動的時候,需要判斷是否已經(jīng)到達(dá)了底部等。先虛擬出該俄羅斯方塊游戲的
38、類對象,并抽象出核心的數(shù)據(jù)屬性和操作方法等,然后再作細(xì),最后將整個虛擬類的外殼脫掉,再移植到視圖類中去,其實現(xiàn)如下所示。CRectGameView: public cview /內(nèi)部存取數(shù)據(jù)結(jié)構(gòu) Int m_stateMapMAX_ROWMAX_COL; /用于保存當(dāng)前方塊的動態(tài)位置,4 個小方塊分別在大數(shù)組中的存取位置為先左后/右,每一列又遵循先上后下的原則Int Activestatus42; 本科生畢業(yè)論文13/存入下一個要出現(xiàn)的方塊形狀的數(shù)組Int Nextstatus42; /初始化操作GameInitnal(); /游戲的初始化/用于判斷數(shù)據(jù)相關(guān)狀態(tài)的操作IsLeftLimit()
39、; /下墜物體是否可向左移動IsRightLitmit(); /下墜物體是否可向右移動IsBottom(); /是否已經(jīng)到達(dá)底部IsGameEnd(); /是否游戲已經(jīng)結(jié)束/方塊物體下墜過程中的操作RectChange(); /下墜物體變形RectDown(); /下墜物體正常下落RectArrow(); /下墜物體方向移動(左,右,下加速)/狀態(tài)控制操作GameStart(); /游戲開始GamePause(); /游戲暫停GameEnd(); /游戲結(jié)束通過上面的代碼可以看出,在虛擬類中抽象出了核心的內(nèi)部數(shù)據(jù)和一些基本的操作函數(shù)。對于操作函數(shù),可以把它們分成內(nèi)部實現(xiàn)的基本核心操(如判斷操作
40、)以及明顯提供給外部使用的整體模塊外部操作(如狀態(tài)控制操作)。而內(nèi)部的基本操作又可以分成判斷操作和執(zhí)行操作這樣兩種類型。這里將上面涉及到的操作整理成表,如表 4-1 所示。表 4-1 操作函數(shù)及功能描述 屬性和操作 功能描述外部操作外部操作狀態(tài)控制操作組GameStart()游戲進(jìn)入開始狀態(tài),進(jìn)行相關(guān)數(shù)據(jù)的初始化以及關(guān)聯(lián)操作GamePause()游戲進(jìn)入暫停狀態(tài),進(jìn)行數(shù)據(jù)的保持與其他關(guān)聯(lián)的操作GameEnd()游戲進(jìn)入結(jié)束狀態(tài),進(jìn)行數(shù)據(jù)的清除以及資源的銷毀和釋放操作內(nèi)部基本核心操作內(nèi)部基本核心操作判斷操作組IsLeftLimit()向左偏移前,判斷該下墜物件是否已經(jīng)到達(dá)了游戲區(qū)域的最左邊界(不
41、可以再左移IsRightLitmit()向右偏移前,判斷該下墜物件是否已經(jīng)到達(dá)了游戲區(qū)域的最右邊界(不可以再右移)IsBottom()向下偏移加速或者下墜物件自動向下偏移前,判斷是否已經(jīng)到達(dá)了底部(這里對底部定義是游戲區(qū)域底部或下面有其他下墜物)IsGameEnd()判斷下墜物是否到達(dá)了游戲區(qū)域頂部而應(yīng)該結(jié)束游戲本科生畢業(yè)論文14執(zhí)行操作組RectChange()下墜物件的狀態(tài)變形,方法為在原來的狀態(tài)下逆時針旋轉(zhuǎn) 90 度RectDown()該下墜物件的 4 個小方塊所有坐標(biāo)位置向下偏移一個單位RectArrow()直接響應(yīng)用戶按鍵,向左或者向右或者向下偏移一個單位其他操作其他操作Gameln
42、itnal()游戲的初始化操作 4.3 流程的設(shè)計流程的設(shè)計與實現(xiàn)與實現(xiàn)流程的設(shè)計分正常流程設(shè)計和中斷流程設(shè)計。下面對這兩部分做具體的設(shè)計和實現(xiàn)。4.3.1 正常流程的設(shè)計正常流程的設(shè)計對于正常流程的實現(xiàn)是由定時器驅(qū)動的,也就是說,當(dāng)預(yù)定的時間間隔到達(dá)后就執(zhí)行這樣的一個工作流程,所以必須先設(shè)置一個定時器機(jī)制,下面來對增加一個定時器進(jìn)行實現(xiàn)。從分析游戲的特性可以知道,定時器的產(chǎn)生與生效應(yīng)該在游戲開始的時候,而在游戲暫 停或者游戲結(jié)束時則將已經(jīng)設(shè)定的定時器失效/銷亡(對于暫停的情況,使它銷亡,當(dāng)游戲從 暫停狀態(tài)又進(jìn)入游戲狀態(tài)的時候,則重新創(chuàng)建一個定時器并激活它的運(yùn)作),所以分別在游戲的開始函數(shù)、暫
43、停函數(shù)以及結(jié)束函數(shù)中實現(xiàn)定時器的激活與去激活工作。這里,先在資源編輯器菜單資源里面添加 3 個菜單選項,分別是游戲的“開始”、“暫停”和“結(jié)束”(由于這 3 個功能是外部給用戶操作的功能,所以可以預(yù)先在菜單欄中添加相應(yīng)的功能選項,然后在視圖類中實現(xiàn)它們即可,當(dāng)它們找到直接關(guān)聯(lián)的物件后對虛擬類的功能操作預(yù)先脫殼), 然后利用 ClassWizard 直接在視圖類對象 Cskyblue_RectView 中為它們添加空白的處理函數(shù) , 具體如表 4-2 所示。表 4-2 菜單選項功能對應(yīng)表菜單選項名稱快捷鍵資源 ID晌應(yīng)處理函數(shù)開始游戲&S.ID GAME_STARTOnGameStart
44、()暫停游戲&P.ID GAME_PAUSHOnGamePaush()結(jié)束游戲&E.ID GAME_ENDOnGameEnd()現(xiàn)在,就可以在上面的 3 個空白的函數(shù)中添加定時器了,其具體實現(xiàn)如下所示。/in file:skyblue_Rectview.cpp/游戲開始void Cskyblue_Rectview:ongamestart() m_bGamepaush=FALSE;SetTimer(1、1500-250*m_iLevel、Nulll);/游戲暫停void Cskyblue_RectView:onGamePaush()本科生畢業(yè)論文15 m_bGamepaush=T
45、RUE; killTimer(1);/游戲結(jié)束void Cskyblue_RectView:onGameEnd() m_bGameEnd=TRUE; m_bGamepaush= FALSE; /清除游戲暫停狀態(tài) killTimer(1);從上面的 3 個函數(shù)代碼中可以看到,在添加這 3 個函數(shù)時,視圖類還添加了涉及到游戲狀態(tài)的 3 個成員變量,它們分別是用作判定當(dāng)前游戲等級的 m_iLevel、記錄游戲狀態(tài)的m_bGamePaush(是否暫停)和 m_bGameEnd(是否結(jié)束游戲),它們在視圖類中的定義如下所示。/in file:skyblue_Rectview.h class: CSsky
46、blue_Rectview/當(dāng)前的級別,換算成速度的算法為:1500-m_iLevel*200int m_iLevel;/游戲是否已經(jīng)結(jié)束或者暫停BooL m_bGameEnd;BooL m_bGamePaush;其中 m_iLevel 變量是標(biāo)識當(dāng)前游戲的等級,隨著游戲等級的升高,定時器的固定時間間隔會逐漸變短,從而達(dá)到加快下降速度的效果。4.3.2 正常流程的實現(xiàn)正常流程的實現(xiàn)( (定時處理定時處理) )經(jīng)過定時器的設(shè)置后,就可以在定時器預(yù)定時間到達(dá)后對正常流程進(jìn)行實現(xiàn)了。這里通 過利用 ClassWizard 跳到定時器到時后的處理函數(shù) OnTimerO 去實現(xiàn),其清單如下所示。/int
47、 file:skyblue_Rectview.cpp void CSkyblue_RectView:OnTimer(UINT nIDEvent) /如果原來的方塊已到底或游戲剛開始,則掉下一個新的方塊int i,j,k;if (m_isBottom)/1.產(chǎn)生下一個隨機(jī)下墜物m_icurrentStatus = m_inextStatus;m_inextStatus = Random(7); /得到下一次的方塊樣式本科生畢業(yè)論文16/ if (m_inextStatus=0) m_inextStatus+;/2.修改新的“下一下墜物”RectStatusToNextStatus( m_inex
48、tStatus );/ CRect rect(m_iStartY+320, m_iStartX, m_iStartY+440, m_iStartX+160);/ InvalidateRect(&rect);/ Invalidate(FALSE);/3.將舊的“下一下墜物”用作當(dāng)前使用m_currentRect = m_icurrentStatus; /根據(jù)當(dāng)前下墜物的形狀去初始化激活狀態(tài)下的下墜物坐標(biāo)RectStatusToActiveStatus( m_icurrentStatus );/將當(dāng)前動態(tài)數(shù)組中的數(shù)據(jù)反映到大數(shù)組中ActiveStatusToGameStatus();m_i
49、sBottom = FALSE;/4.判斷當(dāng)前方塊是否已到底IsBottom(); /5.判斷游戲是否已結(jié)束: 碰了底,且第 1 行有小方塊if (m_isBottom)for (i=0;im_iCol;i+)if (GameStatus0i)KillTimer(1);AfxMessageBox(游戲已結(jié)束!);for (j=0;jm_iRow;j+)for (k=0;k SelectObject(m_pBlackBrush);CRect rect;GetClientRect(&rect);pDC - Rectangle(rect);/選用灰色畫刷,繪制游戲區(qū)域的背景pDC - Sel
50、ectObject(m_pGrayBrush);pDC - Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);pDC-SelectObject(m_pBlackPen);/畫網(wǎng)格線if (m_bDrawGrid)/畫橫線for (i=0;iMoveTo(m_iStartY, m_iStartX + i*m_iLarge);pDC-LineTo(m_iStartY+300, m_iStartX +i*m_iLarge);/畫豎線for (i=0;iMoveTo(m_iStartY+i*m_iLarge, m_iSt
51、artX);pDC-LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);int x,y,nW,nH;/小方塊的繪制for (i=0;im_iRow;i+)for (j=0;jBitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);本科生畢業(yè)論文25/顯示游戲區(qū)域及游戲級別的漢字描述if (!m_bGameEnd)pDC - SetBkColor(BLACK);pDC - SetTextColor(WHITE);pDC - TextOut(m_iStartY+320, m_iStartX+22
52、0, 游戲區(qū)域大小:);pDC - TextOut(m_iStartY+320, m_iStartX+240,m_strArea);pDC - TextOut(m_iStartY+320, m_iStartX+280, 游戲級別:);pDC - TextOut(m_iStartY+320, m_iStartX+300,m_strLevel);/顯示總分if (!m_bGameEnd)CString lsStr;lsStr.Format(總分為:%d 分,m_iPerformance);pDC - SetBkColor(BLACK);pDC - SetTextColor(WHITE);pDC -
53、 TextOut(m_iStartY+320, m_iStartX+180,lsStr);/畫下一次將要出現(xiàn)的方塊,用于提示用戶if (!m_bGameEnd)pDC - SetBkColor(BLACK);pDC - SetTextColor(WHITE);pDC - TextOut(m_iStartY+320, m_iStartX,下一個方塊:);int x,y,nW,nH;for (UINT k=0;kBitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);本科生畢業(yè)論文26從上述代碼可以看到,這里并不是先將各個部分的圖
54、像所在的位置先計算出來, 然后在相應(yīng)的位置繪制適當(dāng)?shù)膱D像,而是采用類似于平常的手工作畫方式,首先是將整個畫布畫上背景色,接著繪制游戲區(qū)域的背景色(將原來整個畫布的背景覆蓋掉),然后在游戲區(qū)域中將位置為被占用狀態(tài)的區(qū)域繪制成小方塊圖樣,并將原先繪制好的游戲區(qū)域背景色覆蓋掉。一般來說,使用這種方式去實現(xiàn)繪制, 效率比先逐個計算出每個位置區(qū)域應(yīng)當(dāng)顯示的圖樣,然后再一次性地繪制的方式要高,因為這樣做不必花費太多的時 間在計算方面。在繪制之前,分別通過黑色畫刷 m_pBlackBrush 以及灰色畫刷 m_pGrayBrush, 對窗口區(qū)域背景以及游戲區(qū)域背景進(jìn)行繪制,并且選擇黑色畫筆 m_pBlack
55、Pen 對網(wǎng)格進(jìn)行繪制。對于這些畫刷和畫筆的使用,也要預(yù)先準(zhǔn)備好,所以在繪圖資源初始化和釋放函數(shù)中,也要添加它們的創(chuàng)建和釋放。至此,就完成了俄羅斯游戲的全部基本功能,效果如圖 1.11 所示。 圖 1.11 游戲界面本科生畢業(yè)論文275. .功能的完善功能的完善完成游戲的功能后,為了使得游戲功能更加健全,還需要對它進(jìn)行一些完善,下面是附加功能描述的列表,如表 5-1 所示。表 5-1 附加功能描述列表功能名稱選項其他描述游戲等級選擇初級頂級對游戲快慢難度的設(shè)定方塊圖案樣式選擇深藍(lán)條紋對下墜物的小方塊圖案樣式選擇游戲區(qū)域大小選擇小、中、大對游戲區(qū)域的行列數(shù)選擇網(wǎng)格的選用有、無是否需要在游戲區(qū)域繪
56、制網(wǎng)格背景音樂的選用有、無在游戲過程中是否播放背景音樂有了上面的目標(biāo)功能定義后,這里先將這些目標(biāo)功能通過資源編輯器在主菜單條進(jìn)行添加,將前面已有的菜單選項補(bǔ)全,再通過 Class Wizard 添加對應(yīng)的響應(yīng)處理函數(shù),其詳細(xì)信息如表 5-2 所示。表 5-2 菜單選項功能對應(yīng)表菜單選項名稱快捷鍵資源 ID晌應(yīng)處理函數(shù)基本選項組(&G)開始游戲&S.ID GAME STARTOnGameStart 0暫停游戲&P.ID GAME PAUSHOnGarnePaush 0結(jié)束游戲&E.ID GAME ENDOnGarneEnd 0游戲等級選擇(&L)本科生畢業(yè)
57、論文28第一級:入門級&1.ID OPTION LEVEL 1OnOptionLeve110第二級:初級&2.ID OPTION LEVEL 2OnOptionLeve120第=級:中級&3.ID OPTION LEVEL 3OnOptionLeve130第四級:中高級&4.ID OPTION LEVEL 4OnOptionLeve140第五級:高級&5.ID OPTION LEVEL 5OnOptionLeve150第六級:頂級&6.ID OPTION LEVEL 6OnOptionLeve160區(qū)域大小選擇(&A)小: 12 行10
58、列&1.ID OPTION AREAlOnOptionArea 10中: 18 行15 列&2.ID OPTION AREA2OnOptionArea 10大: 24 行20 列&3.ID OPTION AREA3OnOptionArea 10其他網(wǎng)格&G.ID OPTION GRlDOnOptionGridO音樂&M.ID OPTION MUSICOnOption 如1usicO對于上面眾多參數(shù)選項的實現(xiàn),只需要在它們的處理函數(shù)中對相應(yīng)的參數(shù)進(jìn)行適當(dāng)?shù)匦薷募纯? 通常對于功能的完善,多是將原來設(shè)定的固定值拓展成可修改的成員變量,而對這些成員變量的修改則
59、通過函數(shù)接口去實現(xiàn)。關(guān)于背景音樂的播放,這里將選用一種比較高級的音頻播放控制機(jī)制 MCI(媒體控制接口)去實現(xiàn). MCI 具有更強(qiáng)大的功能。正因為它有強(qiáng)大的功能,故 MCI 的操作和使用也會相應(yīng)地復(fù)雜些,MCI 向 Windows 程序提供了在高層次上控制媒體設(shè)備接口的能力。程序不必關(guān)心具體設(shè)備,就可以對 CD 機(jī)、視盤機(jī)、波形音頻設(shè)備、視頻播放設(shè)備和 MIDI 設(shè)備等媒體設(shè)備進(jìn)行控漚制。現(xiàn)在常見的 au、mp3、Mpeg4 格式的文件,都可以通過 MCI 去控制并實現(xiàn)播放或錄制。可以把 MCI 理解為設(shè)備面板上的一排按鍵,通過選擇不同的按鍵(發(fā)送不同的 MCI 命令)讓設(shè)備完成各種功能, 而
60、不必關(guān)心設(shè)備內(nèi)部的實現(xiàn)。5.1 游戲背景音樂的實現(xiàn)游戲背景音樂的實現(xiàn)本科生畢業(yè)論文29游戲背景音樂采用 MCI 機(jī)制方式實現(xiàn)音樂的播放。在 CSkyblue_RectView 視圖類添加兩個成員函數(shù) playmid()和 stopmid(),分別實現(xiàn)對指定的背景音樂的播放以及停止播放功能,其具體實現(xiàn)如下所示。/in file:skyblue_rectview.cpp/播放背景音樂,所有錯誤忽略/void CSkyblue_RectView:PlayMid()HWND hWnd;hWnd = GetSafeHwnd();/分配命令字符串緩沖,錯誤信息儲存緩沖,播放的文件名char szCmdBuf300,errBuf60,szfileName255;/錯誤碼MCIERROR mciError;/初始化設(shè)備元素strcpy(szfileName,skyblue_rect.mid);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專科醫(yī)院人才流動與薪酬體系分析
- 修車設(shè)備租借合同標(biāo)準(zhǔn)文本
- 醫(yī)療數(shù)據(jù)挖掘驅(qū)動醫(yī)療行業(yè)變革的力量
- 上海導(dǎo)游合同范例
- H型高血壓的臨床護(hù)理
- 上有貸款合同范例
- 曼特波隆鼻的臨床護(hù)理
- 小兒眼科健康教育課件
- 小隱靜脈曲張的臨床護(hù)理
- 醫(yī)療行業(yè)的職業(yè)道德與患者隱私保護(hù)的融合
- 2023北京順義區(qū)招錄鄉(xiāng)村振興協(xié)理員及考察筆試歷年典型考題及考點剖析附答案帶詳解
- 跟著音樂游中國智慧樹知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 傳統(tǒng)文化醒獅模板
- 教科版四年級上冊科學(xué)第一單元《聲音》測試卷附答案(精練)
- (高清版)JTGT D81-2017 公路交通安全設(shè)施設(shè)計細(xì)則
- QC/T 629-2021 汽車遮陽板-PDF解密
- FZT 64056-2015 潔凈室用擦拭布
- 小學(xué)數(shù)學(xué)五年級下冊通分練習(xí)100題附答案
- 混凝土強(qiáng)度評定表(自動計算)
- 人音版四年級音樂下冊全冊教學(xué)設(shè)計教案表格式
- 心臟體格檢查教案
評論
0/150
提交評論