📄 tankgamecanvas.java
字号:
/**
* <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 + -