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

📄 firemancanvas.java

📁 uiOne的介绍 手机以后ui开发的趋向
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.io.*;
import javax.microedition.lcdui.*;

import com.nokia.mid.ui.*;

public class FiremanCanvas
    extends FullCanvas {
    Engine engine;
    int w, h;
    int menuCursor = 0;
    Image imgMenu = null, imgMenu1 = null, imgBg = null, imgItem = null, imgMain = null;
    int firemanFrame=0;
    int alertFrame=0;
    int currentDrawFirePathDepth=0;
    public FiremanCanvas(Engine e) {
        w = getWidth();
        h = getHeight();
        engine = e;
        try {
            imgMenu = Image.createImage("/images/menu.png");
            imgMenu1 = Image.createImage("/images/menu1.png");
            imgItem = Image.createImage("/images/item.png");
            imgBg=Image.createImage("/images/bg1.png");
            imgMain=Image.createImage("/images/main.png");
        }
        catch (IOException ex) {System.out.println("load pic error");}
    }

    public void paint(Graphics g) {
        //System.out.println("canvas repainted.");
        switch (engine.state) {
            case Engine.MENU_MAIN: //主菜单
                drawMenu(g);
                break;
            case Engine.MENU_RANK: //排行榜
                drawRank(g);
                break;
            case Engine.MENU_SETUP: //选项
                drawSetup(g);
                break;
            case Engine.MENU_HELP: //帮助
                drawHelp(g);
                break;
            case Engine.MENU_MODE: //模式选择
                drawMode(g);
                break;
            case Engine.MENU_DIFFICULTY: //难度选择
                drawDifficulty(g);
                break;
            case Engine.GAME_LOOP:
            case Engine.FIRE_PATH:
                drawMainbg(g); //画背景和主页面
                drawItems(g); //画各种人物和道具
                drawPipes(g);//画中间的管道
                drawFires(g);//画火
                drawCursor(g);//画光标
                break;
            case Engine.PUT_OUT_FIRE:
                drawMainbg(g); //画背景和主页面
                drawItems(g); //画各种人物和道具
                drawPipes(g);//画中间的管道
                drawCursor(g);//画光标
                drawFires(g);//画火
                if(engine.animationFrame<5){//喷水
                    for(int i=0;i<7;i++){
                        if(engine.map[i][6].state==4){//火被连起来
                            if(engine.animationFrame==1||engine.animationFrame==3){//小水
                                drawClip(g,110,33+i*12,imgItem,52,10,13,9,0);
                            }
                            else//大水
                                drawClip(g,108,29+i*12,imgItem,128,23,15,17,0);
                        }
                    }
                }
                //else if(engine.animationFrame>5){//画上浮的分数
                //}
                break;
            case Engine.FALL_PIPES://水管下落和填充
                drawPipes(g);
                break;
            case Engine.GAME_PAUSE://暂停
                break;
            case Engine.GAME_SUBMENU://游戏中子菜单
                break;
            case Engine.LEVEL_UP://过关动画
                g.drawImage(imgBg,0,0,0);//楼房
                switch(engine.animationFrame){
                    case 2:case 4:
                        drawClip(g,56,13,imgMain,0,0,47,74,0);//火1
                        break;
                    case 3:case 5:
                        drawClip(g,56,13,imgMain,47,0,45,74,0);//火2
                        break;
                    case 6:
                        drawClip(g,56,13,imgMain,0,0,47,74,0);//火1
                        drawClip(g,3,83,imgItem,0,0,46,45,0);//消防员
                        drawClip(g,39,85,imgItem,67,67,19,18,0);//小水
                        break;
                    case 7:case 9:
                        drawClip(g,3,83,imgItem,0,0,46,45,0);//消防员
                        drawClip(g,49,38,imgItem,46,0,56,56,0);//大水1
                        break;
                    case 8:case 10:
                        drawClip(g,3,83,imgItem,0,0,46,45,0);//消防员
                        drawClip(g,44,34,imgItem,0,54,64,64,0);//大水1
                        break;
                    case 11:case 12:
                        drawClip(g,3,83,imgItem,0,0,46,45,0);//消防员
                        break;
                    case 13:case 14:
                        drawClip(g,3,83,imgItem,0,0,46,45,0);//消防员
                        drawClip(g,42,0,imgMenu1,0,0,86,86,0);//黑框
                        break;
                    case 15:case 16:

                }
                break;
        }
    }

    /**
     * drawCursor
     *
     * @param g Graphics
     */
    void drawCursor(Graphics g) {
        int x=engine.cursorx*12+29,y=engine.cursory*12+32;
        g.setColor(0xff0000);
        g.fillRect(x,y,12,1);
        g.fillRect(x,y,1,12);
        g.fillRect(x,y+11,12,1);
        g.fillRect(x+11,y,1,12);//4句画一个框
        g.setColor(0x000000);
    }

    /**
     * drawFires画右边的火。0-9为烟,10-19为小火,20-29为大火。
     * 其中每状态分两段,用来控制动画帧
     *
     * @param g Graphics
     */
    public void drawFires(Graphics g) {
        //int x=49,y=21;//火的坐标
        for(int i=0;i<7;i++){
            if(engine.fireState[i]%10==9)//让值的十位数不变,个位数在0-9之间循环。则火的状态不变,图片改变。
                engine.fireState[i]-=9;
            else
                engine.fireState[i]++;
            drawClip(g,114,24+i*12,imgItem,49+engine.fireState[i]/5*13,21,13,19,0);
        }
    }

    /**
     * drawPipes
     *
     * @param g Graphics
     */
    public void drawPipes(Graphics g) {
            for (int i = 0; i < 7; i++) {
                for (int j = 1; j < 6; j++) {
                    drawClip(g, 29 + j * 12, 32 + i * 12, imgItem, 131, 0, 12,
                             12, 0); //绿色方块背景
                    if(engine.map[i][j].state!=0){
                        drawClip(g, 29 + j * 12, 32 + i * 12, imgItem,
                                 engine.map[i][j].type * 12,
                                 engine.map[i][j].state * 12 - 12, 12, 12,
                                 engine.map[i][j].rotate);
                    }
                }
            }
    }

    /**
     * drawItems画所有的界面物品和数字
     * 包括关数、剩余火、剩余时间、分数、小人、警灯
     *
     * @param g Graphics
     */
    public void drawItems(Graphics g) {
        drawNumber(g,engine.level,1);//画关数
        if(engine.leftFires<0)//画剩余火,不许负数画出错误贴图
            drawNumber(g,0,2);
        else
            drawNumber(g,engine.leftFires,2);
        drawClip(g, 22, 45, imgItem, 82, 11, 6, 8, 0);//画后面的小三角
        drawNumber(g,engine.leftTime,3);//画剩余时间
        drawNumber(g,engine.score,4);//画分数
        //画小人,每过6关换一种形象,每过10循环换一种动作
        firemanFrame=(firemanFrame+1)%20;
        drawClip(g, 2, 83, imgItem, (engine.level/6)*29, (firemanFrame/10)*46+49, 28, 45, 0);
        if(engine.alert){//画警灯,每过5循环换一种动作
            alertFrame=(alertFrame+1)%10;
            drawClip(g, 16, 0, imgItem, (alertFrame/5)*18+94, 9, 17, 12, 0);
        }
    }

    /**
     * drawNumer
     *
     * @param g Graphics
     * @param number int
     * @param type int
     */
    private void drawNumber(Graphics g, int number, int type) {
        int x = 0, y = 0, digit = 0,temp=number;
        int[] digits=new int[9];//存放各位数字
        if(temp==0){//算出number共有几位,digit
            digit = 1;
            digits[0]=0;
        }
        else{
            do {
                digits[digit]=temp%10;
                temp /= 10;
                digit++;
            }
            while (temp > 0);
        }
        switch (type) { //根据数字类型决定首位数字位置
            case 1: //关数
                x = 17-digit*4;
                y = 26;
                break;
            case 2: //水管数
                x = 14-digit*4;
                y = 46;
                break;
            case 3: //时间
                x = 17-digit*4;
                y = 66;
                break;
            case 4: //分数
                x = 98-digit*8;
                y = 119;
                break;
        }
        for(int i=digit-1;i>=0;i--){//画出每位并位移x
            drawClip(g, x, y, imgItem, 50+digits[i]*8, 41, 8, 7, 0);
            x+=8;
        }
    }

    /**

⌨️ 快捷键说明

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