一,DoJa技術簡介
簡單的說,DoJa是日本最大的移動通訊公司NTT DoCoMo的專利技術。而i-mode是該公司對於移動通訊2.5G階段的一種應用模式,這個技術覆蓋很多方面。i-mode初始於1999年,而i-mode與JAVA結合誕生的i-appli服務初始於2001年,以JAVA為開發語言的i-mode被稱為DoJa技術,DoJa技術實際上是基於CLDC規范之上的平台技術,與J2ME標准平台是平行。有獨立的API類庫。在J2ME標准平台上開發的移動通訊程序叫做MIDP程序,符合MIDP1.0或2.0規范。而在DoJa平台上開發的程序被叫做appli程序。DoJa現在已經有很多版本。最高版本DoJa4.0。
二,DoJaAPI預覽
我們以現在通用的DoJa2.5版本的API為例,大致看一下它有哪些特色。
2.5版本包括下面幾個包:
com.nttdocomo.device
包含了可以控制設備的類,比如camera類
com.nttdocomo.io
包含一些在CLDC的GCF( Generic Connection Framework)框架之下的類
com.nttdocomo.lang
包含語言類
com.nttdocomo.net
包含了用於網絡通訊方面的類
com.nttdocomo.opt.ui
包含了一些創建用戶界面可選的類
com.nttdocomo.opt.ui.j3d
包含了可創建3D圖形的類,也是可選的
com.nttdocomo.system
包含了一些可使用於本地終端功能的類,像操作手機電話本,收發Email等。
com.nttdocomo.ui
包含了一些用於創建用戶界面的類
com.nttdocomo.util
包含一些工具類
可以看出DoJaAPI比標准J2ME更加豐富。一般在開發和移植過程中,經常遇到的類庫就是com.nttdocomo.ui包,所以我們大致看一下這裡面都有哪些類。 這個包中包含了appli程序的入口類, Iapplication類,appli程序的用戶界面(GUI)也分高級界面和低級界面,只不過他們的繼承關系有些混亂,比如Component類是定義用於高級界面的抽象類,它有九個子類。包含一些按鈕,標簽,文本框的一些類。實際上就是一些組件。不是容器類。而Frame類也是一個抽象,意思是可表示為一個框架或容器。
它的子類有Canvas,Dialog,Panel.其中Dialog和Panel屬於高級界面類,而Canvas則用於低級界面。用於顯示界面的類叫Display,而它的顯示屏幕的方法為setCurrent(Frame f),裡面的參數為Frame類對象。說明像Component類型的子類是不能獨立顯示在界面上的,要通過Frame子類中的高級界面類來填加。也就是必須放在Panel上面,才能被顯示出來。
其它的還有用於畫圖的Graphics,Graphics2D,Graphics3D類,負責加載媒體資源的MediaManager類等等。因為類很多,而且功能復雜和強大,就不一一介紹了,可以參考API文檔進一步學習。
三,appli程序開發下面我們通過一個小程序來講解如何開發一個appli的程序。工欲善其事必先利其器,我們要下載一個DoJa的專用模擬器才行。
好在DoJa的API文檔和模擬器以及使用方法在http://www.doja-developer.net都已經給全了。下載對應DoJa2.5版本的模擬器。名字叫javaappli Development Kit for DoJa-2.5版本為 1.03,然後安裝上就可以了。
打開模擬器,會出現類似WTK的窗口,不同的是一個手機模擬器的窗口也會一起出現,而且還有個命令行模式的窗口。
仔細看一下,其實界面功能挺簡潔的,菜單欄有文件,工程,編輯,設備,幫助幾個選擇,工具欄包括新建項目,打開項目,ADF配置,創建,運行這些選項。下面還有一些運行模式的選擇。當然這些項目都是英文的。 什麼是ADF配置呢,這裡講一下appli的安裝程序也包括jar打包文件和一個描述文件,不同的是這個描述文件的類型為.jam.而ADF中的設置就是相當於WTK中的setting.也就是用於jam文件描述的項目。 好了,我們先新建立一個工程,點new project,會出現一個提示窗口,讓你輸入工程名稱,上面還有一個參考工程的選擇,這個不用管它。我們的工程名就叫Test_doja. 點create創建。
然後在這個窗口會顯示一些我們創建的信息。比如我的模擬器安裝路徑是D盤根目錄。那麼會顯示下面信息:
Placed java source files in D:\jDKDoJa2.5\apps\Test_doja\src Placed resource files in D:\jDKDoJa2.5\apps\Test_doja\res Placed Scratchpad file in D:\jDKDoJa2.5\apps\Test_doja\sp
說明在模擬器的apps目錄下,就是我們創建的工程目錄。裡面還有三個文件夾,scr用來放.java文件,res用來放資源,sp用來存放Scratchpad文件。這個Scratchpad這裡要詳細講一下。 appli模式簡單說就是客戶手機通過連接 I – mode服務器來獲得其它的網絡資源。這些資源可以來自不同的網站。手機用單獨有一塊類似硬盤的區域用來存儲這些資源,叫做Scratchpad,一般的DoJa手機游戲都是先從網絡上下載資源到Scratchpad裡,然後再從Scratchpad中讀取來用。而且Scrtchpad是可寫的,可以保存游戲信息。
回到我們剛才的工程中,現在sp目錄是空的,也就是沒有Scratchpad文件。我們可以自己創建一個。默認名稱是工程名後面加上數字0,Scratchpad文件的後綴名為.scr。
需要說明的是,res目錄裡也是放資源文件的。所不同的是res中放的資源文件,在打包時會一起打進Jar文件。而sp目錄下的Scratchpad不會。
我們的程序很簡單,所以就不用制作Scratchpad了。功能就是實現高級界面與低級界面的切換。下面是代碼:
import com.nttdocomo.ui.IApplication;
import com.nttdocomo.ui.Canvas;
import com.nttdocomo.ui.Panel;
import com.nttdocomo.ui.Button;
import com.nttdocomo.ui.Label;
import com.nttdocomo.ui.ComponentListener;
import com.nttdocomo.ui.Display;
import com.nttdocomo.ui.Component;
import com.nttdocomo.ui.Graphics;
public class Test_doja extends IApplication implements ComponentListener
{
Panel p = new Panel();
public Test_doja()
{
Button ok = new Button("ok");
Label label = new Label("The first DoJa program!");
p.setBackground(0xc0c0c0);
p.add(label);
p.add(ok);
p.setComponentListener(this);
}
public void start()
{
Display.setCurrent(p);
}
public void componentAction(Component source, int type, int param)
{
if(type == ComponentListener.BUTTON_PRESSED)
{
Display.setCurrent(new DoJaCanvas());
}
}
}
class DoJaCanvas extends Canvas
{
public DoJaCanvas()
{
}
public void paint(Graphics g)
{
g.setColor(0xff0000);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0xffffff);
g.drawString("Hello world!",30,50);
}
}
代碼很簡單,所以我沒加注釋,有過J2SE和J2ME編程經驗的人,應該很容易看懂。Iapplication類跟MIDlet性質相同。不過它只需要從寫start()方法,作為程序啟動入口。
我們現在把代碼保存在scr文件夾中,然後點build,如果沒錯誤,則會提示下面信息:
D:\jDKDoJa2.5\apps\Test_doja\bin\Test_doja.jar created
D:\jDKDoJa2.5\apps\Test_doja\bin\Test_doja.jam updated
Build completed
說明jar和jam文件直接創建完了。然後點run,就可以看效果了。是不是很輕松。: )
四, DoJa游戲移植到J2ME平台的方法
這部分內容我在手機移植體會(二)中已經介紹過,這次我主要說一下資源文件的讀取。其實DoJa的API比標准J2ME豐富許多,所以移植是有難度的。用標准的J2MEAPI類庫不能完全實現DoJa類庫所有功能。我主要說一下一般的移植方法。
前面講過關於Scratchpad的概念。我們通常看到的工程文件,都包含很多內容。其中有gif資源文件,.scr文件,和代碼。我覺得只有.scr文件和java代碼和打包後的jam和jar文件就夠用了。因為圖片和聲音文件通常也在.scr文件中包含。不過有些小游戲的一些圖或聲音也會直接打在jar包內。就是工程中res目錄下的東西。。
關於.scr文件的讀取與解析,DoJa都提供了詳細的方法,比如:
DataInputStream in = Connector.openDataInputStream(
"scratchpad:///0;pos=" + offset+ ",length=" + length);
實際表示 從 scratchpad 的第 0 扇區 偏移量為offset,長度為length的數據作為 輸入流。
前面我們說了scratchpad像硬盤一樣。所以scratchpad:///0 的0 也可以是1 或者別的數字。但是區域不同。0對應的Scratchpad文件名為"工程名"+0.scr,如果是1就是"工程"+1.scr.也就是說Scratchpad可以由多個文件組成表示不同的存儲區域.如果是往scratchpad中寫操作,就用DataOutputStream構建就可以了。比如保存游戲中的分數。
上面這是從scratchpad中得到資源文件在DoJa代碼中的寫法。如果要是從res目錄中讀取,如何寫呢。像這樣:
DataInputStream in is = Connector.openInputStream("resource:///" + filename);
filename就表示資源文件的名字。
看了上面的表示方法,我想大家應該會用J2ME的方法來把他們從寫了吧。DoJa讀取資源的方法很靈活,比如gif圖片,可以直接用文件名得到圖片對象,也可以用byte數組構建,不過比較常用的,還是用輸入流來構建。所以移植中要修改圖片,首先要對.scr文件進行分析,解析,將圖片整理出來,才能使用。提取圖片的方法,可以參考我BLOG中的一個程序。
在IApplication類中有個很重要的方法 getArgs() ,這個方法會得到 jam描述文件中App param項目的參數,這些參數可以用空格分開,每一段就表示一個元素,因為用getArgs()得到的是一個String的數組。所以很多游戲都是靠jam中的App param參數進行初始化資源,或判斷。
把資源文件找到後,就可以對游戲進行修改了,不過有些方法需要你自己從寫,比如drawImage 有很多參數的方法,可以從大圖中畫小圖, 還有 doja自己按鍵處理機制。不過這些如果仔細看API的話,是可以用J2ME從寫的。 有些實現不了的功能,就可以注釋掉了。
以上就是我對移植DoJa游戲的一點建議。有些在手機游戲移植體會(二)裡面已經說過的我就沒有再提。如果你在移植中遇到什麼問題可以向我咨詢,我會努力幫助你。
五,相關資源鏈接
http://www.doja-developer.net 可以下載模擬器,API文檔,以及DoJa技術的介紹等
http://www.nttdocomo.com NTT DoCMo 公司的官方網站,裡面介紹一些最新的技術和I-mode 的介紹。