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

📄 gamecanvas.java

📁 一個游戲程序,一個不可多得的源碼程序,是學習J2ME的好東東.
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
import java.io.IOException;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Graphics;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.midlet.MIDlet;
import com.nokia.mid.ui.FullCanvas;

/*************************************
 *游戏画面类 作者:郭松柏 2004-10-20
 * ===================================*/
public class GameCanvas extends FullCanvas {
    private static final int LOGO     = 0;
    private static final int INDEX    = 1;
    private static final int SEELOG   = 2;
    private static final int SOUND    = 3;
    private static final int HELP     = 4;
    private static final int LEVEL    = 5;
    private static final int SUBLEVEL = 6;
    private static final int GAME     = 7;
    private static final int PASSSUB  = 8;
    private static final int PASS     = 9;
    private static final int WIN      = 10;
    private static final int ABOUT    = 11;
    private static final int NEWGAME  = 12;

    //public static final Font smallFont = Font.getFont(0, 0, 8);
    //public static final Font bigFont = Font.getFont(0, 1, 0);
    
    private int                 gameState;     //游戏状态
    private int                 menuState;     //菜单状态
    private int                 menuNum;       //菜单数
    private int                 scoll;         //文本滚动
    private int                 level;         //大关
    private int                 subLevel;      //小关
    private int                 completeColor;
    private boolean[][]         mark;          //标记
    private boolean[]           levelPass;
    private boolean []          stars;  //小关星星数
    private int []              score;  //小关分数

    private int                 passCount;
    private int                 timeCount;
    private int                 doCount;
    private boolean             soundOpen;
    
    private Timer               gameTimer;     //timer
    private SCFresh             scFresh;       //刷屏
    private Player              player=null;
    private LoadImages          li;            //载入图片
    private GameLogic           gl;            //逻辑
    private ScoreData           sd;
    private MIDlet              m;
    /**构造器**/
    protected GameCanvas(MIDlet main) {
        this.m = main;
        gameState = LOGO;
        li = new LoadImages();
        li.loadLogoImg();
        gameTimer = new Timer();
        scFresh = new SCFresh(); //刷屏
        gameTimer.schedule(scFresh, 0, 200);
    }

    /** 整体绘画:paint**/
    protected void paint(Graphics g) {
        switch(gameState){
        case LOGO:
            logoPage(g);
            break;
        case INDEX: //INDEX
            indexPage(g);
            break;
        case NEWGAME: //NEWGAME
            newGamePage(g);
            break;
        case LEVEL: //选关
            levelPage(g);
            break;
        case SUBLEVEL: //选小关
            subLevelPage(g);
            break;
        case GAME: //游戏
            paintGame(g);
            break;
        case PASSSUB: //过小关画面
            passSubPage(g);
            break;
        case PASS: //过关画面
            passPage(g);
            break;
        case WIN: //LOGO
            winGamePage(g);
            break;
        case SEELOG:
            seeLog(g);
            break;
        case HELP:
            helpPage(g);
            break;
        case ABOUT:
            aboutPage(g);
            break;
        }
    }
    /**绘制LOGO:logoPage**/
    protected void logoPage(Graphics g) {
        //移动
        if (timeCount <8) {
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.drawImage(li.logoImgYD, 30,61, 20);
        }
        //sina
        if (timeCount >=8 && timeCount <16) {
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.drawImage(li.logoImgSina,13, 20, 20);
        }
        //our co.
        if (timeCount >=16 && timeCount <24) {
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.drawImage(li.logoImgCo, 30, 71, 20);
        }
    }

    /**绘画首页**/
    private void indexPage(Graphics g) {
        int x = 57;
        int y = 184;
        g.setColor(0x000000);
        g.drawImage(li.indexPageImg, 0, 0, 20);
        //menu
        String[] menu = {" 新游戏","读取进度","查看记录","  帮  助","声音","  关  于","  退  出"};
        /*String[] menu ={"new game","load game","scores","help","sound","exit"};*/
        if (menuNum == 4) {
            if (soundOpen)
                g.drawString(menu[menuNum] + "=>关", x, y, 20);
            else
                g.drawString(menu[menuNum] + "=>开", x, y, 20);
        } else {
            g.drawString(menu[menuNum], x, y, 20);
        }
        x = 38;
        y = 91;
        if (menuState == 0) {
            drawDoing(g, x, y, "清除进度?");
            drawButton(g, 0, 188, "  是");
            drawButton(g, 137, 188, "  否");
        }
        if (menuState == 1 || menuState == 3) {
            drawDoing(g, x, y, "没有记录");
        }
        if (menuState == 5) { //声音设置
            if (soundOpen)
                drawDoing(g, x, y, "声音打开");
            else
                drawDoing(g, x, y, "声音关闭");
        }
    }
    
