游戲設(shè)計(jì)與開(kāi)發(fā)_第1頁(yè)
游戲設(shè)計(jì)與開(kāi)發(fā)_第2頁(yè)
游戲設(shè)計(jì)與開(kāi)發(fā)_第3頁(yè)
游戲設(shè)計(jì)與開(kāi)發(fā)_第4頁(yè)
游戲設(shè)計(jì)與開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

經(jīng)典word整理文檔,僅參考,雙擊此處可刪除頁(yè)眉頁(yè)腳。本資料屬于網(wǎng)絡(luò)整理,如有侵權(quán),請(qǐng)聯(lián)系刪除,謝謝!中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)學(xué)院課程名稱(chēng)《軟件測(cè)試》報(bào)告時(shí)間學(xué)生姓名2016年7月李龍學(xué)專(zhuān)號(hào)業(yè)計(jì)算機(jī)科學(xué)與技術(shù)任課教師評(píng)語(yǔ)成績(jī):任課教師簽字:2016年6月25日摘要?jiǎng)e人比賽,苦苦的玩了好多次,追求高分!后來(lái)得知這個(gè)小小的游戲是nokia公司2007年11月5日發(fā)布的開(kāi)源的Android平臺(tái)——一款包括操作系統(tǒng)(基于Linux開(kāi)放手機(jī)聯(lián)盟(OpenHandsetAlliance),包括宏達(dá)電、高通、摩托羅拉等領(lǐng)軍企業(yè)。于是,我決定利用自己大學(xué)所學(xué)的知識(shí),括Drawable,Canvas,Thread,等等。介紹了這些類(lèi)的一般的使用方法,以及本Android娛樂(lè)需求。關(guān)鍵詞:Android系統(tǒng);貪食蛇游戲;手機(jī)游戲ABSTRACT.ThistopicisusingjavalanguageontheAndroidplatformmobilephonegamedevelopment,Ilimitedknowledge,andobjectiveconstraints,Iintendtodevelopastand-alonegame.IplayedthegameofSnake,onthephoneonceinordertomatchwithothers,strugglingtoplaymanytimes,thepursuitofhighscores!Laterlearnedthatthislittlegamenokiawasverysuccessfulmobilephonegames,manypeoplehaveplayed,andalsoenjoyed.Versionofthegamehasbeendevelopedtothethirdedition,mobilephonemanufacturerscontinuetodevelopthisgame,itseemsthatthisgameisagreatmarket.Open-sourceAndroidplatform,Google'sreleasedonNovember5,2007-anoperatingsystem(Linuxkernel),middlewareandkeyapplications-basedmobilephoneplatform,andtheformationoftheOpenHandsetAlliance(OpenHandsetAlliance),includingGoogle,ChinaMobile,T-Mobile,HTC,Qualcomm,MotorolaandotherleadingenterprisesSo,Idecidedtousetheknowledgelearnedinhiscollege,intheinstructor'shelp,theindependentdevelopmentofthisgame.Thisarticlefirstdetailssomeofthebasicjavaknowledge,onthisbasisleadstoAndroid,thebasisoftheAndroidanditscharacteristics,andthenintroducestheAndroidfutureprospectsanddevelopment.HighlightsthisSnakeproceduresusedandcontrols,includingtheDrawableCanvas,Thread,andsoon.Describesthegeneraluse,aswellastheprogramishowtousetheseclassestothedevelopmentofthegame.Theagesoftheclassicworkstransplantationinthisprogramtothephoneup,toprovideapplicationsoftwareforthemorepopularhardwareplatforms.Thesewillbewellpositionedtomeetfuturedemandformobilegames.DevourthesnakegamebasedontheAndroidplatform,preparedtomeettheentertainmentneedsofthegeneralmobilephoneusers.Keywords:Androidsystem;Gluttonysnakegame;Mobilegame1背景1.1研究背景世界。人們不再拘泥于一塊天地,加班,出差成了現(xiàn)代人不可避免的公務(wù)。而此便,娛樂(lè)性較強(qiáng),吸引了不少人。這一款游戲緊緊地抓住了人們的心理,雖然簡(jiǎn)感,以及成功后的滿足感,對(duì)于一直處于高壓下的現(xiàn)代人是很好的放松工具。[1]與傳統(tǒng)的PC上設(shè)計(jì)的貪吃蛇游戲不同,本次利用Android語(yǔ)言編程,實(shí)現(xiàn)便攜地貪吃蛇游戲1.2項(xiàng)目目的與意義1.2.1開(kāi)發(fā)目的自2007年Google發(fā)布Android系統(tǒng)1.0光投向了最具發(fā)展?jié)摿Φ腁ndroidAndroid系統(tǒng)的智能手機(jī)。手機(jī)在手機(jī)市場(chǎng)中占的市場(chǎng)份額正以非常迅猛的速度上升:2010年市場(chǎng)份額:Symbian36.6%、Android25.5%、iPhone16.7、windowsMobile2.8%、linux2.1%。Nokia的Symbian系統(tǒng)在Android手機(jī)必定會(huì)占據(jù)手機(jī)市場(chǎng)的主要份額,所以在這種形式下,Android應(yīng)用的前景也必定是前景一片大好。1.2.2開(kāi)發(fā)意義的時(shí)候、坐長(zhǎng)途車(chē)的時(shí)候...這時(shí)若有一款有意思的游戲來(lái)打發(fā)時(shí)間是再好不過(guò)Android在等車(chē)的時(shí)候玩上一玩消磨時(shí)間的好東東。1.3手機(jī)游戲國(guó)內(nèi)外現(xiàn)狀和發(fā)展趨勢(shì)1.3.1手機(jī)游戲國(guó)內(nèi)外現(xiàn)狀備應(yīng)對(duì)措施,以便搶占更多的手機(jī)市場(chǎng)分額。Nokia、索愛(ài)、三星等各大手機(jī)廠能夠享受到不同的游戲業(yè)務(wù)[4]助器械的大型手機(jī)游戲。1.3.2手機(jī)游戲的發(fā)展趨勢(shì)操作簡(jiǎn)單,易與掌握,是人們?nèi)粘I钪胁豢苫蛉钡膴蕵?lè)方式。伴隨著3G、4G戲必將會(huì)迎來(lái)一個(gè)新的發(fā)展高峰。[6]起,手機(jī)游戲的發(fā)展在短短2年里就超越了掌上機(jī)及電腦游戲。PopCapGames手機(jī)游戲。大量平價(jià)游戲、更為簡(jiǎn)化的游戲技術(shù),大大降低了用戶玩手機(jī)游戲的門(mén)檻,在中國(guó)手機(jī)游戲幾乎都是免費(fèi)下載的。撇開(kāi)平價(jià)手機(jī)游戲所帶來(lái)的商業(yè)影響不業(yè)中數(shù)量增長(zhǎng)最快的用戶,手機(jī)游戲公司們最近的表現(xiàn)也同樣勢(shì)不可擋。視覺(jué)的雙重享受。些年來(lái)也得到了充分的發(fā)展。Nokia在其WP7手機(jī)上推出了瘋狂貪吃蛇(Crazy的游戲。Snake的開(kāi)發(fā)商XIMAD又推出了寶石貪吃蛇游戲,這款名為Snake的游[7]戲?qū)⒇澇陨叩漠?huà)面水平推向了一個(gè)新的高度。Snake無(wú)論是游戲畫(huà)面還是游戲可收集文物,但是要及時(shí)的避開(kāi)各種障礙物,以通過(guò)各種關(guān)卡,獲取積分。不僅如制的貪吃蛇游戲,將會(huì)把貪吃蛇推向新的高度。2方案論證2.1經(jīng)濟(jì)可行性分析2.2.1Android平臺(tái)特性(5)SQLite數(shù)據(jù)庫(kù),用于結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)。(6)(7)GSM電話—全球通。(8)(9)照相機(jī)、GPS、指南針和加速度計(jì)。2.2.2Android應(yīng)用程序組件1.活動(dòng)(Activity)具有可視UI動(dòng)器選擇一個(gè)應(yīng)用程序時(shí),就會(huì)開(kāi)始一個(gè)動(dòng)作。2.服務(wù)(Service)查應(yīng)用程序。3.內(nèi)容提供程序(ContentProvider)數(shù)據(jù)的訪問(wèn),例如SQLite數(shù)據(jù)庫(kù)。如果應(yīng)用程序非常簡(jiǎn)單,那么可能不需要4.廣播接收器(BroadcastReceiver)Android應(yīng)用程序可用于處理一個(gè)數(shù)據(jù)元素,或者對(duì)一個(gè)事件(例如接收文本消息)做出響應(yīng)。5.視圖(View)View是AndroidActivity;Activity上面是Window;Window上面是Views。View又可以分為View和ViewGroup。View是基本控件,ViewGroup是布局控件。6.信使(Intent)Intent是不同組件之間相互導(dǎo)航的紐帶,封裝了不同組件導(dǎo)航查找的條件。Android應(yīng)用程序是連同一個(gè)AndroidManifest.xml文件一起部署到設(shè)備的。AndroidManifest.xml包含必要的配置信息,以便將它適當(dāng)?shù)匕惭b到設(shè)備。manifest聲明式安全性有助于減少惡意應(yīng)用程序損害設(shè)備的可能性。2.4開(kāi)發(fā)工具及環(huán)境簡(jiǎn)介2.4.1開(kāi)發(fā)工具Eclipse簡(jiǎn)介Eclipse是一個(gè)開(kāi)放源代碼的、與NetBeans、SunONEStudioBorlandJbuilder類(lèi)似的一種基于Java的整合型可擴(kuò)展開(kāi)發(fā)平臺(tái),也是目前最著名的開(kāi)源項(xiàng)目之一,Eclipse附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括Java開(kāi)發(fā)Development語(yǔ)言的開(kāi)發(fā),甚至能成為圖片繪制的工具。目前,Eclipse已經(jīng)開(kāi)始提供C語(yǔ)言開(kāi)發(fā)的功能插件。更難能可貴的是,此基礎(chǔ)上開(kāi)發(fā)自己的功能插件。也就是說(shuō)未來(lái)只要有人需要,就會(huì)有在Eclipse之上COBOL,Perl,Python等語(yǔ)言的開(kāi)發(fā)插件出現(xiàn)。同時(shí)可以通過(guò)開(kāi)發(fā)新的插件理,這也正是Eclipse的潛力所在。Eclipse的主要組成。Eclipse是一個(gè)開(kāi)放源代碼的軟件開(kāi)發(fā)項(xiàng)目,專(zhuān)注于為高度集成的工具開(kāi)工具項(xiàng)目和Eclipse技術(shù)項(xiàng)目三個(gè)項(xiàng)目組成,具體包括四個(gè)部分組成——EclipsePlatform、JDT、CDT和PDE.JDT支持Java開(kāi)發(fā)、CDT支持C開(kāi)發(fā)、PDE用用的開(kāi)發(fā)平臺(tái)。它提供建造塊和構(gòu)造并運(yùn)行集成軟件開(kāi)發(fā)工具的基礎(chǔ)。EclipseSDK(軟件開(kāi)發(fā)者包)是EclipsePlatform、JDT和PDE所生產(chǎn)發(fā)環(huán)境,允許開(kāi)發(fā)者有效地建造可以無(wú)縫集成到EclipsePlatform中的工具。EclipseSDK由Eclipse項(xiàng)目生產(chǎn)的工具和來(lái)自其它開(kāi)放源代碼的第三方軟件組議。2.4.2開(kāi)發(fā)環(huán)境簡(jiǎn)介本項(xiàng)目在windowsXP操作系統(tǒng)上進(jìn)行開(kāi)發(fā),Google為開(kāi)發(fā)者提供了SDK(SoftwareDevelopmentKit)。AndroidSDK的下載地址為http://development.A/index.html。因?yàn)楸卷?xiàng)目的開(kāi)發(fā)工具是Eclipse,所以還需要安裝ADT(AndroidDevelopmentTools)插件。具體安裝步驟就不在本文中介紹了。3.游戲策劃3.1系統(tǒng)需求分析雖然現(xiàn)在市面上存在著各種各樣的游戲版本,可是貪吃蛇其市場(chǎng)還是相當(dāng)大的.因?yàn)樗奶厥庠谟谒芪烁钊?愛(ài)不釋手.隨著游戲速度不斷加快,其刺激性也更強(qiáng).可以說(shuō)該游戲的優(yōu)勢(shì)在于它的簡(jiǎn)單易行,不論是手機(jī),還是小游戲機(jī),都能很快順利的運(yùn)行.對(duì)于在外忙碌的人,不可能花費(fèi)大量時(shí)間在娛樂(lè)上,大型游戲是行不通的,這樣的小游戲剛好迎合了他們的需求。手機(jī)貪吃蛇游戲基于JAVA平臺(tái)編寫(xiě),采用Android技術(shù)開(kāi)發(fā)的一款手機(jī)游久后可能出現(xiàn)嚴(yán)重錯(cuò)誤,甚至死循環(huán)。因此,其邏輯設(shè)計(jì)應(yīng)當(dāng)相當(dāng)嚴(yán)謹(jǐn),需將所有可能發(fā)生的事件及意外情況考慮在設(shè)計(jì)中。JAVA是基于虛擬機(jī)的半解釋型編譯系統(tǒng),其執(zhí)行效率較C++等完全編譯后的程序會(huì)低很多,程序如果不進(jìn)行精簡(jiǎn)和優(yōu)化,將可能導(dǎo)致運(yùn)行的不流暢。2.3.2用戶需求分析用戶對(duì)軟件產(chǎn)品也有一定的要求。1.簡(jiǎn)單易學(xué)開(kāi)發(fā)得不夠成功,從而失去大量的用戶。所以本項(xiàng)目必須擁有良好的交互界面,讓用戶安裝之后就能進(jìn)行游戲。2.運(yùn)行穩(wěn)定常不舒服,有可能就把軟件給卸載了,這樣也會(huì)失去很多用戶。3.操作簡(jiǎn)便便捷的操作接口來(lái)供用戶操作,靈活便捷的操作性直接影響了一款軟件的好壞。3.2.3功能需求分析本項(xiàng)目是一個(gè)運(yùn)行在Android手機(jī)上的游戲,所以在應(yīng)該實(shí)現(xiàn)以下功能。1.響應(yīng)鍵盤(pán)事件玩家可以從手機(jī)鍵盤(pán)或者觸屏開(kāi)始游戲,操控游戲。2.繪制游戲圖形界面7向北移動(dòng)。當(dāng)蛇頭碰到墻壁或者碰到自己的身體時(shí)游戲結(jié)束。3.記錄玩家分?jǐn)?shù)當(dāng)游戲結(jié)束后,顯示玩家在游戲中所獲得的分?jǐn)?shù)。44.1程序流程設(shè)計(jì)本游戲的流程如下圖4-1所示。NYNYYN4.2概要設(shè)計(jì)4.2.1模塊劃分模塊和控制模塊。游戲界面主框架的主要結(jié)構(gòu)圖如圖4-3所示。如圖4-44.3模塊實(shí)現(xiàn)原理4.3.1游戲界面模塊實(shí)現(xiàn)voidonStop()、voidonDestroy()2.實(shí)現(xiàn)蛇的身體蛇可以看做是一個(gè)個(gè)節(jié)點(diǎn)組成的,因此可以用一個(gè)鏈表來(lái)存儲(chǔ)蛇身的元素,在畫(huà)蛇時(shí)遍歷這個(gè)鏈表講里面的元素一一畫(huà)出,這樣就實(shí)現(xiàn)了一條蛇。3.實(shí)現(xiàn)蛇的移動(dòng)用一個(gè)timer(定時(shí)器)來(lái)不斷地刷新游戲畫(huà)面,每刷新一次就再蛇頭的前面(鏈表的尾部)增加一個(gè)新元素,同時(shí)把蛇尾的一個(gè)元素刪掉,這樣從視覺(jué)上看起來(lái)就實(shí)現(xiàn)了蛇的移動(dòng)。4.實(shí)現(xiàn)蛇吃食物蛇移動(dòng)的過(guò)程中如果蛇頭的坐標(biāo)與食物出現(xiàn)的坐標(biāo)重合了,那么就在蛇頭的位置增加一個(gè)元素同時(shí)不刪除蛇尾的最后一個(gè)元素,這樣蛇每遲到一個(gè)食物身體就會(huì)變長(zhǎng)一截。4.3.2游戲控制模塊實(shí)現(xiàn)1.實(shí)現(xiàn)操作蛇的移動(dòng)方向在Android在可以給對(duì)應(yīng)的按鈕設(shè)置監(jiān)聽(tīng)器OnClickListener,監(jiān)聽(tīng)器是一個(gè)接口,該接口中有一個(gè)方法onClick(Viewv)。當(dāng)按鈕被點(diǎn)擊的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用該監(jiān)聽(tīng)器的onClick(Viewv)方法。所以實(shí)現(xiàn)游戲控制的具體代碼將被寫(xiě)到該方法中。操作,所以需要用一個(gè)變量來(lái)記錄蛇頭的當(dāng)前方向。2.實(shí)現(xiàn)游戲暫停在Activity的生命周期中,有一個(gè)onPause()方法.該方法在Activity變得不可見(jiàn)的時(shí)候被系統(tǒng)自動(dòng)調(diào)用.在玩游戲過(guò)程中,如果有來(lái)電或是其它事件中斷,這時(shí)應(yīng)該把當(dāng)前狀態(tài)保存。以便返回時(shí),還可以繼續(xù)玩游戲。這就使用onSaveInstanceState實(shí)現(xiàn)保存當(dāng)前狀態(tài)。3.實(shí)現(xiàn)游戲恢復(fù)Activity生命周期的onResume()方法.該方法在Activity從不可見(jiàn)的狀態(tài)下變得可見(jiàn)時(shí)被系統(tǒng)自動(dòng)調(diào)用.在用戶接完電話或者在暫停狀態(tài)下觸摸屏幕后可以在該生命周期方法中對(duì)游戲進(jìn)行恢復(fù)。4.實(shí)現(xiàn)游戲退出當(dāng)一個(gè)Activity退出或者被調(diào)用finish()方法后,系統(tǒng)會(huì)調(diào)用其生命周期方法onDestroy().當(dāng)用戶退出游戲時(shí),可以在這個(gè)方法中對(duì)資源進(jìn)行釋放。4.3.3TileView類(lèi)的設(shè)計(jì)TileView是游戲的界限,即蛇頭若觸碰到界限則游戲結(jié)束。因?yàn)榻缦抟残枰滑F(xiàn)實(shí)到屏幕上,所以TileView需要繼承Android.view.View類(lèi)。Android.view.View類(lèi)是描繪塊狀視圖的基類(lèi)。View會(huì)繪制一個(gè)包含Drawing是event事件的方形塊。View是所有與用戶交互的組件的Widgets的基類(lèi)等),View的子類(lèi)ViewGroup是layouts類(lèi)可以包含其他的View/ViewGroup組件并且定義展示的屬性。實(shí)現(xiàn)一個(gè)View,首先需要實(shí)現(xiàn)框架中一些所有Views所有所有的方法,可以?xún)H僅重寫(xiě)onDraw(Android.graphics.Canvas)。4.3.4SnakeView類(lèi)的設(shè)計(jì)SnakeView的方法以及一些內(nèi)部類(lèi)。SnakeView的方法摘要。1.判斷按鍵的方法在Android得鍵值來(lái)判斷哪個(gè)鍵被按下了并采取相應(yīng)的動(dòng)作。2.設(shè)置提示信息的方法通過(guò)程序判斷動(dòng)態(tài)地設(shè)置用戶提示信息,如游戲結(jié)束。3.在隨機(jī)位置出現(xiàn)食物的方法物存在。4.刷新蛇的當(dāng)前位置的方法主要用于刷新蛇的當(dāng)前位置。5.判斷蛇是否吃到食物的方法相等的方法來(lái)判斷蛇是否吃到了食物。4.4程序主結(jié)構(gòu)本次所設(shè)計(jì)貪吃蛇游戲的程序主結(jié)構(gòu)如圖4-5所示。4.6.1Snake類(lèi)的詳細(xì)設(shè)計(jì)Snake類(lèi)是蛇頭以及蛇頭的控制部分,包括判斷newDirection和oldDirection是否為相反方向,用于選取有效方向。判斷蛇頭是否和蛇身的某向鍵,改變蛇頭的x、y的值,即改變方向。以及讓蛇不停走動(dòng)。Snake.javapublicclassTileViewextendsView{/***Parameterscontrollingthesizeofthetilesandtheirrangewithinview.*Width/Heightareinpixels,andDrawableswillbescaledtofittothese*dimensions.X/YTileCountsarethenumberoftilesthatwillbe??????protectedstaticint??????tilemXOffset//?*Ahashthatmapsintegerhandlesspecifiedbythesubclassertothe//tile???顣?tilebitmapmTileArray[1]?bitmap?/***Aofintegersinwhichthenumberrepresentsthe*indexofthetilethatshouldbedrawnatthatlocations*/????int[1][1]=0int[1][2]=1??privatefinalPaintmPaint=newPaint();//????????publicTileView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);//???TypeArraygoogle????google???飬????TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.TileView);a.recycle();a.recycle();/***ReststheinternalarrayofBitmapsusedfordrawingtiles,andsetsthe*maximumindexoftilestobeinserted*publicvoidresetTiles(inttilecount){mTileArray=newBitmap[tilecount];}?protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){mXTileCount=(int)Math.floor(w/mTileSize);mYTileCountfloormTileSize);=(int)Math.(h/mXOffset=((w-(mTileSizemXTileCountmYOffset=((h-(mTileSizemYTileCountmTileGrid=newint[clearTiles();*FunctiontosetthespecifiedDrawableasthetileforaparticular????Key????tile????tile*/publicvoidloadTile(intkey,Drawabletile){createBitmapmTileSizemTileSize,Bitmapbitmap=Bitmap.Bitmap.Config.ARGB_8888);tile.setBounds(0,0,tile.draw(canvas);/***Resetsalltilesto0(empty)**/forintx=;x<forinty=0;y<setTile(0,x,y);}/***Usedtoindicatethataparticulartile(setwithloadTileandreferenced*byaninteger)shouldbedrawnatthegivenx/ycoordinatesduring*nextinvalidate/drawcycle.tileindexmTil*///??????tiletiledrawcanvas??mXTileCount;x+=1){mYTileCount;y+=1){mXOffset+x*mTileSizemYOffset}}4.6.2TileView類(lèi)的詳細(xì)設(shè)計(jì)TileView是游戲的界限,即蛇頭若觸碰到界限則游戲結(jié)束。因?yàn)榻缦抟残枰滑F(xiàn)實(shí)到屏幕上,所以TileView需要繼承Android.view.View類(lèi)。Android.view.View類(lèi)是描繪塊狀視圖的基類(lèi)。View會(huì)繪制一個(gè)包含Drawing是event事件的方形塊。View是所有與用戶交互的組件的Widgets的基類(lèi)等),View的子類(lèi)ViewGroup是layouts類(lèi)可以包含其他的View/ViewGroup組件并且定義展示的屬性。實(shí)現(xiàn)一個(gè)View,首先需要實(shí)現(xiàn)框架中一些所有Views公用的方法。不必重寫(xiě)所有所有的方法,可以?xún)H僅重寫(xiě)。TileView.JavapublicclassTileViewextendsView{*Parameterscontrollingthesizeofthetilesandtheirrangewithin*Width/Heightareinpixels,andDrawableswillbescaledtofittothese*dimensions.X/YTileCountsarethenumberoftilesthatwillbe???????protectedstaticint??tilemXOffset//?*Ahashthatmapsintegerhandlesspecifiedbythesubclassertothe*drawablethatwillbeusedforthatreference*///tile???顣?tilebitmapmTileArray[1]??????bitmap?*Aofintegersinwhichthenumberrepresents*indexofthetilethatshouldbedrawnatthatlocations????int[1][1]=0int[1][2]=1??privatefinalPaintmPaint=newPaint();//????????publicTileView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);//???TypeArraygoogle????google???飬????a.recycle();a.recycle();*maximumindexoftilestobeinsertedpublicvoidresetTiles(inttilecount){mTileArray=newBitmap[tilecount];}?protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){mXTileCount=(int)Math.floor(w/mTileSize);mXOffset=((w-(mTileSizemXTileCountmYOffset=((h-(mTileSizemYTileCountmTileGrid=newint[clearTiles();/***FunctiontosetthespecifiedDrawableasthetileforaparticular*????Key????tile????tiledrawable???bitmappublicvoidloadTile(intkey,Drawabletile){createBitmapmTileSizemTileSize,Bitmapbitmap=Bitmap.Bitmap.Config.ARGB_8888);tile.setBounds(0,0,tile.draw(canvas);**//***Usedtoindicatethataparticulartile(setwithloadTileandreferenced*byaninteger)shouldbedrawnatthegivenx/ycoordinatesduringthe*nextinvalidate/drawcycle.*tileindexmTil?????*///??????tiletiledrawcanvas??mXTileCount;x+=1){mYTileCount;y+=1){mXOffset+x*mTileSizemYOffset}SnakeView的方法以及一些內(nèi)部類(lèi)。在Android得鍵值來(lái)判斷哪個(gè)鍵被按下了并采取相應(yīng)的動(dòng)作。2.設(shè)置提示信息的方法通過(guò)程序判斷動(dòng)態(tài)地設(shè)置用戶提示信息,如游戲結(jié)束。3.在隨機(jī)位置出現(xiàn)食物的方法物存在。4.刷新蛇的當(dāng)前位置的方法主要用于刷新蛇的當(dāng)前位置。5.判斷蛇是否吃到食物的方法相等的方法來(lái)判斷蛇是否吃到了食物。SnakeView.javapublicclassSnakeViewextendsTileViewimplementsOnClickListener{TAG*Currentmodeofapplication:READYtorun,RUNNING,oryouhavealready*lost.staticfinalintsareusedinsteadofanenumforperformanceREADY//PAUSEREADYpublicstaticfinalintpublicstaticfinalintpublicstaticfinalintpublicstaticfinalintRUNNINGLOSE/**NORTHSOUTH/***LabelsforthedrawablesthatwillbeloadedintotheTileViewclass*/RED_STAR=;//?tiledrawableRED_STAR?privatestaticfinalintYELLOW_STAR=2;*mScore:usedtotrackthenumberofapplescapturedmMoveDelay:numberof*millisecondsbetweensnakemovements.Thiswilldecreaseasapples//??//?*mLastMove:trackstheabsolutetimewhenthesnakelast*usedtodetermineifamoveshouldbemadebasedonmMoveDelay.*///privatelongmLastMove;?/***mStatusText:textshowstotheuserinsomerunstates*///?/***mSnakeTrail:alistofCoordinatesthatmakeupthesnake'sbody*secretlocationofthejuicyapplesthesnakecraves.*/privateArrayList<Coordinate>mSnakeTrail=newprivateArrayList<Coordinate>mAppleList=new/**RNGprivatestaticfinalRandom=newRandom();//*setourselvesasatargetandwecanusethesleep()functiontocausean*update/invalidatetooccuratalaterdate.andlerHandler?classRefreshHandlerextendsHandler{publicvoidhandleMessage(Messagemsg){SnakeView.this.update();SnakeView.this.invalidate();}publicvoidlongdelayMillis){this.removeMessages(0);**@paramcontext*@paramattrs*/publicSnakeView(Contextcontext,AttributeSetattrs,intdefStyle)Resourcesr=this.getContext().getResources();//tileresetTiles(4);loadTile(RED_STAR,r.getDrawable(R.drawable.redstar));loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar));loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar));//Fornowwe'rejustgoingtoloadupashortdefaulteastbound//Twoapplestostartwith//??/***GivenaArrayListofcoordinates,weneedtoflattenthemintoanarray*ofintsbeforewecanstuffthemintoamapforstorage.**@paramcvec*:aArrayListofCoordinateobjects*@return:asimplearrayx/yvaluesofthecoordinates[x1,y1,x2,y2,x3,y3...]??privateint[]coordArrayListToArray(ArrayList<Coordinate>cvec){intcount=cvec.size();int[]rawArray=newint[count*];forintindex=0;index<count;index++){Coordinatec=cvec.get(index);rawArray[2*index]=c.x;rawArray[2*index+1]=c.y;}/***Savegamestatesothattheuserdoesnotloseanythingifthegame*processiskilledwhileweareinthebackground.**@returnaBundlewiththisview'sstate*/map.putIntArray("mAppleList",map.putInt("mDirection",Integer.valueOf(mDirection));map.putInt("mNextDirection",Integer.valueOf(mNextDirection));map.putLong("mMoveDelay",Long.valueOf(mMoveDelay));map.putLong("mScore",Long.valueOf(mScore));map.putIntArray("mSnakeTrail",coordArrayListToArray(mSnakeTrail));returnmap;}/***Givenaflattenedarrayofordinatepairs,weintoprivateArrayList<Coordinate>coordArrayToArrayList(int[]rawArray)ArrayList<Coordinate>coordArrayList=newArrayList<Coordinate>();intcoordCount=rawArray.length;Coordinatec=newCoordinate(rawArray[index],rawArray[indexreturncoordArrayList;}/***Restoregamestateifourprocessisbeingrelaunched**@paramicicle*aBundlecontainingthegamestate*Сhomeг??*/publicvoidrestoreState(Bundleicicle){setMode(PAUSE);mAppleList=*handleskeyeventsinthegame.Updatethedirectionoursnakeis*travelingbasedontheDPAD.Ignoreeventsthatwouldcausethesnake**@seeandroid.view.View#onKeyDown(int,android.os.KeyEvent)*/publicbooleanonKeyDown(intkeyCode,KeyEventmsg){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){READYthebeginningofthegame,ortheendofapreviousone,*weshouldstartanewgame.*/thegameismerelypaused,weshouldjustcontinuewhere*weleftoff.*/if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){returnsuper.onKeyDown(keyCode,msg);/***SetstheTextViewthatwillbeusedtogiveinformation(suchaspublicvoidsetTextView(TextViewnewView){publicvoidsetStartButton(Buttonbutton){*Updatesthecurrentmodeoftheapplication(RUNNINGorPAUSEDorthe*like)aswellassetsthevisibilityoftextviewfornotification**@paramnewMode*??????*/RUNNING&oldMode!=RUNNING){Resourcesres=getContext().getResources();CharSequencestr="";str=res.getText(R.string.mode_pause);if(newMode==READY){str=res.getText(R.string.mode_ready);str=res.getString(R.string.mode_lose_prefix)+mScore+res.getString(R.string.mode_lose_suffix);/***Selectsarandomlocationwithinthegardenthatisnotcurrentlycovered*bythesnake.Currently_could_gointoaninfiniteloopifthesnake*currentlyfillsthegarden,butwe'llleavediscoveryofthisprizetoa*trulyexcellentsnake-player.**///ChooseanewlocationforourappleRNG.nextInt(mXTileCount-2);RNG.nextInt(mYTileCount-2);//Makesureit'snotalreadyunderthesnakebooleancollision=false;intsnakelength=mSnakeTrail.size();}//ifwe'rehereandthere'sbeennocollision,thenwehave//agoodlocationforanapple.Otherwise,we'llcircleback//andtryagaineTAGLog.(,"SomehowendedupwithanullnewCoord!");/***Handlesthebasicupdateloop,checkingtoseeifweareintherunning*state,determiningifamoveshouldbemade,updatingthesnake's*location.*/updateWalls();updateSnake();updateApples();setTile(*/for(Coordinatec:mAppleList){/***Figureoutwhichwaythesnakeisgoing,seeifhe's

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論