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

📄 tankgamecanvas.java

📁 经典FC游戏《超惑星战记》的J2ME版本!!功能基本上都实现了
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * <p>Title: Transpanzer</p>
 * <p>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</p>
 * @author Jjyo
 * @email jjyo@163.com
 * @version 1.0.0
 */

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;

import Menu;


public class TankGameCanvas extends Canvas implements Runnable ,CommandListener, GameStart{

	public TankMIDlet midlet;
	public static int width; // 屏幕宽度
	public static int height;// 屏幕高度
	
	public static int index;
	public static int timeCnt;
	
	public Command menu=new Command("MENU",Command.OK,1);
	public Command back=new Command("BACK",Command.BACK,2);
	
	private volatile Thread mainThread=null;//主线程
	private long startTime;
	private long endTime;
	private static final int FRAME_TIME=60;  //帧速
	
	public GameManage gm;
	private DrawManage dm;
	
	//构造方法
	public TankGameCanvas(TankMIDlet midlet){
		System.out.println("Canvas Successful...");
		this.setFullScreenMode(true);
		this.midlet=midlet;
		width=getWidth();
		height=getHeight();
		setCommandListener(this);
		gm=new GameManage();	//构造游戏管理的类
		dm=new DrawManage(width,height);
		GameManage.gameState=GameManage.GAMESTATE_MENU;	//设置游戏状态为菜单状态,调试改变,可以跳过菜单
	}
	
	protected void paint(Graphics g) {
		
		switch(GameManage.gameState){
		case GameManage.GAMESTATE_MENU:  //开始菜单
			 drawMainMenuScreen(g);
			break;
		case GameManage.GAMESTATE_GAMELOOP:	//开始游戏
			drawGameLoopScreen(g);
			break;
		case GameManage.GMAESTATE_CONTROL:
			if(gm.isGameStart)
				drawControlScreen(g);
			break;
		case GameManage.GAMESTATE_PAUSE: 	//暂停
			drawPauseScreen(g);
			break;
		case GameManage.GAMESTATE_CONTINUE: 	//重新游戏
			drawContinue(g);
			break;
		case GameManage.GMAESTATE_ABOUT:
			drawAbout(g);
			break;
		}
	}
	
	public void run() {
		try{
			//得到当前的线程,以此来区分是否主线程
			Thread currentThread=Thread.currentThread();	
			while(currentThread==mainThread){
				startTime=System.currentTimeMillis();
				switch(GameManage.gameState){
				case GameManage.GAMESTATE_MENU:
					gm.menu.action();	//菜单
					gm.menuAction();
		            break;
				case GameManage.GAMESTATE_GAMELOOP:
					gm.action();//进行游戏
		            break;
				case GameManage.GMAESTATE_CONTROL://控制面板
					gm.menu.controlAction();
					gm.menuAction();
					break;
				case GameManage.GAMESTATE_PAUSE://暂停
					break;
				case GameManage.GAMESTATE_CONTINUE://继续游戏
					gm.contineAction();
		            break;
				}
				repaint(0,0,width,height);
				serviceRepaints();
				endTime=System.currentTimeMillis();
				if((endTime-startTime)<FRAME_TIME)		//强制使游戏的帧数想同
					Thread.sleep(FRAME_TIME-(endTime-startTime));
			}
		}catch(InterruptedException ie){
			System.out.println(ie.toString());			//异常处理
		}
	}

	//主菜单
	private void drawMainMenuScreen(Graphics g) // 绘制菜单的动作,这里只有一种情况
	{
		// TODO 
		int menuHeight=gm.lgr.imFont.height;
		int menuOffset = (height - menuHeight) / 3;
		g.setColor(0);
		g.setClip(0, 0, width, height);
		g.fillRect(0, 0, width, height);
		if(height>=160){
			dm.drawImage(g, gm.lgr.imTitle, (width-gm.lgr.imTitle.width)/2, height/8);
			dm.drawImage(g, gm.lgr.imMenu, width-gm.lgr.imMenu.width, height-gm.lgr.imMenu.height);
		}
		if(gm.isGameStart){
			dm.drawString(g, gm.lgr.imFont, "SAVE GAME", width/3, menuOffset + menuHeight * 0);
		}else{
			dm.drawString(g, gm.lgr.imFont, "NEW GAME", width/3, menuOffset + menuHeight * 0);
		}
		dm.drawString(g, gm.lgr.imFont, "LOADING", width/3, menuOffset + menuHeight * 2);
		if (GameManage.isVolOn) {
			dm.drawString(g, gm.lgr.imFont, "VOICE ON", width/3, menuOffset + menuHeight * 4);
		} else {
			dm.drawString(g, gm.lgr.imFont, "VOICE OFF", width/3, menuOffset + menuHeight * 4);
		}
		if(gm.isGameStart){
			dm.drawString(g, gm.lgr.imFont, "HELP", width/3, menuOffset + menuHeight * 6);
		}else{
			dm.drawString(g, gm.lgr.imFont, "ABOUT", width/3, menuOffset + menuHeight * 6);
		}
		dm.drawString(g, gm.lgr.imFont, "EXIT", width/3, menuOffset + menuHeight * 8);
		switch (gm.menu.whichActive) {
		case Menu.MENU_NEWGAME:
			dm.drawSprite(g, gm.lgr.imWheel, gm.lgr.choose,width/4, menuOffset + menuHeight * 0);
			break;
		case Menu.MENU_LOADGAME:
			dm.drawSprite(g, gm.lgr.imWheel, gm.lgr.choose,width/4, menuOffset + menuHeight * 2);
			break;
		case Menu.MENU_VOL:
			dm.drawSprite(g, gm.lgr.imWheel, gm.lgr.choose,width/4, menuOffset + menuHeight * 4);
			break;
		case Menu.MENU_ABOUT:
			dm.drawSprite(g, gm.lgr.imWheel, gm.lgr.choose,width/4, menuOffset + menuHeight * 6);
			break;
		case Menu.MENU_EXIT:
			dm.drawSprite(g, gm.lgr.imWheel, gm.lgr.choose,width/4, menuOffset + menuHeight * 8);
			break;
		}
		g.setClip(0, 0, width, height);
	}
	
