课外天地 李树青学习天地清心茶舍 → J2ME小游戏———TANK


  共有19106人关注过本帖树形打印复制链接

主题:J2ME小游戏———TANK

帅哥哟,离线,有人找我吗?
tonydark
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:9 积分:506 威望:0 精华:0 注册:2008/9/19 7:54:43
J2ME小游戏———TANK  发帖心情 Post By:2008/12/6 23:13:31 [只看该作者]


 

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;


public class Tank extends MIDlet {

    public static Tank instance;
    ChoiceList cl = new ChoiceList("PLEASE CHOICE");

    public Tank() {
        instance = this;
    }

    public void startApp() {
        Display.getDisplay(instance).setCurrent(cl);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}
/*Choice List*/

class ChoiceList extends List implements CommandListener {

    GameWelcomeCanvas gwc = new GameWelcomeCanvas(this);
    Command CMD_OK = new Command("OK", Command.OK, 1);

    public ChoiceList(String str) {
        super(str, List.IMPLICIT);
        this.append("GAME", null);
        this.addCommand(CMD_OK);
        this.setCommandListener(this);//
    }

    public void commandAction(Command c, Displayable arg1) {
        if (c == CMD_OK) {
            if (this.getSelectedIndex() == 0) {
                Display.getDisplay(Tank.instance).setCurrent(gwc);
            }
        }
    }
    }

/*Welcome canvas of game*/
class GameWelcomeCanvas extends Canvas implements CommandListener {

    Command CMD_OK = new Command("OK", Command.OK, 1);
    ChoiceList cl;
    MainScrean ms = new MainScrean(this);
    int color;/*Identify which choice has different color*/

    String NewGame = "NEW GAME";
    String C;
    String ExitGame = "EXIT";
    Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);/*Set the font style*/

    int fontHeight = font.getHeight();/*Get the height of the font*/

    int fontWidthOfNewGame = font.stringWidth(NewGame);
    int fontWidthOfContinueGame = font.stringWidth(ContinueGame);
    int fontWidthOfExitGame = font.stringWidth(ExitGame);

    public GameWelcomeCanvas(ChoiceList cl) {
        this.cl = cl;
        color = 0;
        this.addCommand(CMD_OK);
        this.setTitle("TANK");
        this.setCommandListener(this);
    }
    /*Paint Method*/

    protected void paint(Graphics g) {
        BackGround_Black(g);/*Set the Screan background to BLACK*/
        g.setColor(255, 255, 255);
        g.setFont(font);

        g.drawString(NewGame, (getWidth() - fontWidthOfNewGame) / 2, (getHeight() - 4 * fontHeight) / 2, Graphics.TOP | Graphics.LEFT);
        g.drawString(ContinueGame, (getWidth() - fontWidthOfContinueGame) / 2, (getHeight() - fontHeight) / 2, Graphics.TOP | Graphics.LEFT);
        g.drawString(ExitGame, (getWidth() - fontWidthOfExitGame) / 2, (getHeight() + 2 * fontHeight) / 2, Graphics.TOP | Graphics.LEFT);

        g.setColor(255, 0, 0);
        if (color % 3 == 0) {
            g.drawString(NewGame, (getWidth() - fontWidthOfNewGame) / 2, (getHeight() - 4 * fontHeight) / 2, Graphics.TOP | Graphics.LEFT);
        } else if (color % 3 == 1) {
            g.drawString(ContinueGame, (getWidth() - fontWidthOfContinueGame) / 2, (getHeight() - fontHeight) / 2, Graphics.TOP | Graphics.LEFT);
        } else if (color % 3 == 2) {
            g.drawString(ExitGame, (getWidth() - fontWidthOfExitGame) / 2, (getHeight() + 2 * fontHeight) / 2, Graphics.TOP | Graphics.LEFT);
        }

    }

    protected void BackGround_Black(Graphics g) {
        g.setColor(0, 0, 0);
        g.fillRect(0, 0, getWidth(), getHeight());
    }

    public void commandAction(Command cmd, Displayable arg1) {
        /*Choiced*/
        if (cmd == CMD_OK) {
            if (color % 3 == 0) {
                Display.getDisplay(Tank.instance).setCurrent(ms);
            } else if (color % 3 == 1) {
            } else if (color % 3 == 2) {
                Display.getDisplay(Tank.instance).setCurrent(cl);
            }
        }
    }

    protected void keyPressed(int keyCode) {
        if (getGameAction(keyCode) == Canvas.DOWN) {
            color++;
        } else if (getGameAction(keyCode) == Canvas.UP) {
            color += 2;
        }
        /*The Event action when you press FIRE button*/
        if (getGameAction(keyCode) == Canvas.FIRE) {
            if (color % 3 == 0) {
                Display.getDisplay(Tank.instance).setCurrent(ms);
            } else if (color % 3 == 1) {
            } else if (color % 3 == 2) {
                Display.getDisplay(Tank.instance).setCurrent(cl);
            }
        }
        repaint();
    }
    }
/*Game main screan*/

class MainScrean extends GameCanvas implements CommandListener {

    GameWelcomeCanvas gwc;
    Map1 map1 = new Map1();
    Command CMD_BACK = new Command("BACK", Command.BACK, 1);
    Command CMD_START = new Command("START", Command.OK, 1);
    Command CMD_PAUSE = new Command("PAUSE", Command.OK, 1);
    Graphics g = getGraphics();
    int Broad_X = 16;/*The different fo Interal and Out*/

    int Broad_Y = 16;
    final int backgroundSize = 8;/*The size of each Cell*/

    final int spriteSize_tank = 16;
    TiledLayer tl;
    LayerManager lm = new LayerManager();
    Image background = null;
    Image tank_Y = null;
    Image tank_Y_fire = null;
    Sprite sprite_tank = null;
    Sprite sprite_tank_fire = null;
    int tank_YOfX = 7 * spriteSize_tank;
    int tank_YOfY = getHeight() - spriteSize_tank - spriteSize_tank / 2 - 3;
    boolean GameState = false;/*Get the state of the Game*/

    int tankFaced;
    public boolean fireAgain = true;/*One buttle one time*/


    public MainScrean(GameWelcomeCanvas gwc) {
        super(true);
        this.gwc = gwc;
        this.addCommand(CMD_BACK);
        this.addCommand(CMD_START);
        paintScrean(g);/*Set the lowest background*/
        getBackgroundImage();
        LoadMap();/*Load the map*/
        this.setCommandListener(this);
    }

    public void paintScrean(Graphics g) {
        /*Outside color*/
        g.setColor(80, 80, 80);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(255, 0, 0);
        g.drawRect(Broad_X - 1, Broad_Y - 1, getWidth() - 2 * Broad_X + 1, getHeight() - 2 * Broad_Y - 2);
        /*Inside color*/
        g.setColor(255, 255, 255);
        g.fillRect(Broad_X, Broad_Y, getWidth() - 2 * Broad_X, getHeight() - 2 * Broad_Y - 3);

    }

    public void getBackgroundImage() {

        int count = Math.max(getWidth(), getHeight()) / backgroundSize;

        try {
            background = Image.createImage("/images/background.png");/*Load the background picture*/
            tank_Y = Image.createImage("/images/tank_Y.png");
            tank_Y_fire = Image.createImage("/images/tank_Y_fire.png");
            sprite_tank = new Sprite(tank_Y, spriteSize_tank, spriteSize_tank);
            sprite_tank.defineReferencePixel(spriteSize_tank / 2, spriteSize_tank / 2);/*Set the tank sprite default pix*/
            sprite_tank_fire = new Sprite(tank_Y_fire, spriteSize_tank, spriteSize_tank);
            sprite_tank_fire.defineReferencePixel(spriteSize_tank / 2, spriteSize_tank / 2);/*Set the fired tank sprite default pix*/
            tl = new TiledLayer(count, count, background, backgroundSize, backgroundSize);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

    public void LoadMap() {
        //  int mapWidth = 30;
        int[][] map = map1.getMap();/*Get the map*/
        /*The map has 36 rows and 30 columns*/
        for (int row = 0; row < 36; row++) {
            for (int column = 0; column < 30; column++) {
                tl.setCell(column, row, map[row][column]);
            }
        }
        lm.append(tl);
        lm.paint(g, 0, 0);
    }

    public void commandAction(Command c, Displayable arg1) {
        if (c == CMD_BACK) {
            Display.getDisplay(Tank.instance).setCurrent(gwc);
        } else if (c == CMD_START) {
            GameState = true;
            this.removeCommand(CMD_START);
            this.addCommand(CMD_PAUSE);
            Thread thread_tank = new Thread(new Tank_Y(g));
            thread_tank.start();
        } else if (c == CMD_PAUSE) {
            GameState = false;
            this.removeCommand(CMD_PAUSE);
            this.addCommand(CMD_START);
        }
    }
    /*The Yellow Tank thread*/

    class Tank_Y implements Runnable {

        int delay = 40;/*Wait time*/

        Graphics g;
        boolean fire = false;
        int perX;
        int perY;

        public Tank_Y(Graphics g) {
            this.g = g;
        }

        public void run() {

            while (GameState) {
                fire = false;
                controlTank();
                paintTank(g);
                try {
                    Thread.sleep(delay);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        }
        /*The method control the Yellow tank*/

        public void controlTank() {
            int keyState = getKeyStates();/*Get the key press inmidility*/
            perX = tank_YOfX;
            perY = tank_YOfY;
            /*When the tank hit any object can't move forward*/
            if ((keyState & LEFT_PRESSED) != 0) {
                tank_YOfX = Math.max(spriteSize_tank + spriteSize_tank / 2, tank_YOfX - 1);
                sprite_tank.setFrame(3);
            } else if ((keyState & RIGHT_PRESSED) != 0) {
                tank_YOfX = Math.min(getWidth() - spriteSize_tank - spriteSize_tank / 2, tank_YOfX + 1);
                sprite_tank.setFrame(2);
            } else if ((keyState & UP_PRESSED) != 0) {
                tank_YOfY = Math.max(spriteSize_tank + spriteSize_tank / 2, tank_YOfY - 1);
                sprite_tank.setFrame(0);
            } else if ((keyState & DOWN_PRESSED) != 0) {
                tank_YOfY = Math.min(getHeight() - spriteSize_tank - spriteSize_tank / 2 - 3, tank_YOfY + 1);
                sprite_tank.setFrame(1);
            } else if ((keyState & FIRE_PRESSED) != 0) {
                sprite_tank_fire.setFrame(sprite_tank.getFrame());
                fire = true;
                /*Start the buttle thread*/
                if (fireAgain) {
                    Thread thread = new Thread(new buttle(tank_YOfX, tank_YOfY, sprite_tank_fire.getFrame()));
                    thread.start();
                }
            }
            sprite_tank.setRefPixelPosition(tank_YOfX, tank_YOfY);/*Virtual move the tank station*/
            if (sprite_tank.collidesWith(tl, false)) {
                tankFaced = sprite_tank.getFrame();
                /*Get the perfor X&Y position*/
                tank_YOfX = perX;
                tank_YOfY = perY;
            }


        }

        public void paintTank(Graphics g) {
            sprite_tank.setRefPixelPosition(tank_YOfX, tank_YOfY);
            if (fire) {
                sprite_tank_fire.setRefPixelPosition(tank_YOfX, tank_YOfY);
                sprite_tank_fire.paint(g);
            } else {
                sprite_tank.paint(g);
            }
            flushGraphics();
        }
    }
    /*When the tank fired the buttle flying*/

    class buttle implements Runnable {

        Image b = null;
        Sprite sprite_b = null;
        int b_speed = 30;
        boolean flying = true;
        int b_X, b_Y;
        int tank_faced;

        public buttle(int tank_X, int tank_Y, int faced) {
            b_X = tank_X;
            b_Y = tank_Y;
            tank_faced = faced;
            fireAgain = false;
            try {
                b = Image.createImage("/images/buttle.png");
                sprite_b = new Sprite(b, 2, 2);
                sprite_b.defineReferencePixel(1, 1);
            } catch (Exception e1) {
                System.out.println(e1.getMessage());
            }
        }

        public void run() {
            while (flying) {
                buttleFlyDirection();
                try {
                    Thread.sleep(b_speed);
                    sprite_b.nextFrame();
                    sprite_b.paint(g);
                    sprite_b.prevFrame();
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                if (sprite_b.getFrame() == 1) {
                    sprite_b.setVisible(false);
                }
            }
        }

        public void buttleFlyDirection() {
            if (tank_faced == 0) {
                b_Y--;
            } else if (tank_faced == 1) {
                b_Y++;
            } else if (tank_faced == 2) {
                b_X++;
            } else if (tank_faced == 3) {
                b_X--;
            }
            sprite_b.setRefPixelPosition(b_X, b_Y);/*Change the buttle position*/
            /*Insure the buttle in the box*/
            if (b_Y > getHeight() - 3 * (Broad_Y / 2) || b_Y < Broad_Y + 5 || b_X > getWidth() - 3 * (Broad_X / 2) + 3 || b_X < Broad_X + 4) {
                // sprite_b.nextFrame();
                flying = false;
                fireAgain = true;
            } else {
            }
            /*When the buttle hit object*/
            if (sprite_b.collidesWith(tl, false)) {
                if (tl.getCell((int) (b_X / 8), (int) (b_Y / 8)) == 4) {
                    tl.setCell((int) (b_X / 8), (int) (b_Y / 8), 5);
                    tl.paint(g);/*?tl must be paint here*/
                    tl.setCell((int) (b_X / 8), (int) (b_Y / 8), 0);
                    tl.paint(g);
                    flying = false;
                    fireAgain = true;
                } else if (tl.getCell((int) (b_X / 8), (int) (b_Y / 8)) == 1 || tl.getCell((int) (b_X / 8), (int) (b_Y / 8)) == 2) {
                    tl.paint(g);/*刷地图,CPU消耗大*/
                } else if (tl.getCell((int) (b_X / 8), (int) (b_Y / 8)) == 3) {
                    // sprite_b.nextFrame();
                    flying = false;
                    fireAgain = true;
                }
            }
            sprite_b.paint(g);
            flushGraphics();
        }
    }
}



public class Map1 {

    final int MapID = 1;
    int[][] Map;

    public Map1() {
        int[][] map = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},/*EMPTY*/
            {0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0},
            {0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0},
            {0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0},
            {0, 0, 0, 2, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 2, 2, 2, 2, 0, 0, 0},
            {0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0},
            {0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0},
            {0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0},
            {0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 0, 0, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0},
            {0, 0, 3, 3, 3, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 3, 3, 3, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 3, 4, 4, 0, 0, 0, 3, 3, 3, 0, 0, 0, 4, 4, 4, 3, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 3, 4, 4, 0, 0, 0, 3, 0, 3, 0, 0, 0, 4, 4, 4, 3, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 4, 4, 4, 0, 0, 3, 4, 4, 0, 0, 0, 3, 0, 3, 0, 0, 0, 4, 4, 4, 3, 0, 0, 4, 4, 4, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          
    }

      
         ;
    

Map = map;
    }

    public int[][] getMap() {
        return Map;
    }
}

/*游戏实现了一些基本功能,但还有不少错误和不足,图片以16*16为单位*/

/*Q:如何解决Sprite图片重叠后背景图片被覆盖的问题,采用刷屏的方式效果不佳,有没有更好的方法*/


图片点击可在新窗口打开查看此主题相关图片如下:
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:
图片点击可在新窗口打开查看

[此贴子已经被admin于2010-12-13 20:06:55编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
admin
  2楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1940 积分:26616 威望:0 精华:34 注册:2003/12/30 16:34:32
回复  发帖心情 Post By:2008/12/9 9:07:20 [只看该作者]

没有运行起来,不知是不是图片文件不对,还有空指针异常

可否将完整工程打包上传?


 回到顶部