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

📄 maincanvas.java

📁 欢迎使用蓝牙联网坦克大战
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                }
                SetViewWindow();
                break;
            case GAME_BUTTON:									//游戏中途显示按钮
                 {
                    switch (m_UI.Input(keyStates)) {
                        case MyButton.BUTTON_RESET:					//按下复位键
                            Reset();
                            setState(GAME_GAMING);
                            break;
                        case MyButton.BUTTON_EXIT:					//按下退出键
                            TankMidlet.midlet.notifyDestroyed();
                            break;
                    }
                }
                break;
            case GAME_END:

                break;
        }
    }

    public void Logic() {
        switch (m_nState) {
            case GAME_GAMING:
                //爆炸逻辑
                for (int m = 0; m < m_aExplosion.length; m++) {
                    m_aExplosion[m].Logic();
                }
                //坦克逻辑
                m_Tank1.Logic();


                //副坦克的子弹发射,无比重要
                if (mode != 0) {
                    m_Tank2.Logic();
                }
                //敌方坦克的运行在此
                for (int n = 0; n < m_eTank.length; n++) {
                    if (mode == 0) {
                        m_eTank[n].Logic();
                    } else if (mode == 1) {
                        m_eTank[n].Logic(this, n);
                    } else {
                        break;
                    }
                }
                //碰撞检测
                CheckCollision();
                //产生新的敌方坦克
                CreateETank();
                break;
        }
    }

    public void Paint() {

        Graphics g = getGraphics();
        //用黑色清屏
        g.setColor(0);
        g.fillRect(0, 0, getWidth(), getHeight());

        g.setColor(0xFFFF0000);
        switch (m_nState) {
            case GAME_UI:								//显示界面
                m_UI.Paint(g, getWidth(), getHeight());
                break;
            case GAME_GAMING:							//显示游戏画面
            case GAME_BUTTON:
            case GAME_END:
                m_LayerManager.paint(g, 0, 0);
                if (m_nState == GAME_END) {
                    m_TextSp.paint(g);
                }
                m_UI.Paint(g, getWidth(), getHeight());
                break;
        }
        flushGraphics();
    }

    //碰撞检测
    private void CheckCollision() {

        BulletSprite mB1 = m_Tank1.m_Bullet;

        BulletSprite mEB = null;
        for (int n = 0; n < m_eTank.length; n++) {
            mEB = m_eTank[n].m_Bullet;
            //敌人子弹和我方坦克碰撞

            if (mEB.collidesWith(m_Tank1, false)) {
                mEB.setVisible(false);
                m_Tank1.setVisible(false);
                if (mode == 0) {
                    m_TextSp.setFrame(1);
                    setState(GAME_END);
                    break;

                }
                if (mode != 0) {
                    sendDeath(1);
                    if (!m_Tank2.isVisible()) {
                        m_TextSp.setFrame(1);
                        setState(GAME_END);
                        break;
                    }

                }
            }

            if (mode != 0) {
                if (mEB.collidesWith(m_Tank2, false)) {

                    mEB.setVisible(false);
                    m_Tank2.setVisible(false);
                    sendDeath(2);
                    if (!m_Tank1.isVisible()) {
                        m_TextSp.setFrame(1);
                        setState(GAME_END);
                        break;
                    }

                }
            }


            //我方子弹和敌人坦克碰撞
            if (mB1.collidesWith(m_eTank[n], false)) {
                // CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
                mB1.setVisible(false);
                m_eTank[n].setVisible(false);
                if (mode != 0) {
                    sendDeath(7 + n);
                }
                m_nDestroyETank++;
                if (m_nDestroyETank >= m_nTotalETank) {
                    //消灭的所有坦克,游戏胜利
                    if (mode != 0) {
                        sendDeath(6);
                    }
                    m_TextSp.setFrame(0);
                    setState(GAME_END);
                    return;
                }
            }

            if (mode != 0) {
                BulletSprite mB2;
                mB2 = m_Tank2.m_Bullet;
                if (mB2.collidesWith(m_eTank[n], false)) {
                    //CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
                    mB2.setVisible(false);
                    m_eTank[n].setVisible(false);
                    if (mode != 0) {
                        sendDeath(7 + n);
                    }
                    m_nDestroyETank++;
                    if (m_nDestroyETank >= m_nTotalETank) {
                        //消灭的所有坦克,游戏胜利
                        sendDeath(6);
                        m_TextSp.setFrame(0);
                        setState(GAME_END);
                        return;
                    }
                }
            }


            //我方坦克和敌人碰撞
            if (m_Tank1.collidesWith(m_eTank[n], false)) {
                //都向后退
                m_Tank1.MoveBack();
                m_eTank[n].MoveBack();
            }

            if (mode != 0) {
                if (m_Tank2.collidesWith(m_eTank[n], false)) {
                    //都向后退
                    m_Tank2.MoveBack();
                    m_eTank[n].MoveBack();
                }

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




            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();
            }
            //敌人子弹与地图相撞

            int nERow = mEB.GetCurRow();
            int nECol = mEB.GetCurCol();

            if (nERow < 0 || nERow >= m_Scene.m_LyCanHit.getRows() ||
                    nECol < 0 || nECol >= m_Scene.m_LyCanHit.getColumns()) {//子弹超出场景范围
                mEB.setVisible(false);
                continue;
            }
            if (mEB.collidesWith(m_Scene.m_LyHQ, false)) {//子弹打到司令部
                m_Scene.m_LyHQ.setCell(nECol, nERow, 6);
                // CreateExplosion(mEB.getRefPixelX(), mEB.getRefPixelY());
                mEB.setVisible(false);

                if (mode == 0) {
                    m_TextSp.setFrame(1);
                    setState(GAME_END);
                    return;

                } else {
                    sendDeath(3);

                    //游戏失败
                    m_TextSp.setFrame(1);
                    setState(GAME_END);
                    return;
                }
            }
            if (mEB.collidesWith(m_Scene.m_LyCanHit, false)) {//子弹打到可摧毁的区域

                m_Scene.m_LyCanHit.setCell(nECol, nERow, 0);
                //CreateExplosion(mEB.getRefPixelX(), mEB.getRefPixelY());
                mEB.setVisible(false);
                if (mode != 0) {
                    sendMapMessage(nECol, nERow);
                }
            } else if (mEB.collidesWith(m_Scene.m_LyNotPass, false)) {//子弹打到不可摧毁的区域
                //CreateExplosion(mEB.getRefPixelX(), mEB.getRefPixelY());
                mEB.setVisible(false);
            }
        // }

        }



        //我方坦克和地图碰撞,则向后退
        if (m_Tank1.collidesWith(m_Scene.m_LyBulletPass, false)) {
            m_Tank1.MoveBack();
        } else if (m_Tank1.collidesWith(m_Scene.m_LyCanHit, false)) {
            m_Tank1.MoveBack();




        } else if (m_Tank1.collidesWith(m_Scene.m_LyNotPass, false)) {
            m_Tank1.MoveBack();
        }

        if (mode != 0) {
            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();
            }

        }
        //我方子弹与地图相撞
        int nRow1 = mB1.GetCurRow();
        int nCol1 = mB1.GetCurCol();
        int nRow2;
        int nCol2;
        if (nRow1 < 0 || nRow1 >= m_Scene.m_LyCanHit.getRows() ||
                nCol1 < 0 || nCol1 >= m_Scene.m_LyCanHit.getColumns()) {//子弹超出场景范围
            mB1.setVisible(false);
            return;
        }

        if (mode != 0) {
            //我方子弹与地图相撞
            BulletSprite mB2;
            mB2 = m_Tank2.m_Bullet;
            nRow2 = mB2.GetCurRow();
            nCol2 = mB2.GetCurCol();
            if (nRow2 < 0 || nRow2 >= m_Scene.m_LyCanHit.getRows() ||
                    nCol2 < 0 || nCol2 >= m_Scene.m_LyCanHit.getColumns()) {//子弹超出场景范围
                mB2.setVisible(false);
                return;
            }


            if (mB2.collidesWith(m_Scene.m_LyHQ, false)) {//子弹打到司令部
                m_Scene.m_LyHQ.setCell(nCol2, nRow2, 6);
                // CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
                //游戏失败
                sendDeath(3);
                m_TextSp.setFrame(1);
                setState(GAME_END);
                mB2.setVisible(false);
            } else if (mB2.collidesWith(m_Scene.m_LyCanHit, false)) {//子弹打到可摧毁的区域
                m_Scene.m_LyCanHit.setCell(nCol2, nRow2, 0);
                //CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
                mB2.setVisible(false);
                sendMapMessage(nCol2, nRow2);
            } else if (mB2.collidesWith(m_Scene.m_LyNotPass, false)) {//子弹打到不可摧毁的区域
                // CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
                mB2.setVisible(false);
            }

        }

        if (mB1.collidesWith(m_Scene.m_LyHQ, false)) {//子弹打到司令部
            m_Scene.m_LyHQ.setCell(nCol1, nRow1, 6);
            // CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
            //游戏失败
            m_TextSp.setFrame(1);
            setState(GAME_END);
            mB1.setVisible(false);
        } else if (mB1.collidesWith(m_Scene.m_LyCanHit, false)) {//子弹打到可摧毁的区域
            m_Scene.m_LyCanHit.setCell(nCol1, nRow1, 0);
            // CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
            mB1.setVisible(false);
            if (mode != 0) {
                sendMapMessage(nCol1, nRow1);
            }
        } else if (mB1.collidesWith(m_Scene.m_LyNotPass, false)) {//子弹打到不可摧毁的区域
            //CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
            mB1.setVisible(false);
        }


    }
    //随机产生敌方坦克
    public void CreateETank() {
        if (m_nTotalETank <= 0) {
            return;
        }


        //以20分之一的概率产生坦克
        int nRs = m_Random.nextInt() % 20;
        if (Math.abs(nRs) != 0) {
            return;
        }
        //如果某一位置的坦克被摧毁,则可以产生新坦克
        for (int n = 0; n < m_eTank.length; n++) {
            if (m_eTank[n].isVisible()) {
                continue;
            }

            //在这里修改过,不让客户端的敌人坦克显示出来
            if (mode != 1) {

                m_eTank[n].Start(n * 2 * 15 + 15 + 7, 15 + 7, 2, 1);
                if (mode == 2) {
                    sendStartToServer(1);
                }
            }
            break;
        }





    }

    //产生爆炸,参数nX、nY分别是爆炸位置的横纵坐标
    public void CreateExplosion(int nX, int nY) {
        for (int m = 0; m < m_aExplosion.length; m++) {
            if (m_aExplosion[m].isVisible()) {
                continue;
            }
            m_aExplosion[m].Start(nX, nY);
            break;
        }
    }

    public void commandAction(Command c, Displayable s) {

        if (c == restartCommand && m_nState == GAME_END) {

            switch (mode) {
                case 0:
                    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);
                    break;
                case 2:
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {

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

            }

        }

        if (c == exitCommand) {
            switch (mode) {


                case 0:
                    midlet.quit();
                    break;
                case 1:
                    sendDeath(5);
                    System.out.println("服务器退出连接");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {

                    }
                    midlet.quit();
                    break;
                case 2:
                    sendDeath(4);

                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {

                    }
                    midlet.quit();
                    break;
            }


        }
    }
    }

⌨️ 快捷键说明

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