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

正文內(nèi)容

基于symbian平臺的俄羅斯方塊游戲的實現(xiàn)-資料下載頁

2025-06-27 18:53本頁面
  

【正文】 ,對圖形塊的各種操作就可以轉換成對十六進制數(shù)的移位操作,相對于手機貧乏的資源來說,這是一個比較有創(chuàng)意的方法,能很大程度上節(jié)省資源,保證游戲的流暢性。 圖形塊的產(chǎn)生利用函數(shù)Block(Math::Rand(seed)%numBlocks)生成隨機種類的 block ,共有numblock種block因為二維數(shù)組包含所有種可能性,所以只需產(chǎn)生一個在一定約束范圍內(nèi)的數(shù)組下標就可達到目的。 圖形塊的旋轉利用函數(shù) TBlock::Rotate(int dir)操作圖形的旋轉,具體代碼如下, if (dir0) iRot++。 if (dir0) iRot+=3。 iRot%=4。 iRot代表圖形現(xiàn)在旋轉了多少度,其值變動范圍為[0, 3]。當iRot為0時,圖形為豎著的,iRot為1時,為橫著,以此類推。當iRot大于3時,應將它取模4,以保證它的值始終在約束范圍之內(nèi)。幾何塊總共只有4種旋轉狀態(tài),當超過第4中狀態(tài)時,必須回到初始狀態(tài)。 獲取一行的圖形塊數(shù)據(jù) 當游戲引擎工作時,需要逐行獲取Block中的圖形數(shù)據(jù),此時就需要有一個專門的函數(shù)RowMask(int nr)來讀取所需要的數(shù)據(jù)。此函數(shù)的思想為:將我欲獲取的該行的數(shù)據(jù),移至該16bit變量的結尾,再通過與0xf求位與來一次性獲取數(shù)據(jù)。 面板引擎(GRID)面板引擎負責游戲界面的顯示,面板引擎也是游戲中一個重要的數(shù)據(jù)結構,他存儲了基座(面板中已經(jīng)排好的方塊)中的方塊的排列情況以及每個方格的顏色值。它將決定當前方塊的活動范圍以及為游戲消行提供原始數(shù)據(jù),它的主要結構是兩個數(shù)組,其中iMask儲存基座方格的排列情況, iContent存儲基座每個方格的顏色。下面就是面板引擎的界面: 面板引擎圖如圖示,界面Grid類負責此四部分的顯示n 1部分:構建一個容器,所有活動Block均被限定在這個區(qū)域內(nèi)活動n 2部分:已經(jīng)下落的Block被壓入這個動態(tài)可變空間內(nèi)當基座n 3部分:當前活動的Blockn 4部分:等待出現(xiàn)的Block下面是主要操作和相關算法: 復位 復位操作就是把TGrid的各項數(shù)據(jù)恢復到初始狀態(tài),當用戶點擊新游戲或者游戲結束開始新游戲是調(diào)用,其中TGrid的最重要的兩個數(shù)據(jù)成員是iMask,iContent。iMask是一個有19個類型為TUint16的數(shù)組,它的每個元素都代表了面板上的一行。如iMask[i] = 1110 0001 1111 1111,則代表在該行面板的前3個格子和后5個格子都有幾何體存在,需要記住的是最后2為沒有使用。iContent是代表面板中每個方格的顏色,它也是一個TUint16數(shù)組。因為iMask是將數(shù)據(jù)按行壓縮成一個16bit數(shù)據(jù)來存儲的,所以初始化iMask數(shù)組時,需要按需要對iMask進行填充(不會使用到的位用1填充)。 碰撞及越界檢測 該函數(shù)通過引用型形參b代表了當前正在下落的活動塊,引用型形參p代表當前活動塊的坐標。 具體檢測流程:n 逐行檢測圖形是否完全顯示于界面上。如果未顯示于界面,則檢測圖形是否越出兩條邊界。n 獲得圖形Block I Y行的數(shù)據(jù)。n 將該行數(shù)據(jù)左移12 – x 位(16 – 塊長4)。n 將移位的數(shù)據(jù)和 1111 0000 0000 0000 00 11 位與檢測是否越邊界。n 例如:0000111000100000此矩陣的第0、1行未顯示在界面上,同時還存在超越左邊界的現(xiàn)象。此時按上面的算法可得(第1行為例,TPOINT( 1, 2 )):第二行數(shù)據(jù):1110;左移 12 + 1 位得1 1100 0000 0000 0011;然后位與不為0,說明越界n 逐行檢測圖形是否越下界。n 逐行獲取Block i Y行數(shù)據(jù)。n 如果數(shù)據(jù)不包含1,說明沒有越界,反之,則越界。n 檢測當前塊與基座是否產(chǎn)生碰撞。n 逐行獲取Block i Y和iMask i行數(shù)據(jù)。n 將Block的行數(shù)據(jù)左移 12 – x 位。n 將移位后的Block數(shù)據(jù)和iMask里面的基座數(shù)據(jù)進行位與。n 如果位與結果為真,說明有碰撞。n 例如:000此矩陣可見TPOINT( 0, 16 ),其第( 2, 2 )個數(shù)據(jù)和基座數(shù)據(jù)重疊,產(chǎn)生碰撞。因此,獲取該行數(shù)據(jù) 0010 和 0110 0000 0000 0011。將 0010 數(shù)據(jù)左移12位得:0010 0000 0000 0000,然后位與結果為真01110011100110n 檢測是否超越左邊界n 逐行獲取Block i Y行數(shù)據(jù)。n 將數(shù)據(jù)右移 4 + x 位(x小于0)。n 如果移位后的數(shù)據(jù)不包含1,說明沒有越界,反之,越界。 壓塊該函數(shù)在檢測到碰撞后,就需要將當前活動塊壓入基座iMask中。具體算法流程:n 循環(huán)檢測Y坐標是否大于0,若不大于0則continue。n 如果Y坐標大于0,則檢測坐標是否大于有效邊界的下限,如果大于,退出循環(huán)。n 獲取Block的i – Y行數(shù)據(jù)。n 將獲取的數(shù)據(jù)左移12 – x位后,與基座當前數(shù)據(jù)位或。n 然后將顏色緩存中的對應位更新。n 例如:00000000101001011010現(xiàn)在要將 0000 0000 1110 0010 TPOINT( 0, 16 )壓入iMask中。取出第2行數(shù)據(jù)。將其左移12位得 1000 0000 0000 0000,然后與 0010 0000 0000 0011位或得 1110 0000 0000 0011,即壓入。 流程引擎(Engine) 任何游戲的核心都是它獨特的引擎,上至WOW,下至超級馬麗均有其相對應的引擎。此引擎主要負責處理用戶的響應,如Block塊空間移動、重開/掛起游戲等等。因此該引擎從CTimer類派生,故而可以控制這些流程。 下面介紹Engine的主要操作函數(shù): 復位 其中iPauseRef是用戶暫停標識,當其為真時,表示當前引擎為暫停狀態(tài)。iTechPauseRef為系統(tǒng)暫停表識,當用戶點擊了菜單的時候,此變量為真,并且暫停游戲。 引擎構造 因為Grid和Block類均為T類,所以無需構造函數(shù),但此引擎因為承載了一個全局調(diào)度的任務,所以需要構造成一個C類。引擎構造由于是C類需要用到Symbian的二次構造體系。NewL() NewLC() ConstructL()。在二次構造函數(shù)ConstructL()里,主要初始化了基類CTimer和一些成員變量,以及將本引擎注冊到CActiveScheduler類里,以達到控件的事件響應功能。 用戶輸入響應 引擎定義了四種用戶按鍵響應函數(shù)n void KeyLeft()。n void KeyRight()。n void KeyRotate( int dir )。n void KeyDrop()。KeyLeft()和KeyRight()響應了用戶按下←(4)、→(6)的事件,實現(xiàn)將Block左/右移動一格的功能。KeyRotate()響應了用戶按下↑(2)、1的事件,實現(xiàn)將Block逆/順時針旋轉90度的功能。KeyDrop響應了用戶按下↓(8)的事件,實現(xiàn)將Block快速下落到基座上的功能。 游戲狀態(tài)的切換這個引擎負責處理暫停游戲的請求,有兩種模式:用戶級和系統(tǒng)級。 首先,在函數(shù)的入口第一行有一個斷言宏,當且僅當滿足iPauseRef 0 || iTechPauseRef 0,即系統(tǒng)出現(xiàn)異常時,系統(tǒng)會報出一個錯誤顯示在屏幕上。 其次,函數(shù)中的After()是繼承自CTimer類中的方法,其主要目的是在一定事件后,觸發(fā)CTimer的定時器中斷。 下面設想一個案例:假如每隔1秒觸發(fā)一次定時器中斷?,F(xiàn)在當After(),用戶暫停了游戲而去干其他事情。等用戶重開游戲時。所以,這個函數(shù)提供了這種功能——在用戶暫停時,將暫停時的時間寫入iPauseTime;在程序回復運行時,將iPauseTime和iBeginTime求差值,然后iInterval與之求差值即可。 核心—CTimer::RunL() 定時器中斷RunL()方法是在一定的時間間隔完后,立即調(diào)用的方法。由于每隔一定時間間隔就會調(diào)用RunL()函數(shù) ,我們在開頭調(diào)用MoveBlock(iDociBlockPos+TPoint(0, 1)))使得堆砌材料下移一步。在下移的過程中發(fā)生了碰撞,到底了或者是碰到了障礙物,沒法繼續(xù)向下走了這是就要調(diào)用 CheckRow()檢查一下看是否有可以消去去的行,如果有,則將之消去。當幾何塊堆積滿的時候FixBlock()返回false,這是就要顯示一個CAknInformationNote對話框,提示用戶游戲結束。如果當前等級比iLines/10 (iLines 記錄了到目前為止你銷去了多少行)小或相等,則增加難度等級。通過減少時間間隔(變成原來的3/4)來實現(xiàn)。當MoveBlock返回真的時候,也即正常下落的時候。這時下落一格后得停頓一段時間,讓player有時間反應。故調(diào)用了Afer(Interval)方法來停頓一段時間。將iBeginTime的內(nèi)容置為當前時間,在DoPause()中要用到。這個函數(shù)是繼承自基類CTimer的定時器中斷函數(shù)。說它是整個程序的核心一點不為過,因為它負責了程序核心流程——檢測是否Game Over、調(diào)整游戲的積分和難度等功能。 首先,明確一個概念——定時器中斷。我們知道CTimer類是個定時器類,這里可以把這個類形象化成一個單片機中的Timer。當單片機Timer計數(shù)完畢時,會產(chǎn)生一個脈沖觸發(fā)定時器中斷,告訴CPU此時定時已到,應該處理事情了。這里一樣,當After()定時完畢時,調(diào)用RunL()函數(shù)來處理相應的事情。: 引擎工作流程圖 DoPasue函數(shù)DoPause()處理設置暫停和取消暫停這兩種事件。我認為這里假設程序運行的很快,只有After()語句需要運行很長的時間。所以只考慮After()被中斷就可以了。iPauseRef是代表是否暫停的標志,如果暫停了則將它置為1,否則置為0。用戶按暫停了則iTechPauseRef++,用戶按取消暫停了則iTechPauseRef。必須保證兩者都是非負數(shù)。 如果iPauseRef,iTechPauseRef都不為0,會出現(xiàn)這樣的情況:假設 iInterval是50秒我在RunL()中After()了20秒,突然來電話了,用戶切換到其他應用程序,然后又切換回來時。這時我們只需要再After()30秒就可以了。如果原先是被暫停了,則啟動運行engine。將狀態(tài)設置為ERunning。如果原先已經(jīng)After()一段時間了,則只需After()剩下的時間。由下面的RunL()中設置的iBeginTime保存了開始執(zhí)After()的時間。如果iPauseRef,iTechPauseRef有一個不為0,即要么是失去了焦點,要么是切換到了其他應用程序。會出現(xiàn)這樣的情況:游戲正在進行中時,用戶按了暫停鍵或切換到其他應用程序。如果當前正在運行(if (iState==ERunning))則將當前狀態(tài)設置為暫停。(iState=EPaused。)同時將iPauseTime設置為當前時間,ms = (iBeginTime).Int64().GetTInt()記錄了游戲被中斷時After()運行了多長時間, 同時取消定時器服務。 文檔類(Document) 文檔類(class Document)屬于Symbian體系結構的一部分,負責處理程序中的各個部分傳來的持久性數(shù)據(jù)。 本程序的CS60TestDocument類從CAknDocument基類派生。下面主要介紹下非Symbian體系結構的函數(shù)。 復位此類的復位函數(shù)主要負責復位Grid類以及重新初始化本類各個成員變量。并且把復位后的數(shù)據(jù)存入文檔對象中。 可銷行數(shù)的統(tǒng)計 此處有一點要先提出——前文敘述了,iMask中未使用的位,用1填充。為什么要這樣?原因在于在此函數(shù)中,判斷一行是否應該銷去,是通過判斷iMask的該行數(shù)據(jù)是否為0xffffU。 此函數(shù)的銷行判斷算法為:首先統(tǒng)計有多少連續(xù)行需要消除(累計offset),然后遇到不能消除的行時,則將iMask中第i行數(shù)據(jù)覆蓋到第i + offset行去,實現(xiàn)銷行。 在銷行后,需要重新生成顏色索引數(shù)組iContent。 Block的旋轉檢測Block的旋轉存在一個非常關鍵的問題——原本不會產(chǎn)生碰撞、越界的情況,在旋轉后就可能產(chǎn)生,故而需要對這個情況進行處理。此函數(shù)的處理辦法為——首先旋轉Block,然后檢測是否產(chǎn)生碰撞或者越界,如果有這個情況,那么反向旋轉Block以達到Undo的目的。 視圖(AppView) 視圖類(class AppView)也屬于Symbian體系結構的一部分,負責處理程序的顯示請求。 本程序的CS60TestAppView類從CCoeControl基類派生,其最關鍵的方法是Draw()。這個函數(shù)是整個程序的顯示驅動核心。 該函數(shù)首先在界面右側顯示出當前的Level、Score和難度,然后繪制區(qū)域1,緊接著繪制區(qū)域4,最后繪制區(qū)域2和3。 其它類 Symbian體系結構中還有Application和AppUI兩個類。其中Application負責程序入口初始化;AppUI遵循C/S架構,負責對用戶在UI層的操作的處理。 因這兩個類均采用Smbian標準的架構思想,故而在這里不再講述。 程序實現(xiàn)步驟該游戲的實現(xiàn)在編程過程中分為以下五步:1.在VS2003中生成symbian的一個hello world程序,命名為S60Test,生成游戲的系統(tǒng)框架。2.加入兩個類TBlock和TGrid,這兩個類沒有特定的數(shù)據(jù)類型,它們是T型類,TBlock指向一個
點擊復制文檔內(nèi)容
研究報告相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1