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

📄 maincanvas.java

📁 欢迎使用蓝牙联网坦克大战
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package newpackagetank;

import java.util.Random;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;

public class MainCanvas extends GameCanvas
        implements Runnable, CommandListener {

    public static final int GAME_UI = 0;	//进入用户界面
    public static final int GAME_GAMING = 1;	//进行游戏
    public static final int GAME_BUTTON = 2;	//游戏时显示界面按钮
    public static final int GAME_END = 3;	//游戏结束
    public static final int GAME_STATE_NUM = 4;	//状态总数
    private int m_nState = GAME_UI;						//存储当前的游戏状态
    private boolean m_bRunning;			    		//控制线程运行
    private MyUI m_UI;							//界面对象
    private Sprite m_TextSp;						//图形文字对象
    private int m_nTotalETank;					//敌方坦克总数
    private int m_nDestroyETank;				//目前消灭的敌方坦克数
    private int m_nCount;                                       //目前生成坦克数量
    private EnemyTank m_eTank[];						//敌方坦克对象
    private Scene m_Scene;						//场景对象
    private ExplosionSprite m_aExplosion[];				//爆炸对象
    private Random m_Random;						//随机数对象
    private LayerManager m_LayerManager;					//层管理器对象
    //高级按钮对象
    private Command restartCommand;
    private Command exitCommand;
    private TankMidlet midlet;
    private CombatCanvas canvas;
    private static int mode;
    private PlayerTank m_Tank1;
    private PlayerTank m_Tank2;

    public MainCanvas(TankMidlet mid, CombatCanvas canvas, int mode) {
        super(true);
        midlet = mid;
        this.canvas = canvas;
        this.mode = mode;
        try {
            //创建用户界面,并设置界面中的按钮
            MyButton button = new MyButton(41, 21, 0, 1, -1, -1, -1, 2);
            m_UI = new MyUI(button);


        } catch (Exception e) {
            System.out.println("yichang");
        }


        setState(GAME_UI);
        Start();

    }
    //重新开牌
    protected void Reset() {
        //创建随机数对象
        if (m_Random == null) {
            m_Random = new Random();
        }
        if (m_Tank1 == null) {
            m_eTank = new EnemyTank[2];
            m_aExplosion = new ExplosionSprite[3];
            try {
                //创建坦克对象
                Image image = Image.createImage("/demo/tank.png");
                if (this.mode == 0) {
                    m_Tank1 = new PlayerTank(image, 13, 13);
                } else {
                    m_Tank1 = new PlayerTank(image, 13, 13);
                    m_Tank2 = new PlayerTank(image, 13, 13);
                }
                image = Image.createImage("/demo/enemyTank.png");
                for (int n = 0; n < m_eTank.length; n++) {
                    m_eTank[n] = new EnemyTank(image, 13, 13);
                }
                //创建爆炸对象
                image = Image.createImage("/demo/explosion.png");
                for (int m = 0; m < m_aExplosion.length; m++) {
                    m_aExplosion[m] = new ExplosionSprite(image, 21, 17);
                }
            } catch (Exception e) {
            }
        }
        //创建场景对象
        if (m_Scene == null) {
            m_Scene = new Scene();
        }
        if (m_LayerManager == null) {//创建层管理器,并将所有图层添加到管理器
            m_LayerManager = new LayerManager();
            for (int m = 0; m < m_aExplosion.length; m++) {
                m_LayerManager.append(m_aExplosion[m]);
            }
            m_LayerManager.append(m_Scene.m_LyCanPass);
            if (mode == 0) {
                m_LayerManager.append(m_Tank1);
                m_LayerManager.append(m_Tank1.m_Bullet);
            } else {
                m_LayerManager.append(m_Tank1);
                m_LayerManager.append(m_Tank1.m_Bullet);

                m_LayerManager.append(m_Tank2);
                m_LayerManager.append(m_Tank2.m_Bullet);
            }


            for (int n = 0; n < m_eTank.length; n++) {
                m_LayerManager.append(m_eTank[n]);
                m_LayerManager.append(m_eTank[n].m_Bullet);
            }
            m_LayerManager.append(m_Scene.m_LyBulletPass);
            m_LayerManager.append(m_Scene.m_LyCanHit);
            m_LayerManager.append(m_Scene.m_LyNotPass);
            m_LayerManager.append(m_Scene.m_LyHQ);
        }
        //敌方坦克总共10辆
        m_nTotalETank = 10;
        //当前尚未消灭敌方坦克
        m_nDestroyETank = 0;
        m_nCount = 0;
        //读取场景地图
        m_Scene.LoadMap();
        //玩家坦克启动
        if (mode == 0) {
            m_Tank1.Start(15 * 2 + 7, 15 * 8 + 7, 0, 2);

        }
        if (mode == 1) {
            m_Tank1.Start(15 * 2 + 7, 15 * 8 + 7, 0, 2);

            m_Tank2.Start(15 * 8 + 7, 15 * 8 + 7, 0, 2);

        }
        if (mode == 2) {
            m_Tank1.Start(15 * 8 + 7, 15 * 8 + 7, 0, 2);

            m_Tank2.Start(15 * 2 + 7, 15 * 8 + 7, 0, 2);

        }

        //设置游戏画面的显示区域
        SetViewWindow();



        if (restartCommand == null) {
            //创建菜单
            restartCommand = new Command("Restart", Command.OK, 1);
            exitCommand = new Command("EXIT", Command.EXIT, 2);
            addCommand(restartCommand);
            addCommand(exitCommand);

            setCommandListener(this);
        }
        if (m_TextSp == null) {
            //创建图形文字对象
            try {
                Image img = Image.createImage("/demo/text.png");
                m_TextSp = new Sprite(img, 82, 25);
                m_TextSp.defineReferencePixel(41, 23);
                int x = getWidth() / 2;
                int y = getHeight() / 2 - 10;
                m_TextSp.setRefPixelPosition(x, y);
            } catch (Exception exception) {
            }
        }

    }

    //设置游戏画面的显示区域
    private void SetViewWindow() {
        if (m_LayerManager == null) {
            return;
        }
        m_LayerManager.setViewWindow(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
    }

    private void setState(int state) {					//设置游戏状态
        if (state < 0 || state >= GAME_STATE_NUM) {
            return;
        }
        m_nState = state;
        switch (m_nState) {
            case GAME_UI:										//进入用户界面
                m_UI.setState(MyUI.UI_TITLE);					//显示标题界面
                //设置本游戏的按钮类型,本游戏有:开始及退出两种按钮
                m_UI.getButton().setShow(true, false, false, false, false, true);
                break;
            case GAME_BUTTON:									//在游戏中途显示按钮
                m_UI.setState(MyUI.UI_BUTTON);
                //游戏中途,显示复位与退出按钮
                m_UI.getButton().setShow(false, true, false, false, false, true);
                break;
            case GAME_GAMING:									//正在游戏
                m_UI.setState(MyUI.UI_HIDE);
                break;
            case GAME_END:										//游戏结束
                m_UI.setState(MyUI.UI_HIDE);
                break;
        }
    }

    public void Start() {

        m_bRunning = true;
        Thread thread = new Thread(this);	//分配新线程
        thread.start();						//线程启动

    }

    public void run() {
        //得到系统当前时间,并将时间换算成毫秒
        long T1 = System.currentTimeMillis();
        long T2 = T1;
        while (m_bRunning) {
            T2 = System.currentTimeMillis();
            if (T2 - T1 > 50) {			//间隔50毫秒
                T1 = T2;
                Input();
                Logic();
                Paint();
            }
        }
    }

    public void Stop() {
        m_bRunning = false;
    }
//发送主坦克位置信息
    public void sendMessage(int x) {

        this.canvas.sendStartShootData(x);

    }

    public void setTankNewPosition(int keyStates) {
        try {
            Thread.sleep(30);
        } catch (InterruptedException e) {

        }
        m_Tank2.InputClient(keyStates);
        CheckCollision();

    }

    //发送敌方坦克信息
    public void sendEnemyMessage(int x, int number) {

        this.canvas.sendEnemyTankData(x, number);

    }

    public void setEnemyTankNewPosition(int dir, int num) {



        m_eTank[num].LogicClient(dir);
        //CheckCollision();
        if (m_Tank2.collidesWith(m_Scene.m_LyBulletPass, false)) {
            m_Tank2.MoveBack();
        } else if (m_Tank2.collidesWith(m_Scene.m_LyCanHit, false)) {
            m_Tank2.MoveBack();
        } else if (m_Tank2.collidesWith(m_Scene.m_LyNotPass, false)) {
            m_Tank2.MoveBack();
        }

        for (int n = 0; n < m_eTank.length; n++) {

            //敌人和地图碰撞,敌人向后退




            if (m_eTank[n].collidesWith(m_Scene.m_LyBulletPass, false)) {
                m_eTank[n].MoveBack();
            } else if (m_eTank[n].collidesWith(m_Scene.m_LyCanHit, false)) {
                m_eTank[n].MoveBack();
            } else if (m_eTank[n].collidesWith(m_Scene.m_LyNotPass, false)) {
                m_eTank[n].MoveBack();
            }
        }
    }

    public void shootEnemyBullet(int dir, int number) {
        this.canvas.sendEnemyBullet(dir, number);

    }

    public void startEnemyBullet(int dir, int number) {


        int x = m_eTank[number].getRefPixelX();
        int y = m_eTank[number].getRefPixelY();
        m_eTank[number].CreateEnemyBullet(dir, x, y);

    }

    public void sendMapMessage(int col, int row) {
        canvas.sendMapMessage(col, row);
    }

    public void resetMap(int col, int row) {
        m_Scene.m_LyCanHit.setCell(col, row, 0);

    }

    public void sendDeath(int num) {

        canvas.sendDeath(num);

    }

    public void setDeath(int num) {
        switch (num) {

            case 1:
                if (m_Tank2.isVisible()) {
                    m_Tank2.setVisible(false);
                }
                break;
            case 2:
                if (m_Tank1.isVisible()) {
                    m_Tank1.setVisible(false);
                }
                break;
            case 3:
                if (m_nState == GAME_GAMING) {
                    m_TextSp.setFrame(1);
                    setState(GAME_END);
                }
            case 4:
                if (m_Tank2.isVisible()) {
                    m_Tank2.setVisible(false);
                }
                break;
            case 5:
                System.out.println("客户端退出连接");
                midlet.quit();
                break;
            case 6:
                if (m_nState == GAME_GAMING) {
                    m_TextSp.setFrame(0);
                    setState(GAME_END);
                }
                break;
            case 7:
                m_eTank[0].setVisible(false);
                if (m_nDestroyETank >= m_nTotalETank) {
                    //消灭的所有坦克,游戏胜利                   
                    sendDeath(6);
                    try {
                        Thread.sleep(800);
                    } catch (InterruptedException e) {

                    }
                    m_TextSp.setFrame(0);
                    setState(GAME_END);
                }
                break;
            case 8:
                m_eTank[0].setVisible(false);
                if (m_nDestroyETank >= m_nTotalETank) {
                    //消灭的所有坦克,游戏胜利                   
                    sendDeath(6);
                    try {
                        Thread.sleep(800);
                    } catch (InterruptedException e) {

                    }
                    m_TextSp.setFrame(0);
                    setState(GAME_END);
                }
                break;

            default:
                break;

        }


    }

    public void sendStartToServer(int start) {
        this.canvas.sendStartToServer(start);
    }

    public void startServerEnemy(int start) {

        if (m_nState == GAME_GAMING) {
            if (start == 1) {
                for (int n = 0; n < m_eTank.length; n++) {
                    if (m_eTank[n].isVisible()) {
                        continue;
                    }
                    m_eTank[n].Start(n * 2 * 15 + 15 + 7, 15 + 7, 2, 1);
                    break;
                }

            }
        }
        if (m_nState == GAME_END) {
            Reset();
            for (int n = 0; n < m_eTank.length; n++) {
                m_eTank[n].Start(n * 2 * 15 + 15 + 7, 15 + 7, 2, 1);
            }
            setState(GAME_GAMING);
        }


    }

    public void Input() {
        int keyStates = getKeyStates();
        switch (m_nState) {
            case GAME_UI:
                 {
                    switch (m_UI.Input(keyStates)) {
                        case MyButton.BUTTON_START:					//按下开始键
                            Reset();
                            setState(GAME_GAMING);
                            break;
                        case MyButton.BUTTON_EXIT:					//按下退出键
                            TankMidlet.midlet.notifyDestroyed();
                            break;
                    }
                }
                break;
            case GAME_GAMING:									//游戏中
                if (mode == 0) {
                    if (m_Tank1.isVisible()) {
                        m_Tank1.Input(keyStates);
                    }
                } else {
                    if (m_Tank1.isVisible()) {
                        m_Tank1.Input(keyStates, this);
                    }

⌨️ 快捷键说明

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