📄 gamecanvas.java
字号:
/*画布类,画logo,游戏画面*/package Speeds;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Image;import java.util.Random;import com.nokia.mid.ui.FullCanvas;import com.nokia.mid.ui.DirectUtils;public class GameCanvas extends FullCanvas{ protected Man blackMan=null; protected GameData gda=null; protected int showCon=0; private Image logo=null; private Image bigPic=null; private Image midPic=null; private Image glogo=null; private Image grid=null; private Image status=null; private Image menuItem=null; private int srcW=0; private int srcH=0; private int stepW=8; private boolean loadImg=false; private Display gDisp=null; protected short bakBeginX=0; //背景开始绘制的x坐标(用于背景滚屏移动) protected short streetBeginX=0; //道路开始绘制的x坐标(用于道路滚屏移动) protected short midBeginX=0; //中层景物的参照x坐标 private int bombX,bombY; private short bloodY=0; //绘制补给品的y坐标 private short screenMovX=80; //滚屏位置 protected short mapDataBeginX=0; //地图数据起始位置,按每隔8个象素一格 protected Graphics myGraphic=null; //菜单图对象 protected boolean keyup=false,keyup1=false; protected boolean keydown=false,keydown1=false; protected boolean keyleft=false,keyleft1=false; protected boolean keyright=false,keyright1=false; protected boolean keyfire=false,keyfire1=false; protected boolean manWait=false; protected boolean keyTouched=false; protected boolean keyRightFunc=false; //右功能键 protected int bi; protected int bx; //protected int curPosX=0; private Random ra; protected boolean isGameOver=false; protected boolean isRunning=false; protected boolean passInitOk=false; //画一些过场 protected int passCount=0; protected int passStep=0; //记录图素在位置,大小及属于那个大图,编号是存储在地图数据中的图素编号,最后一位用来区分所属大图,0为小图,1为大图 protected short[][] picsPos={{0,191,30,16,16}, //南瓜炸弹 {1,191,45,16,16}, //榴莲炸弹 {2,191,14,16,16}, //苹果炸弹 {3,191,-2,16,16}, //西瓜炸弹 {4,160,3,24,32}, //右向敌人 {5,2,40,24,32}, //左向敌人 {6,239,66,8,10}, //石块 {7,207,66,8,10}, //垃圾桶 {8,0,0,32,90}, //丛林背景 {9,32,0,32,90}, //食人部落背景 {10,64,0,32,90}, //雪地背景 {11,96,0,32,90}, //日落大道背景 {12,0,90,32,47}, //丛林道路 {13,32,90,32,47}, //食人部落道路 {14,64,90,32,47}, //雪地道路 {15,96,90,32,47}, //日落大道道路 {16,43,128,22,18}, //小草从深色 {17,128,100,48,20}, //小草丛浅色 {18,43,147,64,32}, //大草丛 {19,128,1,50,55}, //岩石 {20,0,156,34,23}, //长草丛浅色 {21,108,156,34,22}, //长草丛深色 {22,65,128,22,18}, //短草丛 {23,0,128,44,27}, //栅栏 {24,128,56,49,45}, //斜草丛蓝白色 {25,145,129,40,29}, //斜草丛深色右 {26,108,129,40,29}, //斜草丛深色左 {27,191,64,8,16}, //血包 {28,224,61,16,16} //机关爆炸 }; protected short[][] mansPos={{41,3,16,32}, //右走1 0 {25,3,16,32}, //右走2 1 {57,3,17,32}, //右走3 2 {1,3,23,32}, //右开枪 3 {74,11,22,24}, //右下蹲 4 {98,11,30,24}, //右拆弹 5 {128,22,32,16}, //右死亡 6 {129,40,16,32}, //左走1 7 {145,40,16,32}, //左走2 8 {112,40,17,32}, //左走3 9 {161,40,23,32}, //左开枪 10 {90,48,22,24}, //左下蹲 11 {58,48,32,24}, //左拆弹 12 {26,55,32,16}, //左死亡 13 {184,3,4,2}, //子弹右 {184,6,4,2}}; //子弹左 protected String[] menuStr={"新游戏","继续上次游戏","游戏帮助","音量控制","退出游戏"}; protected boolean showMenuFlag=false; protected int menuItemId=0; protected int menuClass=0; private String helpStr="注意:请打开手机声音,仔细分辨炸弹鸣音,以便拆除炸弹。\n操作控制:方向键行走,下键下蹲。OK键开枪。手机右功能键开/关菜单。下蹲后再按下键,则根据不同状态,主角做出不同动作。炸弹分四类:A、B、X、T型。B、A型属可解除的节律弹,以某种节拍在危险(红色)和安全(绿色)间闪动,当处于安全状态(绿色)时,对它进行解除(下蹲时按下键),可使其失效。T型弹是定时炸弹,一旦启动就不可解除。在空地前蹲下,按下键即可安放它。再按下键即启动它。X型属不可拆除的集束炸弹,只能其他炸弹引爆它。"; protected int soundMaxVar=10; protected int soundVar=0; protected boolean showHelp=false; protected int beginCol=0; private short strPointer[]=new short[10]; protected short page=0; protected int colW=0; protected boolean showTitle=false; //是否显示标题 private String levelTitle[]={"第一章","第二章","第三章","第四章","尾声"}; private String levelString[]={"雨林烟起","食人部落","落基山的雪","日落大道"," "}; public GameCanvas(Display disp) { //构造器 srcW=getWidth(); srcH=getHeight(); gDisp=disp; blackMan=new Man(160,this); gda=new GameData(this,blackMan); ra=new Random(); int i; //gda.manBeginY=srcH-picsPos[gda.mapGlobe[2]][4]+10; //curPosX=blackMan.mapPosX; try { logo=Image.createImage("/icons/c_logo.png"); grid=DirectUtils.createImage(100,100,0x925099FF); menuItem=DirectUtils.createImage(100,20,0x5500FFAA); glogo=Image.createImage("/icons/g_logo.png"); status=Image.createImage("/icons/status.png"); } catch (java.io.IOException e) { System.out.println("open image file error"); } try { soundVar=PlaySound.getmygain(); } catch (IllegalStateException e) { soundVar=5; } } public void start() { gDisp.setCurrent(this); } public void paint(Graphics g) { int imgX=0; int imgY=0; int i,j; int imgNum=0; if(showCon==0) { //画公司logo if(passInitOk) { g.setColor(0x00000000); g.fillRect(0,0,srcW,srcH); g.drawImage(logo,0-(srcW-passCount*8),0,Graphics.TOP|Graphics.LEFT); } else { g.drawImage(logo,0,0,Graphics.TOP|Graphics.LEFT); } } if(showCon==1) { //画游戏logo if(!showMenuFlag) { if(passInitOk) { g.setColor(0x00000000); g.fillRect(0,0,srcW,srcH); g.drawImage(glogo,0-(srcW-passCount*8),0,Graphics.TOP|Graphics.LEFT); } else { g.drawImage(glogo,0,0,Graphics.TOP|Graphics.LEFT); } } //showMenuFlag=true; g.setColor(0x00000000); if(showMenuFlag) { g.fillRect(0,0,srcW,srcH); } drawMenu(g); } if(showCon==2) { //游戏内容 if(showTitle) { g.setClip(0,0,srcW,srcH); g.setColor(0x00000000); g.fillRect(0,0,srcW,srcH); g.setColor(0x00FFFFFF); g.setFont(Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_SMALL)); g.drawString(levelTitle[gda.gameLevel-1],10,20,Graphics.TOP|Graphics.LEFT); g.drawString(levelString[gda.gameLevel-1],10,40,Graphics.TOP|Graphics.LEFT); //showTitle=false; } else { if(!loadImg) { logo=null; glogo=null; try { bigPic=Image.createImage("/icons/big.png"); midPic=Image.createImage("/icons/mans.png"); //status=Image.createImage("/icons/status.gif"); } catch (java.io.IOException e) { System.out.println("open image file error"); } loadImg=true; //System.out.println("load pic ok"); } //画游戏背景,画三次以实现移动效果 short bakImgNum=(short)gda.mapGlobe[1]; for(i=-1;i<=srcW/picsPos[bakImgNum][3];i++) { g.setClip(0+i*picsPos[bakImgNum][3]-bakBeginX,0,picsPos[bakImgNum][3],picsPos[bakImgNum][4]); g.drawImage(bigPic,0-picsPos[bakImgNum][1]+i*picsPos[bakImgNum][3]-bakBeginX,0-picsPos[bakImgNum][2], Graphics.TOP|Graphics.LEFT); } //画其他存储在地图数据中的图素,前方要多画半屏 bi=blackMan.mapPosX/stepW; bx=blackMan.mapPosX%stepW; //从mapPosX是屏幕定点所处的位置,从mapPosX前的-20*8开始绘制屏幕 for(i=-20;i<16;i++) { //下层的中间景物 if(bi+i>=0 && bi+i<gda.colNu) { //System.out.println("col num:"+(i)); if(gda.mapData[bi+i][0]!=(byte)0xFF && gda.mapData[bi+i][2]==(byte)0x00) { imgNum=(int)gda.mapData[bi+i][0]; //System.out.println("col num:"+(i)); imgY=(int)gda.mapData[bi+i][1]*stepW; g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]); g.drawImage(bigPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2], Graphics.TOP|Graphics.LEFT); } } } //画路面,也要有移动的效果 short roadImgNum=(short)gda.mapGlobe[2]; for(i=-1;i<=srcW/picsPos[roadImgNum][3];i++) { g.setClip(0+i*picsPos[roadImgNum][3]-streetBeginX,srcH-picsPos[roadImgNum][4],picsPos[roadImgNum][3],picsPos[roadImgNum][4]); g.drawImage(bigPic,0-picsPos[roadImgNum][1]+i*picsPos[roadImgNum][3]-streetBeginX,0-picsPos[roadImgNum][2]+srcH-picsPos[roadImgNum][4], Graphics.TOP|Graphics.LEFT); } //System.out.println("bakimgnum:"+bakImgNum); for(i=-20;i<16;i++) { //上层的中间景物 if(bi+i>=0 && bi+i<gda.colNu) { //System.out.println("col num:"+(bi+i)); if(gda.mapData[bi+i][0]!=(byte)0xFF && gda.mapData[bi+i][2]!=(byte)0x00) { imgNum=(int)gda.mapData[bi+i][0]; //System.out.println("col num:"+(i)); imgY=(int)gda.mapData[bi+i][1]*stepW; g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]); g.drawImage(bigPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2], Graphics.TOP|Graphics.LEFT); } /////////////////画补给品 if(gda.mapData[bi+i][7]!=(byte)0xFF) { imgNum=gda.mapData[bi+i][7]; //System.out.println("count:"+bi+" bx:"+bx); imgY=gda.manBeginY-mansPos[0][0]+5; g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]); g.drawImage(midPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2], Graphics.TOP|Graphics.LEFT); } //////////////////////////////////画掉落的机关 if(gda.mapData[bi+i][3]!=(byte)0xFF) { imgY=gda.mapData[bi+i][4]; boolean sb=gda.checkStone(bi+i,imgY); if(sb) { imgNum=28; } else { imgNum=gda.mapData[bi+i][3]; } gda.stoneY=imgY; g.setClip(i*stepW-bx,gda.stoneY,picsPos[imgNum][3],picsPos[imgNum][4]); g.drawImage(midPic,i*stepW-picsPos[imgNum][1]-bx,gda.stoneY-picsPos[imgNum][2], Graphics.TOP|Graphics.LEFT); if(sb) { gda.mapData[bi+i][4]=(byte)0xFF; } } } } for(i=-20;i<16;i++) { //画敌人 if(bi+i>=0 && bi+i<gda.colNu) { if(gda.mapMan[bi+i][0]!=(byte)0xFF) { imgNum=4+(int)gda.mapMan[bi+i][1]; imgY=(int)gda.mapMan[bi+i][0]; if(gda.mapMan[bi+i][2]==(byte)0x00 && gda.enemyFlashCount%2==0) { if(gda.enemyFlashCount==6) { gda.mapMan[bi+i][0]=(byte)0xFF; gda.mapMan[bi+i][1]=(byte)0xFF; gda.mapMan[bi+i][2]=(byte)0xFF; } } else { g.setClip(i*stepW-bx,imgY,picsPos[imgNum][3],picsPos[imgNum][4]); g.drawImage(midPic,i*stepW-picsPos[imgNum][1]-bx,imgY-picsPos[imgNum][2], Graphics.TOP|Graphics.LEFT); if(gda.enemyFire && imgY>=30) { //System.out.println("enemy fire!!"); imgX=i*stepW+bx; Bullet tbt=null; ////////////////////////////////让敌人转身面对主角 if((blackMan.posX+blackMan.mapPosX)/stepW>bi+i) { gda.mapMan[bi+i][1]=(byte)0x00; } else { gda.mapMan[bi+i][1]=(byte)0x01; } if(imgNum==4) { tbt=new Bullet(imgX+12,imgY+3); tbt.direction=true; } else { tbt=new Bullet(imgX,imgY+3); tbt.direction=false; } tbt.age=16; tbt.owner=1; gda.register(tbt); } } } } } gda.enemyFire=false; /////////画飞行的子弹 for(i=0;i<20;i++) { if(gda.blts[i].age>0) { if(gda.blts[i].direction) { //向右开枪 //g.setColor(0x00ff0000); g.setClip(gda.blts[i].posX,gda.blts[i].posY,4,2); g.drawImage(midPic,gda.blts[i].posX-mansPos[14][0],gda.blts[i].posY-mansPos[14][1],Graphics.TOP|Graphics.LEFT); } else { g.setClip(gda.blts[i].posX,gda.blts[i].posY,4,2); g.drawImage(midPic,gda.blts[i].posX-mansPos[15][0],gda.blts[i].posY-mansPos[15][1],Graphics.TOP|Graphics.LEFT); //g.setColor(0x0000ff00); } } } // imgNum=blackMan.status; if(blackMan.visible) { if(imgNum==12) { g.setClip(blackMan.posX-6,gda.manBeginY-mansPos[imgNum][3],mansPos[imgNum][2],mansPos[imgNum][3]); g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0]-6,gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1], Graphics.TOP|Graphics.LEFT); } else if(imgNum==6 || imgNum==13) { g.setClip(blackMan.posX,gda.manBeginY-mansPos[imgNum][3]+5,mansPos[imgNum][2],mansPos[imgNum][3]); g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0],gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1]+5, Graphics.TOP|Graphics.LEFT); } else if(imgNum==10) { g.setClip(blackMan.posX-stepW,gda.manBeginY-mansPos[imgNum][3],mansPos[imgNum][2],mansPos[imgNum][3]); g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0]-stepW,gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1], Graphics.TOP|Graphics.LEFT); } else { g.setClip(blackMan.posX,gda.manBeginY-mansPos[imgNum][3],mansPos[imgNum][2],mansPos[imgNum][3]); g.drawImage(midPic,blackMan.posX-mansPos[imgNum][0],gda.manBeginY-mansPos[imgNum][3]-mansPos[imgNum][1], Graphics.TOP|Graphics.LEFT); } } if(imgNum==5) { //主角拆完弹把手缩回 blackMan.status=4; } if(imgNum==12) { blackMan.status=11; } for(i=-20;i<26;i++) { //上层的景物 if(bi+i>=0 && bi+i<gda.colNu) { /////////////////画炸弹 if(gda.mapData[bi+i][5]!=(byte)0xFF) { if((gda.bombing && bi+i==gda.bombingNu) || gda.bombStatus[bi+i]==101) { //PlaySound.bomb();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -