DoJa平台手机游戏的开发与移植

作者:关文柏
时间:2006年6月13日
 
关键字:DoJa NTT DoCoMo i-mode i-appli
 
 
内容概况:
 
·DoJa技术简介
·DoJaAPI预览
·appli程序的开发
·DoJa游戏移植到J2ME平台的方法
·相关资源链接
 
 
一,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版本包括下面几个包:
包含了可以控制设备的类,比如camera类
包含一些在CLDC的GCF( Generic Connection Framework)框架之下的类
包含语言类
包含了用于网络通讯方面的类
包含了一些创建用户界面可选的类
包含了可创建3D图形的类,也是可选的
包含了一些可使用于本地终端功能的类,像操作手机电话本,收发Email等。
包含了一些用于创建用户界面的类
包含一些工具类
 
 
可以看出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 的介绍。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值