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

正文內(nèi)容

基于visualc實(shí)現(xiàn)的單機(jī)版俄羅斯方塊游戲的設(shè)計(jì)-----畢業(yè)論文(參考版)

2024-11-11 20:21本頁(yè)面
  

【正文】 (2)繪圖資源的釋放 對(duì)于資源 ,可以在需要的時(shí)候通過(guò)申請(qǐng)方式去獲取 ,而系統(tǒng)的處理機(jī)。對(duì)于用作屏幕映射的設(shè)備環(huán)境 ,先聲明它與屏幕設(shè)備環(huán)境兼容 ,然后將它與已經(jīng)初始化好跟屏幕兼容并且大小為游戲窗口尺寸的內(nèi)存位圖 m_memBmp 關(guān)聯(lián)起來(lái) ,以便可以操作 m_memRectDC 設(shè)備環(huán)境并在上面作畫(huà)。 函數(shù)體分別對(duì)用于屏幕映射的繪圖資源和用于位圖映射的繪圖資源進(jìn)行初始化。 //相當(dāng)于將外部位圖 動(dòng)態(tài)載入 m_hMemRectBmp 中 m_hMemRectBmp=(HBITMAP)LoadImage(NULL,IMAGE_BITMAP,150,30,LR_LOADFROMFILE)。m_memBmp)。 //內(nèi)存位圖與與屏幕關(guān)聯(lián) (兼容 ),大小為游戲窗口的尺寸 (pWindowDC,m_nWidth,m_nHeight)。 m_nHeight = ()。windowRect)。 // //獲取游戲窗口的大小用于下面設(shè)置內(nèi)存位圖的尺寸 CRect windowRect。 //in file: // //繪圖設(shè)備環(huán)境的初始化 // void CSkyblue_RectView::DcEnvInitial(void) { if(m_bFistPlay) { m_bFistPlay = FALSE。 //方塊內(nèi)存設(shè)備環(huán)境 HBITMAP m_hMemRectBmp。 //內(nèi)存設(shè)備環(huán)境 CBitmap m_memBmp。具體實(shí)現(xiàn)如下 :首先在視圖類(lèi)對(duì)象 CSkyblue _ RectView 中分別為位圖資源本科生畢業(yè)論文 22 新添與其對(duì)應(yīng)的內(nèi)存設(shè)備環(huán)境和內(nèi)存位圖資源 ,并為屏幕繪圖添加與其對(duì)應(yīng)的內(nèi)存設(shè)備環(huán)境和內(nèi)存位圖資源。 繪圖環(huán)境資源的初始化和釋放 (1)繪圖資源的初始化 從前面的分析中可以看出 ,游戲視圖是通過(guò)將內(nèi)存設(shè)備環(huán)境中關(guān)聯(lián)的內(nèi)存位圖從映射拷貝到屏幕上這樣的方法 來(lái)實(shí)現(xiàn)的 ,因此 ,在使用這兩個(gè)內(nèi)存位圖之前 ,需要在游戲開(kāi)始之前對(duì)它們進(jìn)行初始化屏幕的顯示 ,并且在退出游戲運(yùn)行程序之前 ,將這些關(guān)聯(lián)的資源進(jìn)行釋放。 (2)根據(jù)游戲區(qū)域中的二維數(shù)組 GameStatus[MAX_ROW] [MAX _ COL]中的內(nèi)部數(shù)據(jù) ,將所有數(shù)據(jù)狀態(tài)中為被占用狀態(tài) MAP_STATE_NOT_EMPTY 的小方塊區(qū)域用當(dāng)前指定的小方塊圖樣類(lèi)型來(lái)填充 (從裝載位圖的內(nèi)存位圖中選取 ),這樣就可以在與屏幕關(guān)聯(lián)的內(nèi)存設(shè)備環(huán)境中先將整個(gè)游戲區(qū)域的圖像繪制好。當(dāng)然 ,以上的這兩個(gè)內(nèi)存位圖的存儲(chǔ)大小應(yīng)該和它們分別映射的物件數(shù)據(jù)的大小完全一樣。由于這個(gè) 游戲區(qū)域的地圖數(shù)據(jù)比較簡(jiǎn)單 ,每個(gè)方塊只有占用和空閑兩種狀態(tài) ,而對(duì)這兩種狀態(tài)的表達(dá) 也相當(dāng)簡(jiǎn)單 ,對(duì)于被占用的區(qū)域 ,只需顯示當(dāng)前某選定的方塊類(lèi)型 圖樣 :對(duì)于空閑狀態(tài) ,則 不用繪制 ,填充默認(rèn)的背景色即可 繪圖機(jī)制設(shè)計(jì) 下面將位圖中的方塊圖樣繪制到屏幕上 , 其繪圖機(jī)制如圖 所示 位圖資源 內(nèi)存游戲區(qū)域設(shè)備環(huán)境 屏幕游戲區(qū)域設(shè)備環(huán)境 圖 繪圖機(jī)制圖 如圖 所示 ,對(duì)于屏幕中游戲區(qū)域的繪制 ,是通過(guò)內(nèi)存設(shè)備環(huán)境的區(qū)域映射來(lái)實(shí)現(xiàn)的。其文件名為 ,將其放在 工程項(xiàng)目的根目錄下,以供動(dòng)態(tài)調(diào)入。 位圖資源的準(zhǔn)備 由于做的是 3D效果的俄羅斯方塊 ,所以需要提供多個(gè)位圖圖樣以供選擇。接下來(lái),要將游戲區(qū)域中的數(shù)據(jù)映射到屏幕上。上面的這些參數(shù),在類(lèi)定義文件的頂部需要添加對(duì)運(yùn)動(dòng)方向趨勢(shì)的定義。 } 該函數(shù)體只對(duì)某些按鍵功能進(jìn)行截獲與響應(yīng),它們對(duì)應(yīng)不同的功能模塊,分別是向左移動(dòng)的左鍵 VK_LEFT,向右移動(dòng)的右鍵 VK_DOWN,變形的向上鍵 VK_UP。 break。 break。 break。 break。 關(guān)于按鍵命令消息的響應(yīng),可以通過(guò)對(duì) WM_KEYDOWN 消息的處理函數(shù)進(jìn)行截獲并重寫(xiě)來(lái)實(shí)現(xiàn),對(duì)于這個(gè)消息處理函數(shù)的添加,可以在視圖類(lèi) Cskyblue_RectView 中通過(guò)添加ClassWizard 進(jìn)行實(shí)現(xiàn),下面是對(duì)該處理函數(shù) OnkeyDonw()的重寫(xiě)。 中斷操作流程的實(shí)現(xiàn) 在對(duì)正常游戲流程實(shí)現(xiàn)后,接下來(lái)將進(jìn)行用戶按鍵中斷流程的實(shí)現(xiàn)。具體功能模塊操作的實(shí)現(xiàn) (包括左移、右移、變形、加速下降等 )。對(duì)按鍵的鍵值進(jìn)行判斷 ,構(gòu)建一個(gè)大的邏輯分析流程 ,并對(duì)相應(yīng)按鍵的功能模塊進(jìn)行操作。接 收到用戶功能按鍵后分析傳入的參數(shù) ,并解釋出該功能按鍵的鍵值。下面對(duì)流程簡(jiǎn)要描述一下。其實(shí) ,用戶的按鍵指示操作是根據(jù)功能按鍵的不同 ,去響應(yīng)不同的操作 ,其流程如圖 所示。 那么 ,當(dāng) “ 中斷 ” 指示命令觸發(fā)的時(shí)候 ,如果正在處理定時(shí)器到達(dá)的正常流程工作 ,該怎 么辦 ?很簡(jiǎn)單 ,因?yàn)槌绦虻墓ぷ髂J皆O(shè)計(jì)的是單線程 ,當(dāng)以上情況發(fā)生的時(shí)候 ,就會(huì)先處理前面正在執(zhí)行的工作 ,再執(zhí)行后者觸發(fā)的工作。而在這條時(shí)間軸上 ,由于用戶需要對(duì)當(dāng)前下墜物進(jìn)行操作 ,因此需要做沒(méi)有特定規(guī)律的按鍵指示操作 ,這些操作可以看作是插入在一些時(shí)間片中的 “ 中斷 ” 操作 ,它們的插入是隨機(jī)的 ,是由用戶控制的 ,所以它們?cè)跁r(shí)間軸上的分布是不規(guī)則的。 圖 正常和中斷的操作關(guān)系 從圖 可看到 ,整個(gè)游戲開(kāi)始后的運(yùn)行過(guò)程中分成了很多個(gè)問(wèn)隔相等的時(shí)間片 ,而每經(jīng)過(guò)一個(gè)時(shí)間片后 ,就會(huì)觸發(fā)一個(gè)定時(shí)的操作。而這些操作都是響應(yīng)相關(guān)的功能鍵而執(zhí)行的 ,所以這里可以把 它看作是一種 “ 中斷 ” 操作 ,也就是說(shuō) ,在正常的流程下 ,俄羅斯方塊程序執(zhí)行正常的 流程 ,而一旦在用戶的按鍵命令到來(lái)的時(shí)候 ,就需要做這些不定時(shí)的操作指示。它的工作不受外界的任何影響 ,與外界的控制基本不存在直接的關(guān)聯(lián)。這個(gè) IsBottom()函數(shù)的功能除了判斷是否到達(dá)底部外 ,還進(jìn)行一些基本狀態(tài)的修改和銷(xiāo)行處理。 本科生畢業(yè)論文 18 (4)底部到達(dá)的判斷與銷(xiāo)行的實(shí)現(xiàn) 將新的下墜物放置到游戲區(qū)域中去,這時(shí)可能出現(xiàn)馬上到達(dá)底部的情況,因此需要對(duì)它進(jìn)行判斷,如果是到達(dá)底部,則進(jìn)行銷(xiāo)行處理,并且修改相應(yīng)的數(shù)據(jù)狀態(tài)。 對(duì)于 RectStatusToActiveStatus()的映射實(shí)現(xiàn) ,基本跟前面提到的函數(shù) RectStatusToN extStatus()的實(shí)現(xiàn)一樣 ,也是根據(jù)不同形狀的下墜物填寫(xiě)它們的第一種變化形態(tài)。由于前面已經(jīng)分配了一個(gè)二維數(shù)組 NextStatus[4][2]用作下一個(gè)下墜物的形態(tài)記錄 ,那么 ,這里可以先根據(jù)當(dāng)前的物件形狀來(lái)初始化其具體的形態(tài) ,在視圖類(lèi)對(duì)象增加了一個(gè)成員函數(shù) FlectStatusToNextStatus()來(lái)實(shí)現(xiàn)。 (1)下一個(gè)下墜物的隨機(jī)產(chǎn)生 在產(chǎn)生新的下一個(gè)下墜物前,需要先將當(dāng)前狀態(tài)物的記錄和舊的下一個(gè)下墜物保存下來(lái),然后用隨機(jī)函數(shù) Ramdom()產(chǎn)生一個(gè)最大值不大于指定指的隨機(jī)正整數(shù),將這個(gè)新生成的正整數(shù)用作新的“下一個(gè)下墜物”的形狀值。這里 需要特別說(shuō)明一下類(lèi)型和形態(tài)的區(qū)別 : m_icurrentStatus 和 m_inextStatus 變量是用作記錄下墜物的類(lèi)型 ,共有 7種形狀 ,所以范圍是從 1~ 7。 //當(dāng)前的方塊形狀 int m_currentRect。 int m_inextStatus。 下面將對(duì)整個(gè)流程中 對(duì) 各個(gè)功能部分的實(shí)硯進(jìn)行詳盡的分析 ,但 是在 分析前, 先介紹一 下 OnTimer()函數(shù)體中涉及到的視圖 類(lèi)的成員變量 。 } CView::OnTimer(nIDEvent)。 break。 Invalidate(FALSE)。km_iCol。jm_iRow。 AfxMessageBox(游戲已結(jié)束! )。im_iCol。 // IsBottom()。 //將當(dāng)前動(dòng)態(tài)數(shù)組中的數(shù)據(jù)反映到大數(shù)組中 ActiveStatusToGameStatus()。 // “ 下一下墜物 ” 用作當(dāng)前使用 m_currentRect = m_icurrentStatus。rect)。 // CRect rect(m_iStartY+320, m_iStartX, m_iStartY+440, m_iStartX+160)。 //得到下一次的方塊樣式 // if (m_inextStatus==0) m_inextStatus++。 if (m_isBottom) { // m_icurrentStatus = m_inextStatus。這里通 過(guò)利用 ClassWizard 跳到定時(shí)器到時(shí)后的處理函數(shù) OnTimerO 去實(shí)現(xiàn) ,其清單如下所示 。 其中 m_iLevel 變量是標(biāo)識(shí)當(dāng)前游戲的等級(jí) ,隨著游戲等級(jí)的 升高 ,定時(shí)器的固定時(shí)間間隔會(huì)逐漸變短 ,從而達(dá)到加快下降速度的效果。 ?? //游戲是否已經(jīng)結(jié)束或者暫停 BooL m_bGameEnd。 } 從上面的 3個(gè)函數(shù)代碼中可以看到 ,在添加這 3個(gè)函數(shù)時(shí) ,視圖類(lèi)還添加了涉及到游戲狀態(tài)的 3個(gè)成員變量 ,它們分別是用作判定當(dāng)前游戲等級(jí)的 m_iLevel、記錄游戲狀態(tài)的m_bGamePaush(是否暫停 )和 m_bGameEnd(是否結(jié)束游戲 ),它們?cè)谝晥D類(lèi)中的定義如下所示 。 m_bGamepaush= FALSE。 killTimer(1)。 SetTimer( 1500250*m_iLevel、 Nulll)。E. ID GAME_END OnGameEnd() 現(xiàn)在 ,就可以在上面的 3個(gè)空白的函數(shù)中添加定時(shí)器了 ,其具體實(shí)現(xiàn)如下所示。S. ID GAME_START OnGameStart() 暫停游戲 amp。這里 ,先在資源編輯器菜單資源里面添加 3 個(gè)菜單選項(xiàng) ,分別是游戲的 “ 開(kāi)始 ” 、 “ 暫停 ” 和 “ 結(jié)束 ” (由于這 3個(gè)功能是外部給 用戶操作的功能 ,所以可以預(yù)先在菜單欄中添加相應(yīng)的功能選項(xiàng) ,然后在視圖類(lèi)中實(shí)現(xiàn)它們即可 ,當(dāng)它們找到直接關(guān)聯(lián)的物件后對(duì)虛擬類(lèi)的功能操作預(yù)先脫殼 ), 然后利用 ClassWizard 直接在視圖類(lèi)對(duì)象 Cskyblue_RectView 中為它們添加空白的處理函數(shù) , 具體如表 42所示。 正常流程的設(shè)計(jì) 對(duì)于正常流程的實(shí)現(xiàn)是由定時(shí)器驅(qū)動(dòng)的 ,也就是說(shuō) ,當(dāng)預(yù)定的時(shí)間間隔到達(dá)后就執(zhí) 行這樣的一個(gè)工作流程 ,所以必須先設(shè)置一個(gè)定時(shí)器機(jī)制 ,下面來(lái)對(duì)增加一個(gè)定時(shí)器進(jìn)行實(shí)現(xiàn)。 表 41 操作函數(shù)及功能描述 屬性和操作 功能描述 外部操作 狀態(tài)控制操作組 GameStart() 游戲進(jìn)入開(kāi)始狀態(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ù)的清 除以及資源的銷(xiāo)毀和釋放操作 內(nèi)部基本核心操作 判斷操作組 IsLeftLimit() 向左偏移前 ,判斷該下墜物件是否已經(jīng)到達(dá)了游戲區(qū)域的最左邊 界 (不可以再左移〉 IsRightLitmit() 向右偏移前 ,判斷該下墜物件是否已經(jīng)到達(dá)了游戲區(qū)域的最右邊 界 (不可以再右移 ) IsBottom() 向下偏移加速或者下墜物件自動(dòng)向下偏移前 ,判斷是否已經(jīng)到達(dá) 了底部 (這里對(duì)底部定義是游戲區(qū)域底部或下面有其他下墜物 ) IsGameEnd() 判斷下墜物是否到達(dá)了游戲區(qū)域頂部而應(yīng)該結(jié)束游戲 執(zhí)行操作組 RectChange() 下墜物件的狀態(tài)變形 ,方法為在原來(lái)的狀態(tài)下逆時(shí)針旋轉(zhuǎn) 90 度 RectDown() 該下墜物件的 4 個(gè)小方塊所有坐標(biāo)位置向下偏移一個(gè)單位 RectArrow() 直接響應(yīng)用戶按鍵 ,向左或者向右或者向下偏移一個(gè)單位 本科生畢業(yè)論文 14 其他操作 Gamelnitnal() 游戲的初始化操作 流程的設(shè)計(jì) 與實(shí)現(xiàn) 流程的設(shè)計(jì)分正常流程設(shè)計(jì)和中斷流程設(shè)計(jì)。而內(nèi)部的基本操作又可以分成判斷操作和執(zhí)行操作這樣兩種類(lèi)型。 //游戲結(jié)束 通過(guò)上面的代碼可以看出 ,在虛擬類(lèi)中抽象出了核心的內(nèi)部數(shù)據(jù)和一些基本的操作函數(shù)。 //游戲開(kāi)始 GamePause()。 //下墜物體正常下落 RectArrow()。 //是否游戲已經(jīng)結(jié)束 //方塊物體下墜過(guò)程中的操作 RectChange()。 //下墜物體是否可向右移動(dòng) IsBottom()。 //初始化操作 GameInitnal(); //游戲的初始化
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1