这是一篇关于怎样使用jbuilder开发j2me程序的例子。本人使用jbuilder2005,2005自带wtk2.1,自己下载2.2版本,2.2那个默认的模拟器很好用。另外,jbuilder x下的wtk也是2.0的版本好象。jbuilder 9的wtk是1.04。
首先开启jbuilder.建立一个project。

然后填写名字和路径。继续:

然后选择jdk路径,本身已有wtk2.1,你可以选择。但是你也可以自己选择其他的wtk版本。

点击jdk后面的路径按钮,继续:

然后ok,next.工程建立完毕.
接着点击file->new:

然后在对话框左边选择micro,你就能看到右边出现midlet,displayable.
接上面的:如图示

点击midlet or displayable,则让你输入midlet的名字.如图:

继续下一步,让你输入一个displayable的名字,包括类型(form,canvas等),是否自动加载command
等等

然后jbuilder自动生成所需代码,以及jbuilder自加的一些东西.你可以添加或修改之.
这里我将本站一篇关于介绍gamecanvas的文章的代码拿过来,做少量修改,作为本文章的一个演示;
testmidlet.java文件:
package temps;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* title:
*
* description:
*
* copyright: copyright (c) 2005
*
* company:
*
* @author not attributable
* @version 1.0
*/
public class testmidlet extends midlet
{
private display display;
public void startapp()
{
try
{
display = display.getdisplay(this);
displayable1 gamecanvas = new displayable1();
gamecanvas.start();
display.setcurrent(gamecanvas);
}
catch (exception ex)
{
system.out.println(ex);
}
}
public display getdisplay()
{
return display;
}
public void pauseapp()
{
}
public void destroyapp(boolean unconditional)
{
exit();
}
public void exit()
{
system.gc();
destroyapp(false);
notifydestroyed();
}
}
displayable1.java内容:
package temps;
import javax.microedition.lcdui.*;
import java.util.random;
import javax.microedition.lcdui.game.*;
/**
* title:
*
* description:
*
* copyright: copyright (c) 2005
*
* company:
*
* @author not attributable
* @version 1.0
*/
public class displayable1 extends gamecanvas implements runnable
{
private boolean isplay; // game loop runs when isplay is true
private long delay; // to give thread consistency
private int currentx, currenty; // to hold current position of the 'x'
private int width; // to hold screen width
private int height; // to hold screen height
private random random=new random(system.currenttimemillis());
private final int[] sequence={0,1,2,1,0,1,2,1,0,1,2,1,1,1,1,1,1};
private int counter=0;
private int enemyx,enemyy;
private int enemydirect=0;
private boolean isdown=false;
private boolean isalive=true;
// sprites to be used
private sprite playersprite;
private sprite backgroundsprite;
private sprite enemysprite;
// layer manager
private layermanager layermanager;
// constructor and initialization
public displayable1() throws exception
{
super(true);
width = getwidth();
height = getheight();
currentx = width / 2;
currenty = height / 2;
enemyx=width/4;
enemyy=height/4;
delay = 100;
image playerimage=null;
image backgroundimage=null;
image enemy=null;
// load images to sprites
try
{
playerimage = image.createimage("/transparent.png");
backgroundimage = image.createimage("/background.png");
enemy=image.createimage("/frames.png");
}
catch(exception e)
{
system.out.println("get image error!"+e.getmessage());
}
playersprite = new sprite(playerimage, 32, 32);
system.out.println(playersprite.getrawframecount());
enemysprite=new sprite(enemy,50,21);
backgroundsprite = new sprite(backgroundimage);
layermanager = new layermanager();
layermanager.append(playersprite);
layermanager.append(enemysprite);
layermanager.append(backgroundsprite);
}
// automatically start thread for game loop
public void start()
{
isplay = true;
thread t = new thread(this);
t.start();
}
public void stop()
{
isplay = false;
}
// main game loop
public void run()
{
graphics g = getgraphics();
while (isplay == true)
{
input();
drawscreen(g);
try
{
thread.sleep(delay);
}
catch (interruptedexception ie)
{
}
}
}
// method to handle user inputs
private void input()
{
int keystates = getkeystates();
playersprite.setframe(0);
if(isalive)
{
if(counter==0)
{
enemydirect=math.abs(random.nextint()%4);
}
counter++;
switch(enemydirect)
{
case 0:
enemyy=math.max(0,--enemyy);
break;
case 1:
enemyy=math.min(++enemyy,height-enemysprite.getheight());
break;
case 2:
enemyx=math.max(0,--enemyx);
break;
case 3:
enemyx=math.min(++enemyx,width-enemysprite.getwidth());
break;
}
counter=(counter++)%(sequence.length());
enemysprite.setframe(sequence[counter]);
}
else
{
enemyy+=counter;
enemyy=math.min(enemyy,height-enemysprite.getheight());
if(enemyy
enemysprite.setframe(3);
}
// left
if ((keystates & left_pressed) != 0)
{
currentx = math.max(0, currentx - 1);
playersprite.setframe(1);
}
// right
if ((keystates & right_pressed) != 0)
if (currentx + 5 < width)
{
currentx = math.min(width, currentx + 1);
playersprite.setframe(3);
}
// up
if ((keystates & up_pressed) != 0)
{
currenty = math.max(0, currenty - 1);
playersprite.setframe(2);
}
// down
if ((keystates & down_pressed) != 0)
{
isdown=true;
}
if ((keystates & down_pressed) != 0)
{
if(isdown)
{
if (currenty + 10 < height)
{
currenty = math.min(height, currenty + 1);
playersprite.setframe(4);
}
}
}
if((keystates & fire_pressed)!=0)
{
isalive=!isalive;
counter=0;
}
if(!(enemyx+enemysprite.getwidth()
{
counter=0;
isalive=false;
}
}
// method to display graphics
private void drawscreen(graphics g)
{
g.setcolor(0xffffff);
g.fillrect(0, 0, getwidth(), getheight());
g.setcolor(0x0000ff);
// updating player sprite position
playersprite.setposition(currentx, currenty);
enemysprite.setposition(enemyx,enemyy);
layermanager.setviewwindow(0, 0, width, height);
layermanager.paint(g, 0,0);
g.setcolor(0xffffff);
flushgraphics();
}
}
此程序里敌人随机向4个方向移动,而玩家控制的角色可任意移动, 如果两者发生碰撞,则敌人死亡.
另外按fire键可直接让敌人生或死,呵呵~~
关于运行,jbuilder里有个运行配置:

一般不用修改,如果多个midlet,你可以在这里添加.
关于用jbuilder打包.
一样file->new:

这个在2005和9,x里有所不同,选择archive,右边选择midlet,然后ok.

这里选择要打包文件的目录,当前默认是所有的class文件和资源文件,你也可以删除掉,自己选择一部分.
然后next,直到最后. 然后运行,在运行配置中默认重新rebuild,打包等等.然后你能看到左上框里有jar文件和jad文件.

运行结果:

呵呵,用你控制的主角去碰撞这只大飞虫试试:

结果飞虫挂了,掉下去了哦,呵呵~~
全文完~~~
闽公网安备 35060202000074号