Android小兔子跳鈴鐺游戲開發(fā)過程和心得
本文中的Android游戲開發(fā)實(shí)例是一位比較有上進(jìn)心的學(xué)生分享的,實(shí)現(xiàn)的是小兔子跳鈴鐺的游戲。作者在開發(fā)過程中有經(jīng)驗(yàn)也有疑惑,大家可以據(jù)此發(fā)表自己的評(píng)論。
一、游戲運(yùn)行效果
二、運(yùn)行環(huán)境說明
我是用Eclipse開發(fā)的,在模擬器上運(yùn)行。模擬器的配置如下。大家注意下Skin選項(xiàng)中Built-in 必須是“WQVGA400”(這是我游戲的一個(gè)缺陷)。
三、體系結(jié)構(gòu)說明
在看這部分之前,我建議大家先到網(wǎng)上玩玩那個(gè)小游戲(http://www.vifo.com.cn/games/no2/tiaolindang/tiaolindang.swf),相信會(huì)對(duì)你對(duì)我下面類容的理解有所幫助。
下面是Eclipse截圖,我簡(jiǎn)要說明下各個(gè)類的作用:
1、RabitActivity:游戲就從這個(gè)Activity啟動(dòng),它的主要作用就是負(fù)責(zé)展示游戲簡(jiǎn)介(IntroduceView),如何游戲(HelpView),是否開啟音效AudioView)的這三個(gè)不同的屏幕。
2、GameActivity:當(dāng)用戶選擇完是否開啟音效后,就切換到一個(gè)新的activity,即GameActivity。
3、Rabit,Bell, Bird,對(duì)游戲中兔子,鈴鐺,鳥的定義。包括狀態(tài)(state),圖片(bitmaps), 速度(speed)都在里面定義。我感覺,state是個(gè)很重要的屬性,他決定著這個(gè)對(duì)象到底處于何種狀態(tài),從而根據(jù)這些狀態(tài)繪制不同的圖片。
4、GameSurfaceView:游戲的顯示類,同時(shí)是個(gè)大容器,將所有的游戲中出現(xiàn)的對(duì)象都包含進(jìn)來,里面的update_all_components()是游戲的核心。
5、BellCreator:負(fù)責(zé)鈴鐺的對(duì)象的創(chuàng)建。當(dāng)一個(gè)鈴鐺從屏幕中消失是,該對(duì)象并沒有被銷毀,而是被BellCreator回收,當(dāng)下次有新的鈴 鐺在屏幕上出現(xiàn)時(shí),BellCreator就把回收過來的Bell對(duì)象重新初始化后交給GameSurfaceView。目的是節(jié)約資源,提高系統(tǒng)的系 能。
6、Background:負(fù)責(zé)動(dòng)態(tài)背景的生成。
7、AudioProvider:音頻的封裝,負(fù)責(zé)音效。
那么整個(gè)游戲是如何跑起來,所有的對(duì)象(圖片)如何動(dòng)起來的呢?
相信有過一些有小游戲開發(fā)經(jīng)驗(yàn)的人知道,在整個(gè)系統(tǒng)中,除了主線程外,會(huì)啟動(dòng)另外一個(gè)線程,這個(gè)線程負(fù)責(zé)不斷刷新所有對(duì)象的狀態(tài),更新圖片,從而達(dá)到動(dòng)畫的效果。
我也是這樣做的。在GameSurfaceView中我有個(gè)內(nèi)部類,RefurbishThread,它負(fù)責(zé)每100毫秒調(diào)用 GameSurfaceView.update_all_components()方法更新所有rabit,bell,bird,background狀 態(tài),然后重繪屏幕。
整個(gè)程序的源碼可以在http://www.rayfile.com/files/f8b99ad1-c4e8-11e0-bb73-0015c55db73d/下載。
個(gè)人覺得Rabit,Bell等對(duì)象狀態(tài)的定義是個(gè)需要花腦筋的地方,我做得還不夠好,下面是定義Rabit的一些狀態(tài):
- private int face_state;
- private int ground_state;
- private int air_state;
- //rabit面左面右狀態(tài)
- public static final int RABIT_FACE_LEFT = 1;
- public static final int RABIT_FACE_RIGHT = 2;
- //rabit在地面狀態(tài)
- public static final int RABIT_NOT_ON_GROUND = 0;
- public static final int RABIT_LEFT_STOP = 1;
- public static final int RABIT_RIGHT_STOP = 2;
- public static final int RABIT_LEFT_MOVE1_ON_GROUND = 3;
- public static final int RABIT_LEFT_MOVE2_ON_GROUND = 4;
- public static final int RABIT_RIGHT_MOVE1_ON_GROUND = 5;
- public static final int RABIT_RIGHT_MOVE2_ON_GROUND = 6;
- //rabit 在空中的狀態(tài)
- public static final int RABIT_ON_AIR_UP0 = 0;
- public static final int RABIT_ON_AIR_UP1 = 1;
- public static final int RABIT_ON_AIR_UP2 = 2;
- public static final int RABIT_ON_AIR_UP3 = 3;
- public static final int RABIT_ON_AIR_UP4 = 4;
- public static final int RABIT_ON_AIR_UP5 = 5;
- public static final int RABIT_ON_AIR_STOP = 6;
- public static final int RABIT_ON_AIR_DOWN = 7;
四、技術(shù)小經(jīng)驗(yàn)
下面是一些開發(fā)中遇到技術(shù)層面小知識(shí),希望對(duì)大家有幫助:
1、如何將游戲畫面保持橫向顯示,不會(huì)因?yàn)槭謾C(jī)橫豎而自動(dòng)切換顯示方式:在activity標(biāo)簽里面加上這兩個(gè)屬性的配置就可 android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden|navigation"
- <activity androidandroidandroid:name=".GameActivity"android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden|navigation"></activity>
2、android開發(fā) drawable(hdpi,mdpi,ldpi)的區(qū)別:
http://hi.baidu.com/lujie_dream/blog/item/4ed68b77b28a84210cd7da97.html
3、java 線程的基礎(chǔ)知識(shí)
http://java.chinaitlab.com/line/373702.html
4、Handler的使用
http://www.pin5i.com/showtopic-android-handler.html
五、我的困惑
1、不知正規(guī)的Android游戲開發(fā)是如何進(jìn)行的,應(yīng)該不是像我這樣貼圖這樣簡(jiǎn)單吧,用游戲引擎嗎?什么引擎?網(wǎng)上的資料感覺太少了,希望google能夠多提供這方面的幫助。不知列位看官是否知道真正手機(jī)游戲如何開發(fā)的,指點(diǎn)一二,不勝感激。
2、體系結(jié)構(gòu)做的不好,類與類之間的耦合度高的嚇人。上學(xué)期雖然上了設(shè)計(jì)模式這門課,可能是學(xué)藝不精吧,這個(gè)小游戲沒用什么模式。竊以為,是不是對(duì)于小 的項(xiàng)目,設(shè)計(jì)模式用場(chǎng)不是很大?或許小的項(xiàng)目有很大的耦合是正常的,它沒有必要分很多模塊然后分別進(jìn)行設(shè)計(jì)?設(shè)計(jì)模式可能對(duì)大的項(xiàng)目很有用吧,大的項(xiàng)目也 需要設(shè)計(jì)模式。不知我的想法對(duì)不對(duì),希望有牛人指點(diǎn)。
六、總的感悟
關(guān)于Android開發(fā)平臺(tái)的體會(huì):
我有種粗淺的感覺,在Android平臺(tái)上開發(fā)與平常Java開發(fā)差別不是很大。處理配置文件外,程序的大部分代碼都是用Java寫的。如果你學(xué)過Java,有一點(diǎn)Java開發(fā)的經(jīng)驗(yàn),Android入門還是挺快的。 看看書,到網(wǎng)上查查資料,熟悉一些基本機(jī)制,如Activity,了解一些API,再動(dòng)手試試,上手挺容易。當(dāng)然,無知者無畏,想必Android一些深 層的機(jī)制不是那么簡(jiǎn)單,還有許多Android上的概念定義我沒掌握,須認(rèn)真學(xué)習(xí)體會(huì)。我想說的是做個(gè)Android菜鳥不那么困難,所以若對(duì) Android開發(fā)有興趣,那就行動(dòng)吧~
所謂堅(jiān)持:
堅(jiān)持不是件容易的事。
學(xué)習(xí)Android,開始時(shí)熱情很高,看書看視頻感覺挺好,自己每天都有收獲,很幸福。
真正做其開發(fā)時(shí),遇到了不少困難。主要是游戲整體和細(xì)節(jié)設(shè)計(jì),類似游戲的參考很少,有很多Class定義需要左思右想抓耳撓腮,沒有同學(xué)可以共同探討, 自己感覺又解決不了,很痛苦!很茫然!很失落!于是想要放棄,反正自己做的這件事又沒有什么硬性要求,何必自己難為自己呢?
平時(shí)我總是輕視書上鼓吹堅(jiān)忍不拔之人,覺得他們沒什么了不起,不就是堅(jiān)持嘛,很有可能是后人杜撰的??涩F(xiàn)在,反身看看我自己,如果放棄的話,還有什么資格瞧不起別人?于是在這種心理下,硬著頭皮繼續(xù)學(xué)習(xí)。呵呵,當(dāng)然,我也狠狠地放縱自己,努力玩,然后學(xué)習(xí)開發(fā)。
總之,我可以說雖然做這個(gè)小東西對(duì)別人來說很容易,你也許會(huì)輕視我,但我不管,我挺了下來,現(xiàn)在心情還不錯(cuò)。