J2ME手机编程心得(一)
自学J2ME也有一段时间了,总觉得应该把自己学习的心得与收获写出来,一直没有时间,不过不管有没有时间还是要抽出时间总结一下的了,一点点的写吧!
a.开发工具
想要做J2ME开发,当然需要选择合适的开发测试工具,这里我选择的是SUN的WTK2.2版本,开发的集成IDE采用JBuilder2005。
WTK2.2可以在SUN公司的网站下载
(https://www.wendangku.net/doc/9d18909179.html,/j2me/index.jsp),JBuilder2005嘛,网上搜索一下也有很多破解版下载的地方(没办法,咱买不起正版)。下载以后进行安装,安装过程十分简单这里也不过多描述。
还有如果是想要开发游戏之类的,可能还需要一些图形处理工具,图形处理工具可以选择Macromedia Fireworks 8.0,一般的图形处理都能顺利的完成。如果是开发RPG游戏,可能还需要一个地图编辑器来制作地图,如果你有时间或者有精力完全可以自己开发一个合适的地图编辑器,不过为了免得麻烦,能在网上找到的资源还是利用一下吧,这里推荐一款开源的地图编辑器,"Tile Studio",使用起来还算比较方便,可以到https://www.wendangku.net/doc/9d18909179.html,/下载,具体的使用方法在以后的文章中再做具体描述,这里不多说。
b.开发环境配置
安装完毕以后,接下来要做的就是配置开发环境,JBuilder2005
本来是带了WTK2.1的,不过我们还是用2.2的版本好了,首先打开JBuilder2005,打开Project -> Default Project Properties窗口,如下图:
再点击JDK边上的"..."按钮,打开选择JDK的窗口,如下图:
然后点击"New..."按钮,打开配置JDK的窗口:
这里是选择JDK的目录的地方,点击"..."按钮,会出现选择JDK的Home文件夹的窗口,选择你装WTK的位置,比如E:\WTK2.2,点击"确定",如果WTK装的没问题,Name for this JDK的文本框会自动变成"J2ME Wireless Toolkit 2.2",这就代表JBuilder已经自动找到了WTK2.2,然后点击"OK",就新添加了一个JDK,然后在上一步选择JDK的窗口选择"J2ME Wireless Toolkit 2.2",就完成了WTK2.2在JBuilder里面的配置过程。
配置完成以后可以测试一下配置的环境有没有问题,首先新建一个新的项目,例如取名为"TestMidlet",如图:
点击"Next"按钮,选择JDK,这里我们要选择我们刚刚配置过的WTK2.2
然后再点"Next",再点击"Finish",就成功创建了一个空的Project。接下来要新建一个Midlet,File -> New ,然后选择Micro下面的MDIP Midlet,如图:
回去继续写。。。
回来了,继续.....
家里用的是JBuilderX因此界面可能稍有不同,不过功能都是一样的,不影响什么
选择完以后,进入设置Midlet的界面,输入Midlet的名字
下一步,输入Screen的参数,Displayable Type我们这选择继承Form:
点击完成按钮,完成创建,JBuilder已经生成了最基本的代码,右键点击左边class树的TestMidlet.java,出现菜单:
选择Micro Run using "TestMidlet",运行程序,出现如下的手机模拟器的界面:
说明环境配置成功!如果发现有异常,就检查一下WTK的设置
J2ME的环境配置好了,现在就开始写我们的第一个J2ME的手机程序吧!
先做一个比较简单的手机计算器好了。。
按照前面说的方法建立一个工程后,将代码补充到生成的框架里面就可以了。
TestMidlet.java代码:
package testmidlet;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TestMidlet extends MIDlet {
static TestMidlet instance;
TestScreen displayable = new TestScreen();
public TestMidlet() {
instance = this;
}
public void startApp() {
Display.getDisplay(this).setCurrent(displayable);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
TestScreen.java代码:
package testmidlet;
import javax.microedition.lcdui.*;
public class TestScreen extends Form implements CommandListener {
private TextField intA = new TextField("请输入数字a","0",10,TextField.DECIMAL);
private TextField intB = new TextField("请输入数字b","0",10,TextField.DECIMAL);
private TextField result = new TextField("运算结果:","0",10,TextField.ANY);
private ChoiceGroup opt = new ChoiceGroup("运算:
",ChoiceGroup.EXCLUSIVE);
String[] op = {"+","-","*","/"};
public TestScreen() {
super("计算器");
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
opt.append(op[0],null);
opt.append(op[1],null);
opt.append(op[2],null);
opt.append(op[3],null);
append(intA);
append(intB);
append(opt);
append(result);
setCommandListener(this);
addCommand(new Command("退出", Command.EXIT, 1)); addCommand(new Command("计算",Command.OK,2));
}
private void performAddAction(){
int a,b,r = 0;
a = Integer.parseInt(intA.getString());
b = Integer.parseInt(intB.getString());
if(op[opt.getSelectedIndex()].equals("+")){ r = a + b;
}
if(op[opt.getSelectedIndex()].equals("-")){ r = a - b;
}
if(op[opt.getSelectedIndex()].equals("*")){ r = a * b;
}
if(op[opt.getSelectedIndex()].equals("/")){ if(b == 0){
result.setString("除数不能为0!");
return;
}
r = a / b;
}
result.setString(Integer.toString(r));
}
public void commandAction(Command command, Displayable displayable) {
if (command.getCommandType() == Command.EXIT) {
TestMidlet.quitApp();
}
if(command.getCommandType() == Command.OK){
performAddAction();
}
}
}
这个程序比较简单,类TestScreen继承了Form类,所以可以添加各种Item到屏幕里,例如文本框(TextField)、单选按钮(ChoiceGroup)等等。TestScreen实现了CommandListener 接口,所以可以响应命令按键事件,当然也可以单独建一个类继承CommandListener,不过似乎没有必要,在J2ME中,因为资源有限,因此要节省资源,多一个Class 对生成的jar大小和运行效率都会有影响,因此虽然面向对象和各种设计模式对设计十分有利但是相对来说也牺牲了程序的运行速度。
private TextField intA = new TextField("请输入数字a","0",10,TextField.DECIMAL);
private TextField intB = new TextField("请输入数字b","0",10,TextField.DECIMAL);
private TextField result = new TextField("运算结果:","0",10,TextField.ANY);
private ChoiceGroup opt = new ChoiceGroup("运算:
",ChoiceGroup.EXCLUSIVE);
String[] op = {"+","-","*","/"};
以上代码创建了三个文本输入框和一个单选按钮组,还有一个字符串的数组来保存计算的各种操作。
opt.append(op[0],null);
opt.append(op[1],null);
opt.append(op[2],null);
opt.append(op[3],null);
append(intA);
append(intB);
append(opt);
append(result);
setCommandListener(this);
addCommand(new Command("退出", Command.EXIT, 1));
addCommand(new Command("计算",Command.OK,2));
以上代码将三个文本框和单选按钮组加入到屏幕(也就是Form)中,并且设置响应命令按键的类是自己(this),然后加入了两个命令按钮,分别放在EXIT和OK的位置。一般来说,EXIT是左边的按钮,OK是右边的按钮。
private void performAddAction(){
int a,b,r = 0;
a = Integer.parseInt(intA.getString());
b = Integer.parseInt(intB.getString());
if(op[opt.getSelectedIndex()].equals("+")){
r = a + b;
}
if(op[opt.getSelectedIndex()].equals("-")){
r = a - b;
}
if(op[opt.getSelectedIndex()].equals("*")){
r = a * b;
}
if(op[opt.getSelectedIndex()].equals("/")){
if(b == 0){
result.setString("除数不能为0!");
return;
}
r = a / b;
}
result.setString(Integer.toString(r));
}
上面的函数是具体的计算过程。。。
if(command.getCommandType() == Command.OK){
performAddAction();
}
如果按的是OK的按钮,则执行计算。
OK,这个简单的小程序就完成啦!当然这只是一个最基本的程序,但J2ME的编程方式就是这个样子的。以下是程序运行界面:
上一次已经做完了第一个简单的J2ME程序,但是可能大家最关心的还是如何用J2ME制作手机游戏吧!不要急,一步一步来,现在就开始做我们的第一个J2ME小游戏吧!
很多人应该都玩过贪吃蛇的游戏吧,那么现在我们就要做一个贪吃蛇的手机游戏了!OK,准备好工具,建立工程,名字就叫做SnakeGame,
再建立一个Midlet,名字也是SnakeGame,还要建一个游戏的Screen.起名叫做GameScreen。
首先我们考虑一下游戏中会出现的算法,首先,贪吃蛇应该是可以在屏幕上运动的(好像是废话?),而它的身体长度又是随着游戏的进行而变化的,因此,这里我们用一个数组来保存贪吃蛇每个身体单元(可以理解为身体的一小段)在屏幕中的位置,为什么采用数组而不采用Vector呢,因为Vector效率没有直接用数组高,J2ME程序由于资源的限制是要把效率放在首位的。数组定义好了,接下来就是如何控制贪吃蛇运动。首先贪吃蛇始终要有一个运动方向,或上或下或左或右,而四个方向对于屏幕的坐标变化是各不相同的,但我们可以找出些规律来利用。我们用direction表示贪吃蛇运动的方向,比如向上,direction =0,向下direction=1,左direction=2,右direction=3,然后定义两个对应坐标变化的数组,
dirX[] = { 0, 0, -1, 1};
dirY[] = { -1, 1, 0, 0};
这样,贪吃蛇的头部的下一个坐标就可以用
(dirX[direction],dirY[direction])来表示。
每次运动,头部都会获得一个新的坐标,而后面的身体依次前进,第i+1块身体对应于运动之前的第i块身体。运动的过程可以如下表示: