⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 microtankcanvas.java

📁 坦克大战源代码
💻 JAVA
字号:
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

// ----------------游戏主类--------------------------
public class MicroTankCanvas extends GameCanvas implements Runnable,
        CommandListener
{
    public static boolean mTrucking;//开始游戏的条件
    public static MicroTankSprite mTank;// 我方坦克
    public static MicroETankSprite eTank;// 敌方坦克
    public static TiledLayer mBoard;//游戏背景图层,包括砖块
    public static ExplosionSprite explosion;// 爆炸类
    public static int num = 3;// 我方先有的生命数
    public static int enum = 5;// 敌方生命数
    public static int fx;// 移动的方向
    public static int sd;// 移动量
    
    public static boolean gameover = false;// 游戏是否结束
    public static LayerManager mLayerManager;// 管理图层
    public static int w;// 宽
    public static int h;// 高
    private MicroTankMIDlet midlet;// 一个Midlet类
    private Command command;

    private Command exitCommand = new Command("退出", Command.EXIT, 0);

    // ------------构造函数(此只是一些相关的初始化,线程还没有启动)---------------------
    public MicroTankCanvas(MicroTankMIDlet midlet) throws IOException
    {
        super(true);

        this.midlet = midlet;

        addCommand(exitCommand);
        setCommandListener(this);

        mBoard = createBoard();// 绘制背景图层包括砖块
        explosion = createExplosion();// 创建一个爆炸精灵,
        explosion.setVisible(false);//默认爆炸不可见
        mLayerManager = new LayerManager();
        mLayerManager.append(explosion);// 先加入爆炸图层

        createTank();// 创建我方坦克
        createETank();// 创建敌方坦克

        mLayerManager.append(mBoard);// 把背景加上去
        splash();//绘制初始界面

    }
    // --------------创建我方坦克--------------------
    public static void createTank()
    {
        try
        {
            Image image = Image.createImage("/tank.png");

            mTank = new MicroTankSprite(image, 14, 14);//实例化我方坦克
            mLayerManager.append(mTank);// 把坦克加上去
            mLayerManager.append(mTank.bullets);// 坦克的子弹
            mTank.setPosition(78, 52);
            fx = 3;// 方向
            sd = -4;// 移动量
        }
        catch (IOException ioe)
        {

        }
        catch (Exception e)
        {

        }

    }
    // -------------创建敌方坦克-------------------
    public static void createETank()
    {
        try
        {
            Image images = Image.createImage("/enemyTank.png");

            eTank = new MicroETankSprite(images, 14, 14);//实例化敌方坦克
            mLayerManager.append(eTank);//加上去
            mLayerManager.append(eTank.ebullets);//敌方子弹
            eTank.setPosition(18, 12);
            eTank.start();//因为敌方的坦克会自己移动
        }
        catch (IOException ioe)
        {

        }
        catch (Exception e)
        {

        }
    }

    private ExplosionSprite createExplosion() throws IOException
    {
        Image image = Image.createImage("/explosion.png");
        return new ExplosionSprite(image, 3, 3);// 因为此为自定义的类,所以要new
    }
    // --------------游戏背景的绘制,包括砖块--------------
    private TiledLayer createBoard() throws IOException
    {
        Image image = Image.createImage("/bg.png");
        TiledLayer tiledLayer = new TiledLayer(11, 11, image, 15, 15);
        // 11行11列
        int[] map = { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
                0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 3, 0, 0, 2, 0, 0,
                3, 0, 4, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 4, 0,
                3, 0, 0, 0, 0, 0, 4, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2,
                0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 2, 0, 4, 0, 2, 0, 2, 0,
                4, 0, 0, 2, 0, 3, 0, 3, 0, 0, 2, 0, 2, 2, 0, 4, 0, 0, };
        // System.out.println(map.length);
        for (int i = 0; i < map.length; i++)
        {
            int column = i % 11;
            int row = (i - column) / 11;
            tiledLayer.setCell(column, row, map[i]);

        }

        return tiledLayer;
    }
//----------------用来调用以开始游戏  实质上是启动线程------------
    public void start()
    {

        Thread t = new Thread(this);
        t.start();
    }

    public void run()
    {
        Graphics g = getGraphics();

        while (mTrucking)
        {
            long times_s = System.currentTimeMillis();

            input();//处理按键响应,主要针对我方坦克
            tick();//坦克的碰撞处理
            render(g);//屏幕的绘制

            long times_e = System.currentTimeMillis();
            long times = times_e - times_s;

            if (times > 80)
            {
                times = 80;
            }
            try
            {
                Thread.sleep(80 - times);
            }
            catch (InterruptedException ie)
            {
                ie.printStackTrace();
            }
        }
    }
//-------------坦克的碰撞处理-----------------
    private void tick()
    {
        if (mTank.collidesWith(mBoard, true))//碰到地图的砖块
        {
            System.out.println("我方碰到砖块了");
            mTank.undo();//我方坦克的反应
        }
        if (eTank.collidesWith(mBoard, true))
        {
            eTank.undo();//敌方坦克的反应
        }
        if (eTank.collidesWith(mTank, true))//坦克的相撞

        {
            eTank.setVisible(false);
            mTank.setVisible(false);//都不可见
//            mTank.setVisible(false);
            mLayerManager.remove(MicroTankCanvas.mTank);//双方的坦克移除掉
            eTank.setVisible(false);
            mLayerManager.remove(MicroTankCanvas.eTank);
            eTank.elift = false;

            createTank();//再次创建双方的坦克
            createETank();

        }

    }
//----------------处理按键响应 此为对我方坦克-------------------------
    private void input()
    {

        int keyStates = getKeyStates();
        if ((keyStates & LEFT_PRESSED) != 0)
        {
            mTank.forward(-2, 1);//向左移动  坦克本身的方向也在forward()方法中处理好了
            fx = 1;//移动方向
            sd = -5;//移动量
            if ((keyStates & FIRE_PRESSED) != 0)//按下方向键时还能开火
            {
                mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);//start启动了子弹线程,同时也传入了我方坦克的参数
            }
        }

        else if ((keyStates & RIGHT_PRESSED) != 0)
        {
            mTank.forward(2, 2);//向右
            fx = 2;
            sd = 5;
            if ((keyStates & FIRE_PRESSED) != 0)
            {
                mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
            }
        }

        else if ((keyStates & UP_PRESSED) != 0)
        {
            mTank.forward(-2, 3);
            fx = 3;
            sd = -5;
            if ((keyStates & FIRE_PRESSED) != 0)
            {
                mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
            }
        }

        else if ((keyStates & DOWN_PRESSED) != 0)
        {
            mTank.forward(2, 4);
            fx = 4;
            sd = 5;
            if ((keyStates & FIRE_PRESSED) != 0)
            {
                mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
            }
        }

        else if ((keyStates & FIRE_PRESSED) != 0)//不按下方向键时也能开火,移动量和方向都保存在变量里,只与最近一次按下方向键有关
        {

            mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
        }

    }
//---------------屏幕的绘制---------------------------
    private void render(Graphics g)
    {
        w = getWidth();
        h = getHeight();

        g.setColor(0x000000);
        g.fillRect(0, 0, w, h);

        g.setColor(244,244,0);
        //------------下面的具体位置我就不计算了------------
        g.drawString("我方", w / 2 - 33, h / 2-33, g.LEFT | g.TOP);
        g.drawString(String.valueOf(num), 30, 250, g.LEFT | g.TOP);

        g.drawString("敌方", 50, 250, g.LEFT | g.TOP);
        g.drawString(String.valueOf(enum), 80, 250, g.LEFT | g.TOP);

        int x = 1;
        int y = 1;

        // mLayerManager.setViewWindow(mTank.getX()-200,mTank.getY()-200,mTank.getX()+200,mTank.getY()+200);
        mLayerManager.paint(g, x, y);
        flushGraphics();

        if (gameover)
        {
            mTrucking = false;
            w = getWidth();
            h = getHeight();
            g.setColor(0x000000);
            g.fillRect(0, 0, w, h);
            g.setColor(0xffffff);
            g.drawString("GAME OVER", w / 2 - 80, h / 2, g.LEFT | g.TOP);
            g.drawString("Tank 1.0 B", w / 2 - 80, h / 2 + 15, g.LEFT | g.TOP);
            g.drawString("七彩阳光", w / 2 - 80, h / 2 + 30, g.LEFT
                    | g.TOP);
            flushGraphics();
        }
    }
    // -----------------绘制初始界面-------------------------
    public void splash()
    {
        Image tanklogo = null;
        try
        {
            tanklogo = Image.createImage("/tanklogo.png");
        }
        catch (IOException e)
        {
        }
        Graphics g = getGraphics();
        g.setColor(0);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage(tanklogo, 0, 0, 0);
        g.setColor(0xffffff);

        g.drawString("坦克大战", tanklogo.getWidth(), 20, 0);
        g.drawString("reasy.net", tanklogo.getWidth(), 40, 0);

        g.drawString("j2me技术联盟", tanklogo.getWidth(), 80, 0);
        g.setColor(0x999999);
        g.drawString("一个演示", tanklogo.getWidth(), 100, 0);
        repaint();
        command = new Command(mTrucking == false ? "开始" : "重新开始", Command.OK, 1);// 此也妙啊,在这里面还有一个选择判断
        addCommand(command);
    }

    public void commandAction(Command c, Displayable s)
    {
        if (c.getCommandType() == Command.EXIT)
        {
            midlet.notifyDestroyed();
        }
        else if (c.getCommandType() == Command.OK)
        {
            mTrucking = true;//开始的条件
            start();//按下开始命令就开始游戏
        }
    }

    public void stop()
    {
        mTrucking = false;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -