移動(dòng)終端開(kāi)發(fā)(Android)
結(jié)課報(bào)告
題目: Android小程序超級(jí)小貓
班級(jí):
姓名:
成績(jī):
一、項(xiàng)目概述
1、設(shè)計(jì)背景與意義
1.1 手機(jī)游戲的設(shè)計(jì)背景
自上世紀(jì)80年代第一部手機(jī)誕生以來(lái),隨著計(jì)算機(jī)技術(shù)的進(jìn)步,手機(jī)也經(jīng)歷了從模擬到GSM、2.5G再到今天的3G手機(jī)如此一個(gè)發(fā)展歷程。特別是進(jìn)入21世紀(jì)后手機(jī)的硬件性能得到很大的提高,當(dāng)前主流手機(jī)普遍配有主頻500MHZ的微處理器和500MB容量的存儲(chǔ)器。與之同步發(fā)展的還有支持手機(jī)運(yùn)行的手機(jī)操作系統(tǒng),從當(dāng)初的單片機(jī)系統(tǒng)到后來(lái)的專用嵌入式系統(tǒng),到后來(lái)開(kāi)始為智能手機(jī)設(shè)計(jì)開(kāi)發(fā)出可以更高效管理手機(jī)軟硬件資源的操作系統(tǒng),其中有不少屬于開(kāi)源項(xiàng)目的手機(jī)操作系統(tǒng)。目前全球的智能手機(jī)操作系統(tǒng)主要以Google公司開(kāi)發(fā)的Android系統(tǒng)、蘋(píng)果公司開(kāi)發(fā)的iPhone系統(tǒng)、諾基亞公司開(kāi)發(fā)的Symbian系統(tǒng)、微軟公司開(kāi)發(fā)的WindowsMobile系統(tǒng)和Linux系統(tǒng)為代表。從圖1.1為2011全球智能手機(jī)操作系統(tǒng)市場(chǎng)份額統(tǒng)計(jì),Android僅僅經(jīng)過(guò)兩三年的發(fā)展就搶占了43%的市場(chǎng)份額,并保持著2%的增長(zhǎng)速度。中國(guó)是最大的手機(jī)市場(chǎng),2011年的統(tǒng)計(jì)數(shù)據(jù)表明,Android已取代了iPhone成為中國(guó)市場(chǎng)額最大的智能手機(jī)操作系統(tǒng)。
圖1.1 2011全球智能手機(jī)操作系統(tǒng)市場(chǎng)份額統(tǒng)計(jì)
Android系統(tǒng)是Google公司于2007年推出的一款手機(jī)操作系統(tǒng),目前能安裝于HTC、摩托羅拉、聯(lián)想、華為等知名品牌手機(jī)。它是基于Linux2.6.1內(nèi)核的一個(gè)開(kāi)源手機(jī)操作系統(tǒng),目前最高版本為2.4,集成了GPS電子地圖導(dǎo)航、重力感應(yīng)器、多點(diǎn)觸控等重要功能,開(kāi)發(fā)者可以開(kāi)發(fā)出豐富的運(yùn)用。由于android智能手機(jī)操作系統(tǒng)是一個(gè)開(kāi)源項(xiàng)目,具有很強(qiáng)的開(kāi)放性和可擴(kuò)展性,吸引了大量的手機(jī)軟件開(kāi)發(fā)人員為這些手機(jī)系統(tǒng)開(kāi)發(fā)應(yīng)用軟件及休閑游戲,極大的豐富了手機(jī)功能。為服務(wù)廣大的開(kāi)發(fā)人員與谷歌手機(jī)用戶,谷歌公司在因特網(wǎng)搭建了一個(gè)應(yīng)用軟件商店。開(kāi)發(fā)人員開(kāi)發(fā)出的手機(jī)應(yīng)用軟件可以陳列于應(yīng)用軟件商店中供用戶挑選購(gòu)買,解決了軟件工程師最薄弱的軟件營(yíng)銷環(huán)節(jié),作為目前廣大手機(jī)軟件工程師最大的創(chuàng)收途徑而博得廣泛的熱衷。
電腦游戲是很多人不可或缺的娛樂(lè)活動(dòng),八九十年達(dá)的“貪吃蛇”和“超級(jí)瑪麗”給大家留下了歡樂(lè)的歡樂(lè)記憶,也為游戲創(chuàng)作者帶來(lái)了巨額財(cái)富。近二十年來(lái),隨著計(jì)算機(jī)硬件性能的提升及軟件開(kāi)發(fā)者的努力,游戲作品不論是創(chuàng)意還是視聽(tīng)感覺(jué)都有飛躍的發(fā)展。當(dāng)前電腦游戲行業(yè)非常繁榮,競(jìng)爭(zhēng)也非常激烈,隨著智能手機(jī)的問(wèn)世并普及,越來(lái)越多的游戲開(kāi)發(fā)人員把目光轉(zhuǎn)向了手機(jī)游戲這個(gè)新興的行業(yè)。
手機(jī)通常重量輕,隨身攜帶方便,現(xiàn)代人們壓力大,非常希望在工作之余,上下班途中可以通過(guò)娛樂(lè)來(lái)放松自己,此時(shí),手機(jī)游戲便能發(fā)揮出它輕松休閑的特點(diǎn)。受手機(jī)性能的制約,以往運(yùn)行于手機(jī)之上的游戲一般較為簡(jiǎn)單,但隨著微電子技術(shù)的發(fā)展,手機(jī)性能越來(lái)越優(yōu)良,現(xiàn)在已經(jīng)可以開(kāi)發(fā)出類似于PC機(jī)上的游戲。特別是隨著3G移動(dòng)網(wǎng)絡(luò)的迅猛發(fā)展,可以預(yù)料在十年之內(nèi)目前如火如荼的網(wǎng)絡(luò)游戲也將轉(zhuǎn)戰(zhàn)至手機(jī)平臺(tái)。
1.2 國(guó)內(nèi)外手機(jī)游戲的研究現(xiàn)狀
在手機(jī)應(yīng)用開(kāi)發(fā)領(lǐng)域當(dāng)前較為火熱的有J2ME語(yǔ)言、Object C語(yǔ)言和Android SDK。J2ME 作為Java2的一個(gè)組成部分,以其發(fā)展時(shí)間長(zhǎng)而成為較為普遍的技術(shù)。其最大的優(yōu)勢(shì)在于移植性強(qiáng),使用J2ME技術(shù)開(kāi)發(fā)的程序,可以經(jīng)過(guò)簡(jiǎn)單的修改以后,能在不同廠商的手機(jī)上運(yùn)行。同時(shí)由于Java語(yǔ)言的普及從而開(kāi)發(fā)周期大大縮短。但是,也因?yàn)榧骖櫼浦残?,?dǎo)致其開(kāi)發(fā)出的功能受到一定的限制,又因?yàn)槠溥\(yùn)行于JVM上并受手機(jī)性能的影響所以運(yùn)行速度普遍較慢。Object C語(yǔ)言基于標(biāo)準(zhǔn)的ANSI C,其語(yǔ)法源于Smalltalk消息傳遞風(fēng)格,作為iPhone手機(jī)上的標(biāo)準(zhǔn)開(kāi)發(fā)語(yǔ)言而受到青睞。相對(duì)于J2ME最大特點(diǎn)是軟件運(yùn)行效率高速度快,界面也繼承了蘋(píng)果的華麗風(fēng)格,遺憾的是開(kāi)發(fā)出的應(yīng)用軟件只能運(yùn)行于iPhone手機(jī)上。谷歌與開(kāi)發(fā)手機(jī)聯(lián)盟合作開(kāi)發(fā)的Android SDK是近兩年誕生的充滿活力和生命力的手機(jī)開(kāi)發(fā)語(yǔ)言,是一個(gè)標(biāo)準(zhǔn)的、開(kāi)放的移動(dòng)電話軟件平臺(tái),不存在任何以往那種阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙。相對(duì)于其他開(kāi)發(fā)語(yǔ)言,Android最大的優(yōu)點(diǎn)就是開(kāi)放性,吸引了眾多的開(kāi)發(fā)者的支持,短短兩年時(shí)間開(kāi)發(fā)出大量的手機(jī)應(yīng)用軟件,豐富了手機(jī)的應(yīng)用功能。另外對(duì)網(wǎng)絡(luò)友好,支持大部分網(wǎng)絡(luò)功能,并與Google應(yīng)用無(wú)縫結(jié)合,可以輕松獲取Google服務(wù)。
圖1.2 2011年中國(guó)移動(dòng)應(yīng)用超市各類手機(jī)軟件下載比例
Android和手機(jī)應(yīng)用市場(chǎng)正處于起步階段,市場(chǎng)和消費(fèi)者需要個(gè)接受的過(guò)程,眾多開(kāi)發(fā)者也都在積極探索盈利模式。Android開(kāi)發(fā)者實(shí)現(xiàn)盈利主要依賴兩方面因素,一是全球Android手機(jī)終端的爆發(fā),另外就是海外付費(fèi)應(yīng)用程序的模式逐漸形成。目前Android應(yīng)用開(kāi)發(fā)個(gè)人或團(tuán)體雖未取得規(guī)模盈利,但也開(kāi)始逐漸向盈利模式轉(zhuǎn)移,獲得不錯(cuò)收益。圖1.2是中國(guó)移動(dòng)應(yīng)用軟件超市2011年的統(tǒng)計(jì)數(shù)據(jù),消費(fèi)者下載量最高的依然是應(yīng)用開(kāi)發(fā),其次便是游戲開(kāi)發(fā),占據(jù)39%的下載量,而傳統(tǒng)的增值業(yè)務(wù)則只占5%,在移動(dòng)互聯(lián)網(wǎng)時(shí)代,開(kāi)發(fā)者紛紛逃離營(yíng)運(yùn)商的束縛,轉(zhuǎn)向利潤(rùn)較為豐厚的應(yīng)用程序和游戲開(kāi)發(fā)。由此圖也可以看出手機(jī)游戲軟件在消費(fèi)者中的受歡迎程度,如果想在未來(lái)手機(jī)應(yīng)用程序開(kāi)發(fā)中實(shí)現(xiàn)規(guī)模則需要加大手機(jī)游戲方面的開(kāi)發(fā)力度。
目前在手機(jī)上開(kāi)發(fā)出較為成功的游戲主要有FTG格斗游戲、PUZ益智類游戲、RPG角色扮演游戲、SLG模擬/戰(zhàn)棋式戰(zhàn)略游戲以及體感游戲和寵物養(yǎng)成游戲六類。其中格斗游戲誕生于街機(jī),曾經(jīng)的“街霸”是其典型代表。FTG系統(tǒng)的核心是對(duì)戰(zhàn)斗部分進(jìn)行碰撞檢測(cè)計(jì)算。益智游戲最大的創(chuàng)意是其游戲規(guī)則,玩家需要以自己的智慧對(duì)游戲規(guī)則進(jìn)行思考,判斷從而通關(guān)以獲得成就感。PUZ游戲?qū)ν婕也僮饕蟛桓呤鞘謾C(jī)游戲中受眾面最廣的游戲,最具代表是“推箱子”。角色扮演游戲是最能與用戶共鳴的游戲,開(kāi)啟了一扇通往虛擬現(xiàn)實(shí)的大門,可以讓玩家沉浸于打怪升級(jí)的快樂(lè)之中,“仙劍奇?zhèn)b傳”是其經(jīng)典代表。RPG游戲的核心是代表玩家角色成長(zhǎng)的升級(jí)系統(tǒng),游戲都貫穿一個(gè)故事情節(jié),所以其創(chuàng)意是多元的、立體的,讓開(kāi)發(fā)者有更廣闊的創(chuàng)作空間。戰(zhàn)棋類游戲是玩家在虛擬地圖上指揮一定角色與敵方展開(kāi)戰(zhàn)斗,典型的有“地雷戰(zhàn)”。體感游戲主要依賴手機(jī)中的重力感應(yīng)等裝置開(kāi)發(fā)出的新型游戲,玩家可以通過(guò)搖晃、旋轉(zhuǎn)、移動(dòng)等動(dòng)作來(lái)操作游戲。寵物養(yǎng)成游戲則因?yàn)槠淙诵曰螒蚯楣?jié)而吸引人們注意力。
手機(jī)游戲研發(fā)的重點(diǎn)是游戲情節(jié)和游戲界面。游戲情節(jié)的創(chuàng)作依賴人的想象力和創(chuàng)造力,主題及素材可以來(lái)源于熱門小說(shuō)也可來(lái)古老傳說(shuō),例如中國(guó)的經(jīng)典名著“三國(guó)志”被日本光榮公司搬去后創(chuàng)作出名噪一時(shí)的經(jīng)典同名游戲。還有著名網(wǎng)絡(luò)小說(shuō)“誅仙”也被創(chuàng)作為當(dāng)前流行的同名網(wǎng)絡(luò)游戲。這些文學(xué)作品為手機(jī)游戲的開(kāi)發(fā)提供了大量的可創(chuàng)作素材。同時(shí),行業(yè)競(jìng)爭(zhēng)的激烈也導(dǎo)致雷同的不少游戲情節(jié)出現(xiàn),這就要求創(chuàng)作人員不斷發(fā)揮才能,構(gòu)思出更加豐富的游戲主題。游戲界面方面隨著手機(jī)性能不斷提高的影響,也愈加華麗。從當(dāng)初粗糙單色的俄羅斯方塊到后來(lái)顏色豐富的2D游戲,再到現(xiàn)在開(kāi)始流行的極具立體效果的3D游戲。游戲的操縱方面也有革命性發(fā)展,從最初按鍵操縱到后來(lái)的屏幕多點(diǎn)觸控再發(fā)展到重力感應(yīng)操縱。
1.3 本課題研究的目的、意義及研究?jī)?nèi)容
由于本人對(duì)游戲的酷愛(ài)、對(duì)代碼的敏感和對(duì)童年紅白機(jī)時(shí)代游戲的懷念,在Android平臺(tái)下通過(guò)掌握的Java語(yǔ)言基礎(chǔ)和對(duì)Android知識(shí)的深入學(xué)習(xí),研究并開(kāi)發(fā)了一款益智闖關(guān)類游戲“超級(jí)小貓”,并通過(guò)整個(gè)學(xué)習(xí)、設(shè)計(jì)和實(shí)現(xiàn)的過(guò)程,能提高自己的代碼量和讀寫(xiě)代碼能力,為以后步入Android應(yīng)用開(kāi)發(fā)工作打下基礎(chǔ)。
- 設(shè)計(jì)功能
2.1.1 需求
功能:實(shí)現(xiàn)主人公小貓的前進(jìn)、跳躍、頂金幣、頂磚塊、踩敵人、吃道具等功能并有關(guān)卡設(shè)置。
操作:設(shè)置屏幕虛擬鍵,使玩家通過(guò)觸控虛擬鍵對(duì)小貓的操作。
音效:游戲有背景音樂(lè),按鈕、跳躍和死亡音效。
動(dòng)畫(huà)效果:主人公和敵人的移動(dòng)過(guò)程、死亡后的效果,磚塊及問(wèn)號(hào)被頂后的效果。
2.1.2開(kāi)發(fā)環(huán)境
硬件:Microsoft Windows 7操作系統(tǒng)
IDE: Eclipse
版本:Android2.2
2.1.3游戲設(shè)計(jì)思想和模塊劃分
本游戲采用Java面向?qū)ο笏枷?,將游戲中所有的?duì)象通過(guò)劃分模塊進(jìn)而創(chuàng)建各自的類。設(shè)計(jì)初期,通過(guò)對(duì)程序需求的分析,劃分了游戲背景模塊、游戲控制模塊,游戲地圖模塊、道具模塊、特效模塊、玩家模塊和敵人模塊主要幾個(gè)模塊。而后,通過(guò)幾大模塊,對(duì)游戲中的對(duì)象歸類,通過(guò)不斷的補(bǔ)充各個(gè)類的屬性,完善程序。
道具模塊
背景模塊
特效模塊
控制模塊
地圖模塊
敵人模塊
玩家模塊
圖3.2程序模塊圖
2.1.4游戲具體設(shè)計(jì)
1.游戲背景模塊
該模塊主要實(shí)現(xiàn)了游戲公共背景,包括天空不斷漂浮的白云,主程序顯示的分?jǐn)?shù)、金幣個(gè)數(shù)、時(shí)間、小山和大山,虛擬鍵左、右、上、音樂(lè)開(kāi)、音樂(lè)關(guān)、退出游戲。由BG類和JOY類實(shí)現(xiàn)。
BG類
該類負(fù)責(zé)畫(huà)出分?jǐn)?shù)、金幣個(gè)數(shù)、時(shí)間、小山、大山和不斷漂浮的3朵白云,之所以要把這些對(duì)象放入一個(gè)bg類中,是由于它們都是一旦繪制出來(lái)就成系統(tǒng)本身的了,不受玩家控制而影響。而把受玩家控制的公共背景對(duì)象寫(xiě)入其他類中。金幣圖片是一個(gè)幀動(dòng)畫(huà)播放位圖,大、小山是用for循環(huán)有規(guī)律的畫(huà)入畫(huà)布中,白云的繪入是靜態(tài)的,但通過(guò)讓其橫坐標(biāo)變化和for語(yǔ)句判斷來(lái)實(shí)現(xiàn)循環(huán)在頁(yè)面漂浮的效果。實(shí)現(xiàn)代碼如下:
public void upData()
{//分別以1和2的速度循環(huán)移動(dòng)
yunX1-=2;
if(yunX1<-50)
{
yunX1=490;
}
yunX2-=1;
if(yunX2<-50)
{
yunX2=490;
}
yunX3-=2;
if(yunX3<-50)
{
yunX3=490;
}
}
JOY類
在此類中畫(huà)出虛擬鍵左、右、上、音樂(lè)開(kāi)、音樂(lè)關(guān),并加入觸屏監(jiān)聽(tīng)方法。觸屏的監(jiān)聽(tīng)是一個(gè)難點(diǎn),要精確計(jì)算出所繪圖片寬高像素大小和玩家點(diǎn)擊屏幕范圍,這樣才能準(zhǔn)確監(jiān)聽(tīng)到玩家所需的操作。
2.游戲控制模塊
該模塊主要實(shí)現(xiàn)了讓游戲能按照預(yù)期的順序播放畫(huà)面,綜合了游戲用到的所有類,根據(jù)狀態(tài)執(zhí)行各個(gè)類的線程。由MC類實(shí)現(xiàn)。
MC類
該類繼承了Android中的SurfaceView繪圖類,實(shí)現(xiàn)Runnable接口。該類引用了整個(gè)程序的所有類。創(chuàng)建初期,定義狀態(tài)標(biāo)識(shí)線程執(zhí)行順序即頁(yè)面切換,是通過(guò)后續(xù)類的完成進(jìn)而對(duì)MC類的補(bǔ)充完成。
3.游戲地圖模塊
該模塊實(shí)現(xiàn)了游戲地圖信息的保存,增加了游戲的擴(kuò)展性。由map類和TiledMap類實(shí)現(xiàn),地圖信息保存在一個(gè)二維數(shù)組中位圖大小經(jīng)過(guò)處理為16*16,屏幕寬為480,高為320,即地圖信息為20行,列根據(jù)關(guān)卡的長(zhǎng)度自定。
4.道具模塊
該模塊中實(shí)現(xiàn)了游戲中道具毒蘑菇的控制。由類DJ類實(shí)現(xiàn),主要控制毒蘑菇的移動(dòng)方法和碰撞檢測(cè)。
5.特效模塊
該模塊實(shí)現(xiàn)了公共圖片金幣的動(dòng)畫(huà)效果、游戲主人公死亡后顯示圖片效果、碰到毒蘑菇顯示圖片效果、殺死敵人后敵人消失效果、碰撞普通磚塊后的爆炸效果、碰撞問(wèn)號(hào)磚塊后彈出金幣效果。主要由TX、TX1、TX2、TX3、TX4、TX5、TXManager幾個(gè)類分別實(shí)現(xiàn)。
6.玩家模塊
該模塊實(shí)現(xiàn)了游戲主人公在場(chǎng)景中根據(jù)玩家的控制自由移動(dòng)的功能。由Player類實(shí)現(xiàn)。是游戲設(shè)計(jì)的難點(diǎn)。
7.敵人模塊
該模塊實(shí)現(xiàn)了游戲中所有敵人的控制。由NPC、NPC01、NPC02、NPC03、NPC04_guike、NPCManager幾個(gè)類分別實(shí)現(xiàn)。
2.2游戲設(shè)計(jì)過(guò)程中遇到的問(wèn)題和技術(shù)難點(diǎn)
2.2.1圖片問(wèn)題
為了游戲美觀和地圖設(shè)計(jì)的方便,要把圖片處理成跟屏幕分辨率寬高都成比例,借助Batch Image Resizer和PS圖片處理工具分別對(duì)游戲素材進(jìn)行縮放和去除圖片背景的操作。游戲中的主人公是位圖播放,Android中提供給我們播放幀動(dòng)畫(huà)的方法。在繪圖中,Android中的繪圖類SurfaceView,默認(rèn)采用雙緩沖技術(shù),保證了屏幕不出現(xiàn)閃爍現(xiàn)象。
2.2.2控制問(wèn)題
游戲的控制分為系統(tǒng)控制和玩家控制,由系統(tǒng)控制的只需設(shè)置其相應(yīng)的方法,在需要的時(shí)候執(zhí)行相應(yīng)的線程。由玩家控制的主要是對(duì)主人公的移動(dòng)控制,在編寫(xiě)代碼的過(guò)程中,左、右移動(dòng)相對(duì)簡(jiǎn)單,讓它跳起來(lái)一度用了不少時(shí)間學(xué)習(xí),對(duì)跳躍加入重力引擎方法 成功解決了實(shí)現(xiàn)跳躍高度一定,速度變化,有真實(shí)感的跳躍動(dòng)作。
2.2.3碰撞檢測(cè)
游戲的核心重點(diǎn)在于碰撞檢測(cè)方法的編寫(xiě),即使繪圖再美,玩家控制的再好,到了不該過(guò)去的地方照樣過(guò)去,失去了游戲的規(guī)則。碰撞檢測(cè)包括,游戲主人公與敵人的碰撞、主人公與障礙物的碰撞、敵人與障礙物的碰撞、道具與主人公的碰撞
玩
家
玩
家
玩
家
16*16 16*16
①
障礙物
③
玩
家
② ③
④
圖3.3碰撞檢測(cè)示意圖
由圖3.3表示,主人公與障礙物的碰撞,當(dāng)在范圍①時(shí),表示在障礙物上面,可以站在上面進(jìn)行跳的動(dòng)作,否則就是在空中,進(jìn)行下降的動(dòng)作。當(dāng)跳到④的范圍時(shí),表示玩家與障礙物碰撞,障礙物執(zhí)行自己的方法(消失或者變化),玩家自由下落。主人公與敵人的碰撞中,當(dāng)主人公在范圍①—④時(shí)出于碰撞的臨界點(diǎn),碰撞后玩家和敵人執(zhí)行自己的方法(死亡圖片或者爆炸消失)。敵人與主人公的碰撞與主人公與障礙物的碰撞類似,道具與主人公的碰撞與主人公與敵人碰撞類似。
2.2.4音效控制
在本程序中對(duì)主人公的跳躍,死亡,點(diǎn)擊主菜單按鈕都加入了音效,此外游戲中還有背景音樂(lè)。這個(gè)功能的實(shí)現(xiàn)用了Android中的SoundPool和Mediaplayer,前者控制音效,后者控制背景音樂(lè)。部分代碼如下:
主控制類MC中聲明
//聲明SoundPool
static SoundPool sp;
//記錄背景音樂(lè)文件id
static int soundId_long;
//記錄死亡音樂(lè)文件id
static int death;
//記錄點(diǎn)擊菜單音樂(lè)文件id
static int press;
//聲明一個(gè)音樂(lè)播放器
private static MediaPlayer mediaplayer;
主方法中
//實(shí)例SoundPool播放器
setSp(new SoundPool(4, AudioManager.STREAM_MUSIC, 100));
//加載音樂(lè)文件獲取其數(shù)據(jù)ID
//跳躍音效的初始化
setSoundId_long(getSp().load(context, R.raw.jump, 1));
//死亡音效的初始化
death = sp.load(context, R.raw.dead, 1);
//點(diǎn)擊音效的初始化
press = sp.load(context, R.raw.coin, 1);
//背景音樂(lè)的初始化
setMediaplayer(MediaPlayer.create(context, R.raw.mario));
//設(shè)置循環(huán)播放
getMediaplayer().setLooping(true);
(new Thread(this)).start() ;
然后分別在事件響應(yīng)中加入響應(yīng)方法。
//點(diǎn)擊音樂(lè)開(kāi)時(shí)
if(joy.music1down==true)
{
MC.getMediaplayer().start();}
//點(diǎn)擊音樂(lè)關(guān)時(shí)
if(joy.music2down==true){
MC.getMediaplayer().pause();
}
在Player類中加入
//當(dāng)點(diǎn)擊跳躍鍵時(shí)
if(joy.up_down==true){
m=1;
vy=-18;
//狀態(tài)為跳躍
changeFS(2);
//此時(shí)加入點(diǎn)擊音效
MC.sp.play(MC.getSoundId_long(), 1f, 1f, 0, 0, 1); }
2.2.5頁(yè)面控制
為了實(shí)現(xiàn)能按照流程執(zhí)行,在主控制類MC中用
switch(CanvasIndex){ case:
Berak;}語(yǔ)句對(duì)頁(yè)面進(jìn)行的切換控制。根據(jù)各個(gè)頁(yè)面時(shí)時(shí)反饋的CanvasIndex值確定跳入哪一個(gè)頁(yè)面。CanvasIndex值設(shè)置為0、5、10、15、20、25、30、35、40分別代表幫助頁(yè)面 、logo頁(yè)面、主頁(yè)面、加載頁(yè)面、主程序頁(yè)面、結(jié)束頁(yè)面、第二關(guān)切換頁(yè)面、第二關(guān)加載頁(yè)面、第二關(guān)主頁(yè)面。用switch控制能簡(jiǎn)單有效的切換到下一個(gè)頁(yè)面而退出上一個(gè)頁(yè)面。
2.3 開(kāi)發(fā)過(guò)程簡(jiǎn)述
游戲的開(kāi)發(fā)不同于應(yīng)用開(kāi)發(fā),游戲里面更多的用了繪圖方法和游戲算法,所涉及的類不是分步一個(gè)一個(gè)寫(xiě)出來(lái)的,很多都是同時(shí)創(chuàng)建的,并且經(jīng)過(guò)無(wú)數(shù)次的調(diào)試 。類中的屬性也是時(shí)時(shí)根據(jù)需要添加進(jìn)去的,使其功能逐步完善。在次過(guò)程中通過(guò)學(xué)習(xí)相關(guān)內(nèi)容,閱讀相關(guān)代碼,不斷的嘗試和失敗中找到屬于自己的編寫(xiě)風(fēng)格,應(yīng)用到實(shí)例開(kāi)發(fā)中。
二、項(xiàng)目設(shè)計(jì)
要求:描述設(shè)計(jì)的設(shè)計(jì)思路與設(shè)計(jì)過(guò)程,例如,界面包括什么布局、組件;功能實(shí)現(xiàn)如果操作:哪個(gè)組件什么事件、事件處理是什么響應(yīng)
1、程序分析和具體實(shí)現(xiàn)
1.1游戲Logo頁(yè)面
程序中有個(gè)logo類,該類負(fù)責(zé)繪制logo頁(yè)面,頁(yè)面狀態(tài)為5,程序主控制類MC默認(rèn)設(shè)置狀態(tài)為5即打開(kāi)程序后就顯示logo頁(yè)面。在這個(gè)類中加入了漸變效果。如圖1.1:
圖1.1
public void render(Canvas g)
{
Paint paint=new Paint();
paint.setColor(0xff000000);
g.drawRect(0,0,480,320, paint);
paint.setAlpha(a);
g.drawBitmap(im, 30,0, paint);
}
public void upData()
{
t ;
if(t>150)
{a-=10}
if(a<=0)
{ a=0;
MC.CanvasIndex=10;
t=0;
}
在480*320的畫(huà)布上面繪制logo頁(yè)面背景圖片,由a值控制顯示,下面的線程方法中,用for語(yǔ)句控制a值,t 直到150,這個(gè)是圖片漸漸出現(xiàn)的效果,當(dāng)t>150時(shí),a-=10,這個(gè)是圖片漸漸消失的效果,整個(gè)過(guò)程大約有5秒鐘,然后自動(dòng)跳轉(zhuǎn)到游戲主菜單。
1.2游戲主菜單分析
程序中CanvasMain類實(shí)現(xiàn)了主菜單的功能。有開(kāi)始游戲按鈕和游戲幫助按鈕,開(kāi)始游戲按鈕使用了圖片閃爍播放效果。效果如圖1.2所示:
圖1.2
if(t%5==0)
{g.drawBitmap(im1,185,180,paint);
}
public void upData()
{t ;
if(t>5){
t=0;}}
用了if語(yǔ)句判斷,使圖片交替出現(xiàn),達(dá)到閃爍效果,增加美感。對(duì)按鈕的監(jiān)聽(tīng)是用了Android中的觸屏監(jiān)聽(tīng)方法,監(jiān)聽(tīng)玩家點(diǎn)到屏幕的范圍判斷操作。
//按鍵監(jiān)聽(tīng)
public void penDown(float _x,float _y)
{ //判斷是否點(diǎn)擊圖片區(qū)域坐標(biāo)
if(Math.abs(240-_x)<40&&Math.abs(193-_y)<40){
//游戲開(kāi)始,初始化游戲數(shù)據(jù)
CanvasUI.jinbiCount=0;
CanvasUI.life=3;
CanvasUI.score=0;
CanvasUI.time=0;
//跳轉(zhuǎn)頁(yè)面到Loading
MC.CanvasIndex=15;
}
if(Math.abs(240-_x)<40&&Math.abs(280-_y)<40)
{//播放音效
MC.sp.play(MC.press, 1f, 1f, 0, 0, 1);
MC.CanvasIndex=0;
}
}}
其中if(Math.abs(240-_x)<40&&Math.abs(193-_y)<40)
和if(Math.abs(240-_x)<40&&Math.abs(280-_y)<40)
兩個(gè)if語(yǔ)句經(jīng)過(guò)仔細(xì)計(jì)算后得出的,即在按鈕大小的范圍內(nèi),方便能準(zhǔn)確監(jiān)聽(tīng)到用戶操作。當(dāng)點(diǎn)擊開(kāi)始游戲時(shí),初始化游戲數(shù)據(jù),設(shè)定狀態(tài)變量MC.CanvasIndex=15,傳給MC,告訴MC應(yīng)該顯示開(kāi)始游戲的頁(yè)面了。同理,點(diǎn)擊 游戲幫助時(shí),由MC控制顯示幫助頁(yè)面。效果如圖1.3所示:
圖1.3
1.3 開(kāi)始游戲過(guò)程的后臺(tái)邏輯
當(dāng)玩家點(diǎn)擊開(kāi)始游戲后,玩家看到的只有一個(gè)載入頁(yè)面,顯示的是玩家現(xiàn)在人數(shù),而后臺(tái)要經(jīng)過(guò)迅速的線程加載。在MC類中實(shí)現(xiàn)。首先,響應(yīng)的是Loading類,如下圖1.4所示:
圖 1.4
初始化地圖信息、人物信息、敵人信息、道具信息,隨后修改狀態(tài)變量CanvasIndex值為20,傳給MC,
case 20:
if(joy.music1down==true)
{
//開(kāi)始背景音樂(lè)
MC.getMediaplayer().start();
}
if(joy.music2down==true)
{
//暫停背景音樂(lè)
MC.getMediaplayer().pause();
} //執(zhí)行公共圖片繪制
joy.upData();
//執(zhí)行Player線程
p.upData(this,joy,mp,tm,dm,nm);
//執(zhí)行地圖線程
mp.upData(p, cx, cy);
//執(zhí)行背景線程
bg.upData();
//執(zhí)行地圖線程
btm.upData(p, cx, cy,mp,nm,tm);
//執(zhí)行道具線程
dm.upData(mp,p, tm);
//執(zhí)行特效線程
tm.upData(mp,tm,p);
//執(zhí)行勝利線程
win.upData(p, cx, cy);
//執(zhí)行敵人線程
nm.upData(mp,cx,p,tm);
//執(zhí)行主頁(yè)面線程
cui.upData(p,tm);
//跳出
break;
效果如圖1.5所示:
圖 1.5
三、項(xiàng)目代碼
要求:項(xiàng)目的核心代碼:并在相關(guān)功能模塊處添加功能說(shuō)明及注釋
- 布局文件代碼
//開(kāi)始游戲布局文件
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:dlc=”http://schemas.android.com/apk/res/com.dlc.finaldesign”
xmlns:tools=”http://schemas.android.com/tools”
android:id=”@ id/rl_gamecenter_main”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”@drawable/bg_gradient_color_lightblue”
android:orientation=”vertical” >
<!– 底部工具欄,里面有四個(gè)圖片按鈕 –>
<LinearLayout
android:id=”@ id/rl_gamecenter_bottom”
android:layout_width=”match_parent”
android:layout_height=”60dp”
android:layout_alignParentBottom=”true”
android:background=”@drawable/bg_gradient_color_blue”
android:orientation=”horizontal” >
<com.dlc.finaldesign.ui.view.ChangeColorIconWithTextView
android:id=”@ id/ccitv_gamecenter_indicator_notify”
android:layout_width=”0dp”
android:layout_height=”fill_parent”
android:layout_weight=”1″
android:padding=”5dp”
dlc:icon=”@drawable/tab_mygames”
dlc:text=”我的游戲”
dlc:text_size=”12sp” />
<com.dlc.finaldesign.ui.view.ChangeColorIconWithTextView
android:id=”@ id/ccitv_gamecenter_indicator_games”
android:layout_width=”0dp”
android:layout_height=”fill_parent”
android:layout_weight=”1″
android:padding=”5dp”
dlc:icon=”@drawable/tab_gamehome”
dlc:text=”游戲首頁(yè)”
dlc:text_size=”12sp” />
<com.dlc.finaldesign.ui.view.ChangeColorIconWithTextView
android:id=”@ id/ccitv_gamecenter_indicator_more”
android:layout_width=”0dp”
android:layout_height=”fill_parent”
android:layout_weight=”1″
android:padding=”5dp”
dlc:icon=”@drawable/tab_moregame”
dlc:text=”更多”
dlc:text_size=”12sp” />
</LinearLayout>
<!– ViewPager –>
<!– 計(jì)算相對(duì)位置時(shí),需要定位的布局需要計(jì)算好高度 –>
<RelativeLayout
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:layout_above=”@id/rl_gamecenter_bottom”
android:layout_alignParentTop=”true”
android:orientation=”vertical” >
<com.dlc.finaldesign.ui.view.MyViewPager
android:id=”@ id/mvp_gamecenter_main”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:layout_gravity=”center”
android:background=”#eee” >
</com.dlc.finaldesign.ui.view.MyViewPager>
</RelativeLayout>
</RelativeLayout>
2、類文件代碼
//Player類(核心類)
public class Player extends MySprite {
public static final int SPEED = 5;
// 定義水平移動(dòng)速度,和垂直速度
float vx, vy;
float vy1; // 優(yōu)化碰撞檢測(cè)
int m;
// 定義瑪麗死亡,默認(rèn)為不死
boolean PlayerIsDead = false;
boolean ishitUp; // 碰撞金幣磚塊
boolean isDead; // 死亡判斷
// 定義是否創(chuàng)建對(duì)象,包括敵人,障礙物等
boolean HaveCreate;
// 定義判斷是否過(guò)關(guān)
boolean nextLevel;
// 為瑪麗的狀態(tài)定義二維數(shù)組
static int[][] fsData = new int[][] { { 0 },// 等待
{ 0, 0, 1, 1 },// 行走
{ 2 },// 跳躍
{ 3 } // 死亡
};
// 根據(jù)瑪麗的狀態(tài)繪圖
public Player(Bitmap im, float x, float y) {
super(im, fsData, 0, 0, x, y, 31, 37, -15, -37);
// 默認(rèn)初始移動(dòng)速度為0
vx = vy = 0;
m = 0;
vy1 = 0;
// 定義默認(rèn)值
PlayerIsDead = false;
ishitUp = false;
isDead = false;
HaveCreate = false;
nextLevel = false;
}
// 創(chuàng)建游戲邏輯方法
public void upData(MC mc, JOY joy, map mp, TXManager tm, DJManager dm,
NPCManager nm) {
this.nextFream();
// 接收參數(shù)m判斷
if (m < 3) {
x = vx;
// 定義瑪麗移動(dòng)的前提
if (m == 0 || isDead == false || PlayerIsDead == false) {
// 左箭頭被點(diǎn)的時(shí)候
if (joy.leftdown == true) {
this.f = true;
x -= SPEED;
// 碰撞檢測(cè)方法
if (mp.isHit(x – 7, y – 18) > 0
|| mp.isHit(x – 7, y – 26) > 0
|| mp.isHit(x – 7, y – 10) > 0) {
x = SPEED;
}
if (x – mc.cx < 0) {
x = SPEED;
}
}
// 右箭頭被點(diǎn)
if (joy.rightdown == true) {
this.f = false;
x = SPEED;
// 碰撞檢測(cè)方法
if (mp.isHit(x 7, y – 18) > 0
|| mp.isHit(x 7, y – 26) > 0
|| mp.isHit(x – 7, y – 10) > 0) {
x -= SPEED;
}
if (x – mc.cx > 250 && mc.cx – 480 < 4318) {
mc.cx = SPEED;
}
}
// 點(diǎn)擊退出的方法
// if(joy.quit_down==true)
// {
// // 關(guān)閉程序的方法,0是關(guān)閉
// System.exit(0);
// }
// 接收參數(shù)m的值判斷
if (m == 0) {
// 點(diǎn)擊上箭頭的方法
if (joy.up_down == true) {
m = 1;
vy = -18;
// 狀態(tài)為跳躍
changeFS(2);
// 此時(shí)加入點(diǎn)擊音效
MC.sp.play(MC.getSoundId_long(), 1f, 1f, 0, 0, 1);
// 判斷是否把位圖置反
if (f == false) {
vx = 3;
} else {
vx = -3;
}
}
}
if (x – mc.cx > 250) {
mc.cx = 3;
}
}
}
switch (m) {
case 0:
if (mp.isHit(x, y) <= 0 || mp.isHit(x 5, y) <= 0
|| mp.isHit(x – 5, y) <= 0) {
m = 1;
// 狀態(tài)為跳躍
this.changeFS(2);
vy = 0;
}
break;
case 1: // 跳躍 重力引擎
y = vy;
vy = 2;
if (vy >= 15) {
vy = 15;
}
if (isDead == false) {
if (y > 400) {
tm.create(1, x 25, 236, 30);
isDead = true;
vx = 0;
}
}
if (vy > 0) {
if (mp.isHit(x, y) > 0 || mp.isHit(x – 5, y) > 0
|| mp.isHit(x 5, y) > 0) {
m = 0;
vx = 0;
// 狀態(tài)為行走
this.changeFS(1);
y = ((int) y / mp.h) * mp.h 1;
}
} else {
// 與問(wèn)號(hào)碰撞檢測(cè)的方法
if (mp.isHit(x, y – 37) > 0 || mp.isHit(x – 5, y – 37) > 0
|| mp.isHit(x 5, y – 37) > 0) {
if (mp.isHit(x, y – 37) == 2) {
mp.map[((int) y – 37) / mp.h][(int) x / mp.w] = 0;
tm.create(4, ((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h – 8, 6);// 生成金幣特效
tm.create(
3, // 在玩家頂?shù)降奈恢梅胖锰匦Тu
((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h 8, 5);
}
// 與磚塊碰撞檢測(cè)方法
if (mp.isHit(x, y – 37) == 3) {
mp.map[((int) y – 37) / mp.h][(int) x / mp.w] = 0;
tm.create(5, ((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h 8, 5);// 生成磚塊爆炸碎片
}
// 與有毒的蘑菇碰撞檢測(cè)方法
if (mp.isHit(x, y – 37) == 13) {
mp.map[((int) y – 37) / mp.h][(int) x / mp.w] = 0;
dm.create(1, ((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h – 16);// 生成毒蘑菇
tm.create(
3, // 在玩家頂?shù)降奈恢梅胖锰匦Тu
((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h 8, 5);
}
y -= vy;
y = (((int) y – 37) / 16) * 16 37;
vy = 0;
}
}
break;
case 3:
// 自由下落方法
y = vy;
vy = 2;
// 定義狀態(tài)為死亡
this.changeFS(3);
if (vy >= 0) {
vy = 0;
m = 4;
}
break;
case 4:
vy = 2;
y = vy;
// 判斷并狀態(tài)為死亡
this.changeFS(3);
if (y > 380) {
isDead = true;
vx = 0;
// 根據(jù)第幾關(guān)判斷死亡后該回到第幾關(guān)
if (MC.CanvasIndex == 40) {
MC.CanvasIndex = 35;
}
if (MC.CanvasIndex == 20) {
MC.CanvasIndex = 15;
}
}
break;
case 5:
break;
}
// 判斷是否過(guò)關(guān)
if (x mc.cx > 4800 && y > 320)
// if(x mc.cx>900)
{
nextLevel = true;
if (nextLevel == true) {
MC.CanvasIndex = 30;
}
}
}
// 碰撞的邏輯
public boolean isHit(float _x, float _y) {
if (Math.abs(x – _x) < 10 && Math.abs(y – _y) < 10) {
return true;
}
return false;
}
}
安卓源碼(帶報(bào)告)39
安卓源碼(帶報(bào)告) · 目錄
上一篇安卓APP源碼和設(shè)計(jì)報(bào)告——移動(dòng)書(shū)籍交互系統(tǒng)下一篇安卓APP源碼和設(shè)計(jì)報(bào)告——體重檔案APP(含答辯PPT)
閱讀原文
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。