www.pudn.com > j2me_Mario.rar > MarioGameCanvas.java


/** 
 * 

Title: Mario

*

Description: * You cannot remove this copyright and notice. * You cannot use this file any part without the express permission of the author. * All Rights Reserved

*

Copyright: lizhenpeng (c) 2004

*

Company: LP&P

* @author lizhenpeng * @version 1.0.0 */ package mario; import java.io.*; import java.util.*; import javax.microedition.lcdui.*; import lipeng.*; public class MarioGameCanvas extends Canvas implements Runnable,CommandListener,LPIGameStart { // method public MarioGameCanvas(MarioMIDlet midlet) { this.setFullScreenMode(true); this.midlet=midlet; this.width=this.getWidth(); this.height=this.getHeight(); setCommandListener(this); this.addCommand(mainMenu); dm=new LPDrawManage(width,height); if(record.IsEmpty()) { try { ByteArrayOutputStream baos=new ByteArrayOutputStream(); DataOutputStream dos=new DataOutputStream(baos); dos.writeInt(1); this.record.addRecord(baos.toByteArray()); dos.close(); baos.close(); } catch(Exception e) { System.out.println("byte write error"); } } loadGameResource(0); imMainSmall16=new LPImageManage("small16.png"); imMainNormal32=new LPImageManage("normal32.png"); imMainFire32=new LPImageManage("fire32.png"); imSprite8=new LPImageManage("sprite8.png"); imSprite16=new LPImageManage("sprite16.png"); imEnemy24=new LPImageManage("enemy24.png"); imSprite48=new LPImageManage("sprite48.png"); gm=new MarioGameManage(this); gm.gameState=MarioGameManage.GAMESTATE_MENU; } private void loadMap(String fileName,char MapArray[][],int width,int height) { InputStream inStream=getClass().getResourceAsStream("/"+fileName); DataInputStream in=new DataInputStream(inStream); int i; try { for(i=0;i=0;--i) { for(j=gm.mainSprite.judgeMap.mapArray[i].length-1;j>=0;--j) { gm.mainSprite.judgeMap.mapArray[i][j]=dis.readChar(); } } gm.initLevel_1_1(); for(i=dis.readInt()-1;i>=0;--i) { gm.brick[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.brokenBrick[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.bullet[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.enemy[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.tortoise[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.bridge[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.gold[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.mashRooms[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.flowers[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.stick[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.staticGold[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.ugGold[i].readData(dis); } for(i=dis.readInt()-1;i>=0;--i) { gm.ugBrick[i].readData(dis); } gm.mainSprite.readData(dis); dis.close(); bais.close(); } catch(Exception e) { System.out.println("read state error"); } } private void drawGameLoopScreen(Graphics g) { int i; g.setClip(0,0,gm.canvas.width,gm.canvas.height); dm.drawMaps(g,gm.mainSprite.judgeMap); dm.drawSprite(g,imSprite8,gm.brokenBrick); dm.drawSprite(g,imSprite16,gm.brick); dm.drawSprite(g,imSprite16,gm.gold); for(i=gm.mashRooms.length-1;i>=0;--i) { gm.mashRooms[i].draw(g,imSprite16); } for(i=gm.flowers.length-1;i>=0;--i) { gm.flowers[i].draw(g,imSprite16); } dm.drawSprite(g,imEnemy24,gm.tortoise); dm.drawSprite(g,imSprite16,gm.staticGold); dm.drawSprite(g,imSprite48,gm.stick); dm.drawSprite(g,imSprite8,gm.bullet); dm.drawSprite(g,imSprite16,gm.bridge); switch(gm.mainSprite.mainSpriteState) { case MarioMainSprite.SMALL_SPRITE: case MarioMainSprite.DEAD_SPRITE: dm.drawSprite(g,imMainSmall16,gm.mainSprite); break; case MarioMainSprite.NORMAL_SPRITE: dm.drawSprite(g,imMainNormal32,gm.mainSprite); break; case MarioMainSprite.FIRE_SPRITE: dm.drawSprite(g,imMainFire32,gm.mainSprite); break; case MarioMainSprite.GROW_SPRITE: if(gm.mainSprite.growCnt%2==0) { dm.drawSprite(g,imMainSmall16,gm.mainSprite); } else { dm.drawSprite(g,imMainNormal32,gm.mainSprite); } break; case MarioMainSprite.BECOME_SMALL: if(gm.mainSprite.becomeCnt%2==0) { dm.drawSprite(g,imMainNormal32,gm.mainSprite); } else { dm.drawSprite(g,imMainSmall16,gm.mainSprite); } break; case MarioMainSprite.BECOME_FIRE: if(gm.mainSprite.becomeCnt%2==0) { dm.drawSprite(g,imMainNormal32,gm.mainSprite); } else { dm.drawSprite(g,imMainFire32,gm.mainSprite); } break; } g.setClip(0,0,gm.canvas.width,gm.canvas.height); } private void drawMainMenuScreen(Graphics g) { int menuOffset=(height-font.getHeight()*4)/2; int tmpY=0; g.setFont(font); g.setClip(0,0,width,height); dm.drawMaps(g,map); g.setClip(0,0,width,height); switch(gm.menu.whichActive) { case LPMenu.MENU_NEW_GAME: g.setColor(255,0,0); g.drawString("新游戏",(width-font.stringWidth("新游戏"))/2, menuOffset+font.getHeight()*0,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("载入进度",(width-font.stringWidth("载入进度"))/2, menuOffset+font.getHeight()*1,g.LEFT|g.TOP); g.setColor(255,255,255); if(gm.menu.isVolOn) { g.drawString("声音开",(width-font.stringWidth("声音开"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } else { g.drawString("声音关",(width-font.stringWidth("声音关"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } g.setColor(255,255,255); g.drawString("退出",(width-font.stringWidth("退出"))/2, menuOffset+font.getHeight()*3,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("关于",(width-font.stringWidth("关于"))/2, menuOffset+font.getHeight()*4,g.LEFT|g.TOP); break; case LPMenu.MENU_LOAD_GAME: g.setColor(255,255,255); g.drawString("新游戏",(width-font.stringWidth("新游戏"))/2, menuOffset+font.getHeight()*0,g.LEFT|g.TOP); g.setColor(255,0,0); g.drawString("载入进度",(width-font.stringWidth("载入进度"))/2, menuOffset+font.getHeight()*1,g.LEFT|g.TOP); g.setColor(255,255,255); if(gm.menu.isVolOn) { g.drawString("声音开",(width-font.stringWidth("声音开"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } else { g.drawString("声音关",(width-font.stringWidth("声音关"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } g.setColor(255,255,255); g.drawString("退出",(width-font.stringWidth("退出"))/2, menuOffset+font.getHeight()*3,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("关于",(width-font.stringWidth("关于"))/2, menuOffset+font.getHeight()*4,g.LEFT|g.TOP); break; case LPMenu.MENU_VOL: g.setColor(255,255,255); g.drawString("新游戏",(width-font.stringWidth("新游戏"))/2, menuOffset+font.getHeight()*0,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("载入进度",(width-font.stringWidth("载入进度"))/2, menuOffset+font.getHeight()*1,g.LEFT|g.TOP); g.setColor(255,0,0); if(gm.menu.isVolOn) { g.drawString("声音开",(width-font.stringWidth("声音开"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } else { g.drawString("声音关",(width-font.stringWidth("声音关"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } g.setColor(255,255,255); g.drawString("退出",(width-font.stringWidth("退出"))/2, menuOffset+font.getHeight()*3,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("关于",(width-font.stringWidth("关于"))/2, menuOffset+font.getHeight()*4,g.LEFT|g.TOP); break; case LPMenu.MENU_EXIT: g.setColor(255,255,255); g.drawString("新游戏",(width-font.stringWidth("新游戏"))/2, menuOffset+font.getHeight()*0,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("载入进度",(width-font.stringWidth("载入进度"))/2, menuOffset+font.getHeight()*1,g.LEFT|g.TOP); g.setColor(255,255,255); if(gm.menu.isVolOn) { g.drawString("声音开",(width-font.stringWidth("声音开"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } else { g.drawString("声音关",(width-font.stringWidth("声音关"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } g.setColor(255,0,0); g.drawString("退出",(width-font.stringWidth("退出"))/2, menuOffset+font.getHeight()*3,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("关于",(width-font.stringWidth("关于"))/2, menuOffset+font.getHeight()*4,g.LEFT|g.TOP); break; case LPMenu.MENU_ABOUT: g.setColor(255,255,255); g.drawString("新游戏",(width-font.stringWidth("新游戏"))/2, menuOffset+font.getHeight()*0,g.LEFT|g.TOP); g.setColor(255,255,255); g.drawString("载入进度",(width-font.stringWidth("载入进度"))/2, menuOffset+font.getHeight()*1,g.LEFT|g.TOP); g.setColor(255,255,255); if(gm.menu.isVolOn) { g.drawString("声音开",(width-font.stringWidth("声音开"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } else { g.drawString("声音关",(width-font.stringWidth("声音关"))/2, menuOffset+font.getHeight()*2,g.LEFT|g.TOP); } g.setColor(255,255,255); g.drawString("退出",(width-font.stringWidth("退出"))/2, menuOffset+font.getHeight()*3,g.LEFT|g.TOP); g.setColor(255,0,0); g.drawString("关于",(width-font.stringWidth("关于"))/2, menuOffset+font.getHeight()*4,g.LEFT|g.TOP); break; } } private void drawPauseScreen(Graphics g) { g.setFont(font); g.setClip(0,0,width,height); g.setColor(0,0,0); g.fillRect(0,0,width,height); g.setColor(255,0,0); g.drawString("暂停中……",(width-font.stringWidth("暂停中……"))/2, height/2,g.LEFT|g.TOP); } private void drawGameOverScreen(Graphics g) { dm.drawMaps(g,this.map); g.setClip(0,0,width,height); g.setFont(font); g.setColor(255,0,0); g.drawString("游戏结束",(width-font.stringWidth("游戏结束"))/2, height/2,g.LEFT|g.TOP); } public void stop() { gameThread=null; } public void start() { gm.menu.allAction=0; switch(gm.gameState) { case MarioGameManage.GAMESTATE_MENU: if(gm.menu.isVolOn) { gm.bgPlayer.play(); } break; case MarioGameManage.GAMESTATE_GAMELOOP: case MarioGameManage.GAMESTATE_PAUSE: case MarioGameManage.GAMESTATE_REINIT: break; } gameThread=new Thread(this); gameThread.start(); } public boolean isPressStar = false; protected void keyPressed(int keyCode) { if(gm.gameState==MarioGameManage.GAMESTATE_GAMELOOP) { if(keyCode==Canvas.KEY_STAR) { if(!isPressStar) { isPressStar = true; } } } gm.judgeKeyCode(keyCode,getGameAction(keyCode)); } protected void keyReleased(int keyCode) { gm.freeKey(keyCode,getGameAction(keyCode)); } public void saveCurrentState() { try { ByteArrayOutputStream baos=new ByteArrayOutputStream(); DataOutputStream dos=new DataOutputStream(baos); int i,j; dos.writeInt(gm.goldNum); dos.writeInt(gm.mainSprite.judgeMap.x); dos.writeInt(gm.mainSprite.judgeMap.y); for(i=gm.mainSprite.judgeMap.mapArray.length-1;i>=0;--i) { for(j=gm.mainSprite.judgeMap.mapArray[i].length-1;j>=0;--j) { dos.writeChar(gm.mainSprite.judgeMap.mapArray[i][j]); } } dos.writeInt(gm.brick.length); for(i=gm.brick.length-1;i>=0;--i) { gm.brick[i].writeData(dos); } dos.writeInt(gm.brokenBrick.length); for(i=gm.brokenBrick.length-1;i>=0;--i) { gm.brokenBrick[i].writeData(dos); } dos.writeInt(gm.bullet.length); for(i=gm.bullet.length-1;i>=0;--i) { gm.bullet[i].writeData(dos); } dos.writeInt(gm.enemy.length); for(i=gm.enemy.length-1;i>=0;--i) { gm.enemy[i].writeData(dos); } dos.writeInt(gm.tortoise.length); for(i=gm.tortoise.length-1;i>=0;--i) { gm.tortoise[i].writeData(dos); } dos.writeInt(gm.bridge.length); for(i=gm.bridge.length-1;i>=0;--i) { gm.bridge[i].writeData(dos); } dos.writeInt(gm.gold.length); for(i=gm.gold.length-1;i>=0;--i) { gm.gold[i].writeData(dos); } dos.writeInt(gm.mashRooms.length); for(i=gm.mashRooms.length-1;i>=0;--i) { gm.mashRooms[i].writeData(dos); } dos.writeInt(gm.flowers.length); for(i=gm.flowers.length-1;i>=0;--i) { gm.flowers[i].writeData(dos); } dos.writeInt(gm.stick.length); for(i=gm.stick.length-1;i>=0;--i) { gm.stick[i].writeData(dos); } dos.writeInt(gm.staticGold.length); for(i=gm.staticGold.length-1;i>=0;--i) { gm.staticGold[i].writeData(dos); } dos.writeInt(gm.ugGold.length); for(i=gm.ugGold.length-1;i>=0;--i) { gm.ugGold[i].writeData(dos); } dos.writeInt(gm.ugBrick.length); for(i=gm.ugBrick.length-1;i>=0;--i) { gm.ugBrick[i].writeData(dos); } gm.mainSprite.writeData(dos); this.record.SetRecord(1,baos.toByteArray()); dos.close(); baos.close(); } catch(Exception e) { System.out.println("Save Data error"); } } public MarioMIDlet midlet; public static int width; public static int height; public static Random rand=new Random(System.currentTimeMillis()); public LPSaveRecord record=new LPSaveRecord("lipeng_Mario"); public Command mainMenu=new Command("菜单",Command.OK,1); public Command back=new Command("返回",Command.BACK,2); public boolean isSaveState; public int saveGameState; public MarioGameManage gm; public LPMaps map; public char mapData[][]=null; //private private volatile Thread gameThread=null; private long startTime; private long endTime; private LPDrawManage dm; private Font font=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD, Font.SIZE_LARGE); // image resource private LPImageManage imMap; private LPImageManage imMainSmall16; private LPImageManage imMainNormal32; private LPImageManage imMainFire32; private LPImageManage imSprite8; private LPImageManage imSprite16; private LPImageManage imEnemy24; private LPImageManage imSprite48; //final private static final int FRAME_TIME=80; static final char[][] level_1_map= { {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0011,0x0013,0x0015,0x0017,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0012,0x0014,0x0016,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f26,0x0f26,0x0f26,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0011,0x0013,0x0017,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x0019,0x0019,0x0019,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0012,0x0014,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001a,0x001a,0x001a,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f26,0x0f26,0x0f26,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001a,0x001f,0x001a,0x0000,0x0011,0x0013,0x0015,0x0015,0x0017,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0702,0x0702,0x0702,0x0702,0x0702,0x0702,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001c,0x001c,0x001c,0x0019,0x0012,0x0014,0x0016,0x0016,0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001a,0x001a,0x001a,0x001a,0x001a,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001a,0x001a,0x001a,0x001f,0x001a,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001c,0x001c,0x001c,0x001c,0x001c,0x0019,0x0019,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f26,0x0f26,0x0f26,0x0f26,0x0f26,}, {0x001d,0x001a,0x001a,0x001a,0x001a,0x001a,0x001a,0x0000,0x0000,0x0000,0x0f26,0x0f26,0x0f26,0x0f26,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f26,0x0f26,0x0000,0x0000,0x0000,0x0f26,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001e,0x001a,0x001a,0x001a,0x001a,0x001a,0x001a,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x002b,0x0000,0x0703,0x0705,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001e,0x001a,0x001a,0x001a,0x001d,0x001a,0x001a,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x002c,0x0000,0x0704,0x0706,0x0000,0x0029,0x0029,0x0029,0x0029,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,}, {0x001e,0x001a,0x001a,0x001a,0x001e,0x001a,0x001a,0x0000,0x0000,0x000d,0x000e,0x000f,0x0010,0x0000,0x002a,0x0000,0x0704,0x0706,0x0000,0x0029,0x0029,0x0029,0x0029,0x0000,0x0000,0x0000,0x0000,0x0027,0x0027,0x0027,0x0027,0x0027,}, {0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0701,0x0228,0x0228,0x0228,0x0228,0x0228,}, }; }