    //设置结果
    private void drawDoing(Graphics g,int x,int y, String s){
        g.drawImage(li.doingImg, x, y, 20);
        g.drawString(s, x+19, y+7, 20);
    }
    
    /**新游戏**/
    private void newGamePage(Graphics g) {
        g.setColor(0x000000);
        g.fillRect(0, 0, getWidth(),getHeight());
        String[] newgame={
                "日月神教秘技吸星大",
                "法重现江湖,引起江",
                "湖中人的血拼争夺,",
                "乱世之中秘籍竟然落",
                "到了你的手中,于是",
                "你隐居深山开始刻苦",
                "修炼…"
                };
        g.setColor(0xffcc00);
        for(int i=0;i<newgame.length;i++){//显示11行
            g.drawString(newgame[i], 17, 32+18*i, 20);
        }
    }

    /**绘制选关:levelPage**/
    protected void levelPage(Graphics g) {
        //底部纹理
        fillBack(g,0,0,11,13);
        g.drawImage(li.levelPageImg, 0, 0, 20);
        int tmpL=sd.getLevel();
        int xy[][] = {{116,84},{57,79},{74,86},{99,85},
                      {76,145},{91,186},{96,53},{86,13}};
        for (int i = 0; i < 8; i++) {
        	if(tmpL==0){
        		if(i==0){
                    g.drawImage(li.levleMenuImg[1], xy[0][0], xy[0][1],20);
        	    }else{ //not pass levels
                    g.drawImage(li.levleMenuImg[2], xy[i][0], xy[i][1],20);
        	    }
            }
        	if(tmpL>0){
        		if(i < tmpL) { //pass levels
                    if (i == level){  //selected
                        g.drawImage(li.levleMenuImg[1], xy[i][0], xy[i][1],20);
                    } else {
                        g.drawImage(li.levleMenuImg[0], xy[i][0], xy[i][1],20);
                    }
                } else { //not pass levels
                    g.drawImage(li.levleMenuImg[2], xy[i][0], xy[i][1],20);
                }
            }
        }
        //botton
        drawButton(g,10,189,"选关");
        drawButton(g,127,189,"返回");
    }
    
