使用 Jbulider 开发 J2ME 移动游戏程序

作者使用JBuilder2005,里面自带WTK2.1,自己下载2.2版本,2.2那个默认的模拟器看着实在爽。另外,Jbuilder X下的WTK也是2.0的版本。Jbuilder 9的WTK是1.04。首先开启Jbuilder。建立一个Project:













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


然后选择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)

你可能感兴趣的:(j2me)