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