APIs和工具的概觀
接下來的部分,我將概觀J2ME與游戲相關的API並且測試他們提供給開發者的功能。
用戶界面
MIDP 運行時間提供了對手機設備的屏幕和硬件鍵的細粒度控制。所有的MIDP UI類都是從Javax.microedition.Displayable接口上繼承而來:
◆Screen類是用於高級小器件如Alert, List, Form, 和 TextBox的基礎。MIDP 運行時間控制如何顯示那些高級UI類以及如何在特殊設備的UI慣例的基礎之上安排功能鍵。MIDP 高級UI小器件最適合用於文本控制。在高級UI 類中,Form 類是最靈活的。你可以指定 Form屏幕的布局並且可以給它添加一些東西如:StringItem, TextField, DateFIEld,ChoiceGroup, 和 Gauge。
MIDP v2 規范將兩個重要的創新帶進了高級UI中:首先,它引入Spacer 和ImageItem 項,從而允許同一個Form 上的混合文本和圖像顯示;其次,他引入CustomItem 類,從而為開發者提供了設計和實現自己的項級別的窗口小器件的機制。開發者對CustomItem 對象,包括像素級別的繪畫和內部事件處理在內,擁有最終控制權。
◆Canvas類是低級別MIDP UI的基礎。它提供對在整個屏幕之上的像素級繪畫的訪問以及對用於所有硬件鍵的自定義映射的訪問。你可以只創建Canvas的子類並且跳過用於顯示邏輯的paint()方法;用於鍵事件的keyPressed(),keyRepeated(), 和keyReleased()方法;以及用於每個事件中指示器和觸摸屏的pointerPressed(), pointerDragged()和pointerReleased()方法。
◆GameCanvas 類繼承於Canvas類。他是MIDP v2 游戲API的一部分並且為游戲開發提供了便利機制。例如:在GameCanvas子類中,每次你修改時不需要跳過paint() 方法就可以描繪整個屏幕。你可直接從getGraphics()方法中得到Graphics 對象並且在該對象上繪圖。當你需要更新顯示時,你可以調用flushGraphics()方法。但是 你使用flushGraphics()方法只可以更新屏幕的一部分。相比Canvas 類的單一方法而言,GameCanvas類使得我們易於保持圖形狀態,易於迅速更新屏幕的動畫部分。類似的,GameCanvas 類使用和Canvas 類中回叫方法相反的getKeyStates()方法,為獲得鍵狀態提供了一個便利的途徑。這使得復雜游戲屏幕類中的執行流動性要靈活的多。
MIDP v2規范為 javax.microedition.lcdui.game 軟件包中的游戲應用程序定義了一個完整的API。除了GameCanvas類之外,他還提供了支持平鋪或者動畫游戲背景圖片的Layer 類。游戲API也提供了處理動畫圖片和沖突的Sprite類。他們是2D圖形游戲中的基本組件。在3D前沿,Java規范請求(JSR) 184 試圖標准化手機上的Java 3D API 。它做出了極好的改進。開發者和藝術家需要的J2ME 3D工具現在在SuperScape (見Resources)中可以得到。大型設備制造商在他們的高端智能手機設備上迅速的轉變,以支持這種新API。
圖2:從SuperScape獲得的Java 3D游戲
除了標准的MIDP UI 和游戲APIs之外,也存在幾種其它的MIDP UI工具箱。他們要麼提供設備的專有功能,要麼旨在支持更好的可促進游戲開發的高級UI:
◆Nokia UI 軟件包提供對Nokia 手機上的聲音、亮度和振動組件的控制。它也支持用於更加專業級的游戲的全屏模式。
◆Motorola 輕型小器件工具箱(LWT) 是一個獨立的用於Motorola 手機的窗口工具箱。
◆Nextel Open Windowing Toolkit (OWT)是Motorola和Nextel聯合開發的開源工具箱。 它運轉一個容器模型來控制布局和其他UI組件,這是桌面UI開發者所熟悉的。OWT基於Canvas類並且運行在所有的MIDP手機上。但是,如果你使用OWT庫,你必須將它包括在你的分布式MIDlet組中。
◆Synclast UI 項目開發了一個支持容器模型的開源UI軟件包。在MIDP v1 Canvas 類的基礎上,他支持許多MIDP v2小器件。因此,它允許MIDP v2應用做一點小小的修改之後運行在今天的MIDP v1設備上。有了OWT,你必須將Synclast庫捆綁在分布式應用中。
總的來說,MIDP平台為豐富的UI游戲提供了多種選擇。
網絡和後台集成
正如我前面提到的一樣,手機游戲的未來就是聯網的多玩家游戲。J2ME中的聯網可通過一般連接框架(GCF)來獲得支持。GCF的核心就是工廠類 Javax.microedition.io.Connector。你可以傳遞一個協議和地址字符串到靜態方法Connector.open()上,以便獲得到遠程主機上的連接對象:
◆HTTP協議支持在MIDP中是強制性的。如果你傳遞http://hostname:port 連接字符串給Connector.open()方法,則返回 HttpConnection對象。你可以直接打開連接上的輸入/輸出數據流並且編寫/接收到遠程主機/來自遠程主機的數據。
◆Unix插座,用戶自尋址協議(UDP) 連接、或者直接TCP/IP連接在某些實現中也得到支持。但是,你應該注意到手機網絡與有線因特網有著根本區別。有些網絡在HTTP層的開頭模擬插座連接。所以,直接插座沒必要出現在性能增加上。對於多數場合我推薦使用HTTP。
◆J2ME無線通訊API (WMA)支持GCF中手提設備之間的SMS通訊。你可以通過sms://phone_number:port獲得的MessageConnection對象發送SMS信息 給另一個手機。你也可以打開一個“服務器” 連接,該連接可使用sms://port 字符串聽取到來的SMS信息。到來的SMS信息可以同步處理也可以異步護理。
◆在 MIDP v2中,“服務器”SMS 連接可使用J2ME運行時間管理的推動注冊進行注冊。它允許開發者調用某個信息到達者之上的信息處理MIDlet。