然后填写名字和路径。继续:
然后选择JDK路径,本身已有WTK2.1,你可以选择。但是你也可以自己选择其他的WTK版本:
点击jdk后面的路径按钮,继续:
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.*; /** * <p>Title: </p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2005</p> * * <p>Company: </p> * * @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.*; /** * <p>Title: </p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2005</p> * * <p>Company: </p> * * @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<height-enemySprite.getHeight()) counter++; 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()<currentX || enemyY+enemySprite.getHeight()<currentY || enemyX>currentX+playerSprite.getWidth() || enemyY>currentY+playerSprite.getHeight()) && isalive) { 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,然后完成。
这里选择要打包文件的目录,当前默认是所有的class文件和资源文件,你也可以删除掉,自己选择一部分。然后next,直到最后。 然后运行,在运行配置中默认重新rebuild,打包等等。然后你能看到左上框里有jar文件和jad文件。
运行结果:
用你控制的主角去碰撞这只大飞虫试试:
结果飞虫掉下去啦!
(T117)