📄 firemancanvas.java
字号:
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 + -