	// TODO 游戏画面
	public void drawGameLoopScreen(Graphics g){
		this.addCommand(menu);
		dm.drawMaps(g,gm.lgr.tankSprite.map);
		dm.drawSprite(g, gm.lgr.imEnemySprite16, gm.lgr.corps);
		dm.drawSprite(g, gm.lgr.imGoods, gm.lgr.goods);
		dm.drawSprite(g, gm.lgr.imGoods, gm.lgr.staticGoods);
		dm.drawSprite(g, gm.lgr.imBomb,gm.lgr.bomb);
		dm.drawSprite(g, gm.lgr.imEnemySprite16, gm.lgr.enemySprite16);
		dm.drawSprite(g, gm.lgr.imEnemySprite32, gm.lgr.enemySprite32);
		dm.drawSprite(g, gm.lgr.imBeam, gm.lgr.beam);
		
		dm.drawSprite(g, gm.lgr.imBullet8, gm.lgr.enemyBullet);
		switch(TankSprite.spriteState){
		case TankSprite.TANK:
			dm.drawSprite(g, gm.lgr.imTank, gm.lgr.imWheel, gm.lgr.tankSprite, gm.lgr.tankSprite.wheelY);
			dm.drawSprite(g, gm.lgr.imBullet24, gm.lgr.tankBullet);
			dm.drawSprite(g,gm.lgr.imTankBomb,gm.lgr.tankBomb);
			break;
		case TankSprite.TANE:
			dm.drawSprite(g, gm.lgr.imTank, gm.lgr.imWheel, gm.lgr.staticTankSprite, gm.lgr.tankSprite.wheelY);
			dm.drawSprite(g, gm.lgr.imTane, gm.lgr.tankSprite);
			dm.drawSprite(g, gm.lgr.imBullet8, gm.lgr.tankBullet);
			dm.drawSprite(g, gm.lgr.imTane, gm.lgr.tankBomb);
			break;
		case TankSprite.KANE:
			dm.drawSprite(g, gm.lgr.imKane, gm.lgr.tankSprite);
			dm.drawSprite(g, gm.lgr.imBullet8, gm.lgr.tankBullet);
			dm.drawSprite(g, gm.lgr.imKane, gm.lgr.tankBomb);
			break;
		}
			
		gameInfo(g);
		if(TankSprite.isChangeScreen){
			switch(index)
			{
			case 0:
				index = 1;
				timeCnt=0;
				break;
			case 1:
				if(drawJalousie(g,12,9,0x000000,20,true)){
					index = 2;
					timeCnt = 0;
					g.setColor(0x000000);
					g.fillRect(0,0,width,height);
					if(TankSprite.isBoss){
						timeCnt=0;
						index=3;
					}
					LoadGameResource.joinData=true;
				}
				break;
			case 2:
				if(drawLoading(g,0x000000,40,"loading")){
					index=3;
					timeCnt=0;
					
				}
				break;
			case 3:
				if(drawJalousie(g,12,9,0x000000,20,false)){
//					index = 3;
					LoadGameResource.joinData=false;
					timeCnt=0;
					index=0;
					TankSprite.isChangeScreen=false;
					
				}
				break;
			}
			timeCnt++;
		}
	}
	
	
	//游戏暂停画面
	public void drawPauseScreen(Graphics g){
		g.setColor(200);
		g.drawString("PauseScreen", 0, height/2, 0);
	}
	
	//初始化游戏
	public void drawReinitScreen(Graphics g){
		g.setColor(0);
		g.fillRect(0, 0, width, height);
		dm.drawString(g, gm.lgr.imFont, "ReinitScreen...", width/3, height/2+50);
	}
	
	//TODO 控制面板画面
	public void drawControlScreen(Graphics g){
		g.setClip(0, 0, width, height);
		g.fillRect(0, 0, width, height);
		dm.drawImage(g, gm.lgr.imControlPanl, (width-gm.lgr.imControlPanl.width)/2, (height-gm.lgr.imControlPanl.height)/2);
		if(TankSprite.HYPER_BEAM)

⌨️ 快捷键说明

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