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