幾年前在 Java ME 平臺(tái)上寫的坦克大戰(zhàn)游戲,這個(gè)一個(gè)既有趣以能充分了解一個(gè)新平臺(tái)的項(xiàng)目。而且通過(guò)兩個(gè)平臺(tái)的比較,也就更好的理解 Android 平臺(tái)開(kāi)發(fā)的一些特點(diǎn)。
下圖是 Java ME 平臺(tái)下坦克大戰(zhàn)的界面效果圖
http://wiki.jikexueyuan.com/project/android-game-design/images/1.jpg" alt="pic" />
在移植到過(guò)程中,發(fā)現(xiàn)盡管 Android,和 Java ME 都是以 Java 為開(kāi)發(fā)語(yǔ)言的手機(jī)平臺(tái),兩都之間的差異還是不少的,但好處是,兩者都采用 Java 語(yǔ)言,相當(dāng)一部分與平臺(tái)無(wú)關(guān)(如除圖形,網(wǎng)絡(luò)之類)的代碼是可以通用的,這大大減少了從 Java ME 到 Android 平臺(tái)移植的工作量。
這里先給出一些移植過(guò)程中的總結(jié),后續(xù)文章將較詳細(xì)的說(shuō)明坦克大戰(zhàn)游戲的設(shè)計(jì)過(guò)程(適用于各個(gè)平臺(tái))。
- Android 應(yīng)用一般無(wú)主程序入口,但對(duì)于單 Activity 的應(yīng)用來(lái)說(shuō),Activity 相當(dāng)于 Java ME 的 Midlet。
- Android 中 View 的概念類同于其它平臺(tái)中 Control 的,ViewGroup 相當(dāng)于 Container. 當(dāng)然它也可以用作一個(gè)窗口 View,在移植的過(guò)程中,采用單 Activity,多窗口 View 的方法來(lái)對(duì)應(yīng)于 Java ME 的 Midlet 和多個(gè) Displayable 類。
- Android 繪制圖形時(shí),沒(méi)有一般圖形庫(kù)中提供的 Pen, Brush 類,設(shè)置 Pen 和 Brush,字體都是通過(guò) Paint 類來(lái)設(shè)置的,對(duì)于初學(xué)者一開(kāi)始會(huì)覺(jué)得有些困惑。
- Rect 一般是通過(guò) left,top, bottom, right 來(lái)定義,而 Java ME 平臺(tái)是通過(guò) left, top, width, height,如果不注意,會(huì)造成意想不對(duì)結(jié)果:-),如 android 平臺(tái)中 canavs.drawRect, 以及 canvas.clipRect 是通過(guò) left,top, bottom, right 來(lái)定義一個(gè)四邊形,而 Java ME 是通過(guò) left,top 及寬度,高度來(lái)定義,移植過(guò)程如果不注意就出錯(cuò)了。
- Android 在非 UI 線程中更新 Canvas 里,需要調(diào)用 postInvalidate, view.invalidate 相當(dāng)于 Jave ME 中 Canvas 的 repaint。如果想在非 UI 線程執(zhí)行和 UI 相關(guān)的方法,一般是通 hander.post 來(lái)實(shí)現(xiàn),而與這對(duì)應(yīng)的 Java ME 是 display 的 callSerially.
- Android 中提供一個(gè) SurfaceView 類,允許在使用另一個(gè) thread 來(lái)更新 Canvas,這對(duì)于游戲的圖形的刷新性能提高非常重要。
- Android 沒(méi)有提供類似 Java ME 中的 Game API,但是實(shí)現(xiàn)或是移植一個(gè)類似的 Game API 也不困難,Android 坦克大戰(zhàn)游戲中移植了 Java ME Game API 中 Layer, LayerManager,TiledLayer,Sprite 類,使得整個(gè)移植工作變得非常順利。
總體感覺(jué) Android 平臺(tái)相對(duì)來(lái)說(shuō)還是比較容易上手,對(duì)于會(huì) Java 或是 C# 的程序員,即使以前沒(méi)有從事過(guò)手機(jī)軟件開(kāi)發(fā),也是比較容易入門的。而且 Android 平臺(tái)和 Java SE 有相當(dāng)一部分類是公用的,也是二進(jìn)制兼容的,也就是說(shuō)在 Java SE 平臺(tái)上的類庫(kù)(.jar)文件,可以直接用在 Anroid 平臺(tái),這里先給出一個(gè)移植后的截圖。后面將詳細(xì)說(shuō)明這個(gè)游戲的設(shè)計(jì),最后會(huì)給出所有源碼,有興趣的朋友可以擴(kuò)展成聯(lián)網(wǎng)游戲或是作為學(xué)習(xí)游戲設(shè)計(jì)的參考,坦克大戰(zhàn)游戲是一個(gè)中等難度的游戲,對(duì)于有志從事手機(jī)游戲開(kāi)發(fā)的朋友,可以自行寫個(gè)坦克大戰(zhàn)游戲后基本就能入門手機(jī)軟件開(kāi)發(fā)。
http://wiki.jikexueyuan.com/project/android-game-design/images/2.jpg" alt="pic" />