zoukankan      html  css  js  c++  java
  • 使用 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)
  • 相关阅读:
    phpstorm 2017 关掉变量提示 parameter name hints,改变打开方式
    RMAN-06496: must use the TO clause when the database is mounted or open
    FAL[client]: Failed to request gap sequence GAP
    搭建rac对单实例的MAA
    Linux下安装Oracle 10g(redhat 4)
    ora-01031:insufficient privileges
    ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
    checking for oracle home incompatibilities failed
    用root帐号切换其他帐号提示 su: warning: cannot change directory to /home/oracle: Permission denied
    an error occured during the file system check
  • 原文地址:https://www.cnblogs.com/neozhu/p/97985.html
Copyright © 2011-2022 走看看