    //底部纹理
    private void fillBack(Graphics g,int x,int y,int w,int h){
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++)
                g.drawImage(li.backTexImg, x+j*16, y+i*16, 20);
        }
    }

    /**绘制选小关:subLevelPage**/
    protected void subLevelPage(Graphics g) {
        //底部纹理
        fillBack(g,0,0,11,13);
        g.drawImage(li.sbLevelPageImg, 0, 0, 20); //画背景
        //关数
        g.setColor(0xFE00DD);
        g.drawString("修炼 "+(level+1)+" 级", 60, 32, 20);
        //绘制菜单
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 5; j++) {
                int x=36 + j * 21;
                int y=86 + i * 21;
                if (subLevel == (i * 5 + j)) {
                    g.drawImage(li.sbLevleMenuImg[1], x, y,20);
                } else {
                    if(levelPass[i * 5 + j]){
                        g.drawImage(li.sbLevleMenuImg[2], x, y,20);
                    }else{
                        g.drawImage(li.sbLevleMenuImg[0], x, y,20);
                    }
                }
            }
        }
        //botton
        drawButton(g,10,189,"选关");
        drawButton(g,127,189,"返回");
    }

    /**绘制通关**/
    private void winGamePage(Graphics g) {
        g.setColor(0x000000);
        g.fillRect(0, 0, getWidth(),getHeight());
        String[] win={
                "经过无数日夜的刻苦",
                "修炼,终于修得吸星",
                "大法的最高境界。哈",
                "哈哈哈,你长笑一声",
                "。江湖的血雨腥风从",
                "此开始…"
                };
        g.setColor(0xffcc00);
        for(int i=0;i<win.length;i++){//显示11行
            g.drawString(win[i], 17, 45+18*i, 20);
        }
    }

    /**查看记录**/
    private void seeLog(Graphics g) {
    	//统计
        int starsCount = 0;
        int scoreCount = 0;
        int []tmpScore = sd.getAllScore(); //取得分数
        int []tmpStars = sd.getAllStars(); //取得星星数
        //总计
        for (int i = 0; i < tmpStars.length; i++) {
            starsCount = starsCount + tmpStars[i];
            scoreCount = scoreCount + tmpScore[i];
        }
        //画
        //g.fillRect(0,0,getWidth(),20);
        fillBack(g,0,0,11,13); //纹理
        //表格
        g.setColor(0xC9B376);
        int v=5;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 2; j++)
                g.fillRect(19+j*41,v+i*18,40,17);
            g.fillRect(101,v+i*18,53,17);
        }
        g.setColor(0x000000);
        //g.drawLine(0,20,getWidth(),20);
        //g.drawString("记 录", 66, 1, 20);
        g.drawString("关卡", 27, v, 20);
        g.drawString("星星", 68, v, 20);
        g.drawString("得分", 116, v, 20);
        v=22;
        for (int i = 0; i < tmpStars.length; i++) {
            //level
            g.drawString(i + 1 + "",       35, v + i * 18, 20);
            g.drawString(tmpStars[i] + "", 78, v + i * 18, 20);
            g.drawString(tmpScore[i] + "", 116,v + i * 18, 20);
        }
        //总计
        g.drawString("总计", 27, v + 8 * 18, 20);
        g.drawString(starsCount + "", 78,  v + 8 * 18,20);
        g.drawString(scoreCount + "", 116, v + 8 * 18,20);
        //back
        drawButton(g,137,189,"返回");
    }

    /**帮助**/
    private void helpPage(Graphics g) {
        String[] help={
                "游戏介绍:",
                "本游戏为益智类游戏。",
                "将所有左下角所提示的",
                "颜色的方块连成一片,",
                "则过关(白色方块不能",
                "移动)。",
                "按键说明:",
                "方向键或",
                "2-8-4-6数字键:",
                "移动方块",
                "OK键或左软键:",
                "确认或弹出菜单",
                "右软键:返回",
                "*键:该小关重新开始",
                "保存进度:",
                "游戏中可按OK键或左",
                "软键弹出菜单,再选择",
                "“保存进度”,可保存",
                "该大关已完成的小关",
                "游戏奖励:",
                "方块组合形状跟右下角",
                "提示的形状相同,则会",
                "得到一颗星星",
                "",
                "客服电话:95105670",
                "客服EMAIL:",
                "bjkf@staff.sina.com.cn"
                };
        //底部色快
        g.setColor(0xC9B376);
        g.fillRect(0, 0, getWidth(), 19);
        fillBack(g,0,19,11,12); //纹理
        g.setColor(0x533D00);
        g.fillRect(164, 19, 12, getHeight()-39);
        g.setColor(0x000000);
        g.drawLine(0,19,getWidth(),19);
        //箭头
        if(scoll>0){
            g.drawImage(li.arrowImg[0], 166, 10+(getHeight()-19)/2,20);
        }
        if(scoll<17){
            g.drawImage(li.arrowImg[1], 166, 20+(getHeight()-19)/2,20);
        }
        g.drawString("帮 助", 68, 1, 20);
        g.setColor(0xeeeeee);
        for(int i=scoll;i<10+scoll;i++){//显示11行
            g.drawString(help[i], 3, 20+17*(i-scoll), 20);
        }
        //back
        drawButton(g,137,189,"返回");
    }

    /**关于**/
    private void aboutPage(Graphics g) {
        String[] about={
                "新浪无线代理发行",
                "",
                "发行商网站:",
                "http://mbox.sina.com.cn",
                "客服电话:",
                "95105670",
                "客服EMAIL: ",
                "bjkf@staff.sina.com.cn"
                };
        //底部色快

⌨️ 快捷键说明

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