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

正文內(nèi)容

基于android的手機(jī)應(yīng)用開發(fā)(完整版)

  

【正文】 和剩余的幫助次數(shù)這部分的游戲界面也是寫在布局組建 Layout中其中有兩個(gè)組件 TextView用來(lái)顯示游戲剩余時(shí)間和剩余幫助次數(shù)下面的 LinearLayout 用于放置自定義的游戲視圖現(xiàn)在這里占個(gè)位 這里說(shuō)明一下 Layout 中 比 較 常 出 現(xiàn) 的 FILL_PARENT 和WRAP_CONTENTFILL_PARENT 意味著 View 想和父容器一樣大也就是最小的填充paddingWRAP_CONTENT意味著當(dāng)前 View的大小只需要包裹住 View里邊的內(nèi)容即可 Mainjava中定義了我們程序中唯一的一個(gè) activity類在這里定義了游戲的幾種狀態(tài)變量 public static final int STATE_MENU 0 public static final int STATE_GAME 1 public static final int STATE_WIN 2 public static final int STATE_LOSE 3 public static final int STATE_PAUSE 4 通過(guò)設(shè)置和訪問(wèn) activity 的 state 變量可以知道程序處在什么狀態(tài) private static int state STATE_MENU state 變量被初始化為 STATE_MENU 這是程序最初始的菜單 private static GameController gameController null 定義游戲存儲(chǔ)圖標(biāo)的變量一共有十種圖片 public static final int iconsCount 10 并將下載到的 10 中圖片資源存放在 drawable 文件夾中 public static Bitmap[]icons new Bitmap[iconsCount] 我們將游戲控制器對(duì)象初始化為 null程序啟動(dòng)后檢測(cè)到其為 null時(shí)說(shuō)明是程序第一次啟動(dòng)新建一個(gè)對(duì)象并加載圖標(biāo)資源將這些變量定義為靜態(tài)變量只要程序進(jìn)程不退出每次用戶進(jìn)入程序時(shí)都可重復(fù)使用這些 變量資源這樣程序的狀態(tài)可以記錄下來(lái)圖標(biāo)資源也只需要加載一次在 Android 系統(tǒng)中一般程序進(jìn)入一次后進(jìn)程是不會(huì)退出的除非用戶重啟系統(tǒng)或系統(tǒng)內(nèi)存資源不足并且比我們的程序優(yōu)先級(jí)別較低 在這 5 種狀態(tài)中除了 STATE_GAME 都有顯示菜單只不過(guò)菜單內(nèi)容有所區(qū)別因此定義了 loadMenu 方法并在 onStart 方法中調(diào)用 首先通過(guò) setContentView方法將 activity的視圖設(shè)置為 mailxml如果程序是第一次啟動(dòng)則新建游戲控制器對(duì)象并加載圖表資源然后為新建游戲和退出按鈕設(shè)置事件監(jiān)聽最后根據(jù)程序的狀態(tài) 來(lái)調(diào)整界 面的顯示加載游戲圖標(biāo)資源的方法如下 private void loadlcons Resources r getResources for int i 0i iconslengthi icons[i] BitmapDrawable rgetDrawable Rdrawablei1i getBitmap 通過(guò)一個(gè) for 循環(huán)對(duì)圖標(biāo)資源進(jìn)行加載但是在我們開始玩游戲的時(shí)候又需要考慮到這個(gè)初始布局是否一定有解如果沒有解怎么辦呢那就只能說(shuō)這個(gè)布局失 敗了那就是這個(gè)程序的 bug先定義一個(gè)布爾型的 die方法來(lái)判斷布局有沒有解具體是如何判斷的屬于算法領(lǐng)域這里不做詳細(xì)介紹還定義了一個(gè) shuffle 方法來(lái)對(duì)圖標(biāo)進(jìn)行隨機(jī)互換所以初始布局的方法 generateMap中要先調(diào)用 die來(lái)判斷布局是否有解如果無(wú)解的話再調(diào)用 shuffle 進(jìn)行重新布局然后再判斷直到布局有解為止此時(shí)還要播放 music0 這段音樂來(lái)作為游戲的背景音樂下面來(lái)看一下生成的初始布局 用戶通過(guò)觸摸方式單擊圖片后圖片背景變成黃色與其他圖片相區(qū)分 上圖為單擊中國(guó)國(guó)旗時(shí)的游戲界面可以明顯地看到背景顏色已經(jīng)變?yōu)辄S 色 在這里我們還要響應(yīng)按鍵事件就是當(dāng)玩家點(diǎn)擊其中的一個(gè)圖標(biāo)資源的時(shí)候程序要有所反應(yīng) 首先判斷游戲的狀態(tài)如果不是正在游戲不需要處理按鍵事件如果在游戲中用戶按了 DPAD 中鍵則調(diào)用游戲控制器的 autoErase 方法來(lái)自動(dòng)消除兩個(gè)能夠相連的圖片如果用戶按了 DPAD 左鍵即幫助鍵則暫停游戲返回到菜單 如果用戶過(guò)關(guān)或者游戲時(shí)間到游戲控制器需要設(shè)置游戲狀態(tài)在這里提供了setState 方法并根據(jù)狀態(tài)加載菜單 如果用戶在游戲中按了 home 鍵退到 Home 界面或通過(guò)其他方式切換到其他activity 要暫停游戲 在不同的游戲界面下要 播放不同的音樂把這些音樂存放在 SD 卡上 如果圖片與上次選中的圖片可以相連則畫出連線然后擦去連線和兩個(gè)圖片否則選中該圖片在游戲控制器中定義了直連 linkD 方法一折連和二折連中也要調(diào)用直連方法具體算法不作詳細(xì)介紹消去時(shí)的生成界面如圖所示 如果游戲中布局無(wú)解則對(duì)剩余圖片重新布局在游戲中用戶按下 DPAD 的中鍵為幫助功能幫助用戶消除可以相連的兩個(gè)圖片當(dāng)使用幫助達(dá)到規(guī)定次數(shù)后禁用該功能本程序?yàn)榱朔奖阏{(diào)試將幫助次數(shù)設(shè)為 100次時(shí)間設(shè)為 200s用戶按下 DPAD的左鍵游戲暫停并返回菜單菜單除了開始新游戲和退出外增加了繼續(xù)游戲 的選項(xiàng)具體的實(shí)現(xiàn)方法如下 case KeyEventKEYCODE_DPAD_LEFT gameControllerpause state STATE_PAUSE loadMenu break 當(dāng)點(diǎn)擊手機(jī)左鍵時(shí)即暫停鍵調(diào)用游戲控制器里的 pause方法前面提到過(guò)的 5中狀態(tài)變量此時(shí)把 STATE_PAUSE 賦給 state 系統(tǒng)得知要顯示暫停時(shí)的界面 如圖所示 在 activity 中有 一段代碼如下 else if state STATE_LOSE playmusic 2 titlesetText 請(qǐng)重新來(lái)過(guò) startsetText 重試 用戶在規(guī)定的時(shí)間內(nèi)沒有完成游戲此時(shí)剩余時(shí)間 remainTime 0 則把STATE_LOSE 賦給 state 系統(tǒng)得知要顯示游戲失敗的界 面程序回到菜單提示游戲失敗并可以選擇開始新游戲或退出同時(shí)播放 music2 這一段比較憂傷的背景音樂如圖所示 因?yàn)橹卦囘@個(gè)按鈕在代碼中是 startsetText 重試 所以當(dāng)我們點(diǎn)擊重試時(shí)游戲又重新加載一次圖標(biāo)資源重新進(jìn)入了初始化布局界面 activity 中的另一段代碼如下 if state STATE_WIN playmusic 1 titlesetText 恭喜你過(guò)關(guān) startsetText 再玩一遍 用戶在規(guī)定的時(shí)間內(nèi)連完所有的圖片則將 STATE_WIN賦給變量 state系統(tǒng)得知此玩家已經(jīng)成功完成游戲程序回到菜單并提示用戶過(guò)關(guān)可以選擇再玩一遍或退出同時(shí)播放 music1 這一段比較歡快的背景音樂 如圖所示 同樣道理因?yàn)樵偻嬉淮芜@個(gè)按鈕在代碼中是 startsetText 再玩一遍 所以當(dāng)我們點(diǎn)擊再玩一遍時(shí)游戲又重新加載一次圖標(biāo)資源重新進(jìn)入了初始化布局界面 25 代碼的實(shí)現(xiàn)與分析 為了讓程序模塊一目了然下面畫出程序模塊的概要設(shè)計(jì)圖 系統(tǒng)可分為三個(gè)模塊 1activity程序 UI2自定義視圖顯示游戲的圖片布局 3游戲控制器控制游戲邏輯把游戲的視圖和邏輯控制部分區(qū)分開來(lái)這樣寫起 來(lái)可能覺得比較麻煩但好處也是顯而易見的首先這樣程序結(jié)構(gòu)比較清晰以后擴(kuò)展維護(hù)起來(lái)也比較方便比如要更改或美化游戲的界面只需修改視圖部分需要修改游戲規(guī)則只需要修改控制器部分只要保證這兩部分的耦合邏輯不變即可 1 程序只有一個(gè) activity 通過(guò)設(shè)置其內(nèi)容視圖來(lái)切換菜單和游戲界面第三部分已經(jīng)進(jìn)行了比較詳細(xì)的介紹 2GameView 類是一個(gè)自定義的視圖根據(jù)控制器提供的布局?jǐn)?shù)據(jù)來(lái)顯示圖片并提供圖片選中高亮連線和消除的功能在這里不需要考慮游戲邏輯只需要考慮需要哪些數(shù)據(jù)暴露些什么接口 這個(gè)類中的成員變量包括圖片坐標(biāo)圖片寬度連線的折點(diǎn)圖片點(diǎn)擊事件的監(jiān)聽者游戲布局?jǐn)?shù)據(jù)圖片在橫向上的偏移值圖片在縱向上的偏移值和圖片資源 每次可以有多個(gè)圖片被選中其實(shí)最多應(yīng)該有兩個(gè)邏輯部分在我們的控制器中實(shí)現(xiàn)這里不需要管所以被選中的圖片坐標(biāo)用一個(gè) list 來(lái)存儲(chǔ)每個(gè)圖片的寬度和高度信息由控制器來(lái)設(shè)置這里只提供 set 方法 Path 數(shù)組變量為連線的折點(diǎn)有控制其計(jì)算好了傳過(guò)來(lái)在視圖中畫出連線 lcons 數(shù)組為圖表資源在 activity 中加載開始游戲后傳過(guò)來(lái) Map 數(shù)組是游戲的布局?jǐn)?shù)組在前面的算法介紹中提到過(guò)是帶邊界的而邊界如果 在界面中與其他位置統(tǒng)一處理會(huì)浪費(fèi)很多屏幕空間因此通過(guò) offsetXoffsetY 變量來(lái)調(diào)整這兩個(gè)變量的值是在 onLayout 方法中計(jì)算的 protected void onLayout boolean changedint leftint topint rightint bottom superonLayout changedlefttoprightbottom if changed offsetXoffsetY 具體的計(jì)算方法 offsetX iconWidth rightleft maplength2 iconWidth 2 offsetY iconHeight bottomtop map[0]length2 iconHeight 2 這里說(shuō)明一個(gè)橫向偏移值的計(jì)算縱向同理 rightleft 為視圖的寬度一般為320個(gè)像素 maplength2為橫向共有過(guò)少個(gè)圖片乘以圖片的寬度為圖片在橫向占的總像素?cái)?shù)視圖的寬度減去圖片在橫向占的總像素?cái)?shù)為橫向空白的像素?cái)?shù)因?yàn)橐獧M向居中這個(gè)數(shù)值除以 2 為最左側(cè)圖片的左側(cè)離視圖左側(cè)的距離如果按正常布局最左側(cè)圖片與視圖的左側(cè)距離應(yīng)該 是一個(gè)圖片的寬度也就是邊界的寬度因?yàn)檫吔绮恍枰@么寬需要將圖片橫坐標(biāo)向左移的距離為兩者之差以下兩個(gè)函數(shù)將屏幕坐標(biāo)與圖片在布局中的坐標(biāo)相互轉(zhuǎn)換 private Point screen2index int xint y return new Point xoffsetX iconWidth yoffsetY iconHeight private Point index2screen int xint y return new Point xiconWidthoffsetXyiconHeightoffsetY 下面看一下 GameView 的核心部分是 onDraw 方法的實(shí)現(xiàn) 首先在被選中的圖片位置畫一個(gè)與圖片大小一樣的黃色矩形這樣被選中的圖片背景顏色變了給人高亮的感覺然后開始繪制圖片 map數(shù)組中以 0表示空位不用畫其他的數(shù)字減去 1 就是圖片在 icons 數(shù)組中的索引如果 path 數(shù)組長(zhǎng)度大于等于 2 表示需要畫連線 path 數(shù)組中的點(diǎn)坐標(biāo)為 map 數(shù)組的坐標(biāo)需要轉(zhuǎn)換為屏幕坐標(biāo)我們提供的 index2screen 方法轉(zhuǎn)換出來(lái)的是對(duì)應(yīng)位置的圖片的左上角坐標(biāo)需要取中間的坐標(biāo)畫完連線后將 map 數(shù)組中需要消除的兩個(gè)位置置 0 消空selected 表并將 path 設(shè)為 null 這樣下次刷新的時(shí)候就可以把對(duì)應(yīng)的兩個(gè)圖片消除并且將連線擦去 在這個(gè)視圖中提供了 drawLine方法傳入一個(gè) path數(shù)組并刷新視圖當(dāng)游戲控制器調(diào)用這個(gè)方法后視圖刷新將連線畫上通過(guò) onDraw 方法知道這次刷新 map 數(shù)組對(duì)應(yīng)的位置已經(jīng)置 0 消除效果將在下次刷新視圖時(shí)發(fā)生后面這次刷新有個(gè)延時(shí)以達(dá)到動(dòng)畫效果這由控制器來(lái)控制視圖中不予考慮這次刷新有個(gè)延時(shí)還有動(dòng)畫效果由控制器來(lái)控制視圖中不予考慮 前面的變量還有一個(gè) OnItemClickListener 類型的mOnClickListenerOnItemClickListener 是個(gè)接口 interface OnItemClickListener public void onClick Point position 這個(gè)事件監(jiān)聽用來(lái)通知監(jiān)聽者用戶單擊了哪個(gè)圖片即 map 數(shù)組對(duì)應(yīng)的什么位置這是通過(guò)下面的 onTouchEvent方法實(shí)現(xiàn)的視圖類的 onTouchEvent方法里面的 ACTION_DOWN 事件 這里介紹了視圖類的 onTouchEvent方法我們只對(duì)其中的 ACTIONDOWN事 件感興趣其他事件可以忽略通過(guò)事件可以得知用戶在屏幕上單擊的點(diǎn)在視圖中的坐標(biāo)通過(guò)前面提到的 screen2index 方法轉(zhuǎn)成了對(duì)應(yīng) map 數(shù)組的元素如果 map 數(shù)組對(duì)應(yīng)的元素為 0 即空位認(rèn)為該位置不可點(diǎn)所以不用通知監(jiān)聽者否則告訴監(jiān)聽者map 數(shù)組這個(gè)位置發(fā)生了單擊事件這個(gè)監(jiān)聽者是在控制器中實(shí)現(xiàn)的后面將會(huì)看到 3 游戲控制器是本案例最為復(fù)雜的部分在這里實(shí)現(xiàn)了連連看游戲的核心算法以及一些其他控制邏輯可以說(shuō)這個(gè)類是整個(gè)程序的核心它的成員變量包括列數(shù)行數(shù)和圖片大小 這里將行數(shù)列數(shù)圖片大小定
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1