import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class TankCanvas extends GameCanvas implements Runnable,CommandListener{
public static boolean mTrucking;
static final int sqr=6;//每块tile的尺寸
private boolean needToMoveX=false,needToMoveY=false;//To Mark if need to setViewWindow();
int screen=0;
//(1,4)respectively stands for Game Screen、Highest Score、PAUSE,Reslut;
public Rec r;//RMS纪录
List mainList;
Form instru,about,input;
public static MTankSprite mTank;
public static ETankSprite[] eTank=new ETankSprite[3];
public static TiledLayer tile,grass;
public static int mNum,eNum;
public static int mn,en;
public static LayerManager layerManager;
public Command CMD_OK,CMD_EXIT,CMD_CLR,command,CMD_PAUSE,CMD_YES,CMD_NO;
private TankMIDlet midlet;
public static long time;//游戏时间
public TankCanvas(TankMIDlet midlet){
super(true);
this.midlet=midlet;
r=new Rec("anonymous",Integer.MAX_VALUE);
r.read();
CMD_OK=new Command("OK",Command.OK,1);
CMD_CLR=new Command("Clear",Command.CANCEL,1);
CMD_EXIT=new Command("EXIT",Command.EXIT,1);
CMD_PAUSE=new Command("PAUSE",Command.STOP,1);
CMD_YES=new Command("YES",Command.OK,1);
CMD_NO=new Command("NO",Command.CANCEL,1);
setCommandListener(this);
creatMenu();
layerManager = new LayerManager();
creatTileLayer();
layerManager.append(grass);//将地图载入LayerManager
creatMTank();
creatETank();
layerManager.append(tile);
}
public static void creatMTank(){
if(mTank==null){
try{
Image image = Image.createImage("/mtank.png");
mTank= new MTankSprite(image,11,11);
}catch(IOException ioe){}
catch(Exception e){}
layerManager.append(mTank);
layerManager.append(mTank.bullets);
}
}
public static void creatETank(){
Image image=null;
try{
image = Image.createImage("/eTank.png");
}catch(IOException e){
System.out.println(e.getMessage());
}
for(int i=0;i<3;i++){
eTank[i]= new ETankSprite(image,11,11,i);
layerManager.append(eTank[i]);
layerManager.append(eTank[i].bullets);
}
}
private void creatTileLayer(){
try{
Image image = Image.createImage("/background.png");
tile = new TiledLayer(30,38,image,sqr,sqr);
grass= new TiledLayer(30,38,image,sqr,sqr);
}catch(IOException e){}
}
public void initiate(){
int[] map = {//30*6;38*6
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,0,0,0,0,0,
0,0,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,5,5,5,5,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,
0,0,2,2,2,2,0,0,0,0,0,6,6,6,6,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,
0,0,0,2,2,2,0,0,0,0,0,6,6,6,6,5,5,0,0,0,0,0,0,0,2,2,1,1,0,0,
0,0,0,5,5,5,5,0,0,0,0,0,0,0,0,5,5,0,0,0,0,0,0,0,0,0,1,1,0,0,
0,0,0,5,5,5,5,0,0,0,0,0,0,0,0,5,5,0,0,0,0,0,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,5,5,0,0,0,0,0,0,0,0,1,1,1,6,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,5,5,0,0,0,0,0,0,0,0,1,1,1,6,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,
0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,
0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,2,6,0,0,0,0,5,5,0,0,0,0,0,0,0,5,5,0,0,0,5,0,0,
0,0,0,0,0,0,0,2,6,0,0,0,0,5,5,0,0,0,0,0,0,0,5,5,0,0,0,5,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,0,0,0,2,2,2,0,0,0,0,2,2,0,0,0,
0,0,2,2,2,0,0,0,0,0,0,0,0,5,5,0,0,0,2,1,0,0,0,0,0,2,2,0,0,0,
0,0,2,2,2,0,0,0,0,0,0,0,0,5,5,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,5,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
0,0,5,5,0,0,0,0,0,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,5,5,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,6,6,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,6,6,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,6,6,0,0,0,
0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,0,0,0,
0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,
0,6,6,6,2,2,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
0,6,6,6,6,6,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,5,5,3,4,5,5,0,0,0,0,0,2,5,5,5,0,0,0,
0,0,0,0,5,0,0,0,0,0,0,0,5,5,7,8,5,5,0,0,0,0,2,2,2,5,0,0,0,0};
for (int i = 0; i < map.length; i++){
grass.setCell(i%30, i/30, 0);
if(map[i]==1){
grass.setCell(i%30, i/30, map[i]);
tile.setCell(i%30, i/30, 0);
}else
tile.setCell(i%30,i/30,map[i]);
}
mTrucking=true;
mNum=2; eNum=10;
mn=2; en=10;
for(int i=0;i<3;i++)
eTank[i].start();
mTank.start();
time=0;
screen=1;
addCommand(CMD_PAUSE);
setFullScreenMode(true);
Thread t = new Thread(this);
t.start();
}
public void run() {
Graphics g = getGraphics();
while (mTrucking) {
long times_s= System.currentTimeMillis();
if(!TankMIDlet.calling){
input();
render(g);
time=time+100;
}
long times_e=System.currentTimeMillis();
long times=times_e-times_s;
if(times >100){
times =100;
}
try{
Thread.sleep(100- times );
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
stop();
}
private void input() {
int keyStates = getKeyStates();
if ((keyStates & LEFT_PRESSED) != 0){
mTank.forward(4);
if ((keyStates & FIRE_PRESSED) != 0){
mTank.bullets.start(mTank.getX(), mTank.getY(),mTank.fx,1);
}
}else if((keyStates & RIGHT_PRESSED) != 0){
mTank.forward(2);
if ((keyStates & FIRE_PRESSED) != 0){
mTank.bullets.start(mTank.getX(), mTank.getY(),mTank.fx,1);
}
}else if ((keyStates & UP_PRESSED) != 0){
mTank.forward(1);
if ((keyStates & FIRE_PRESSED) != 0){
mTank.bullets.start(mTank.getX(), mTank.getY(),mTank.fx,1);
}
}else if ((keyStates & DOWN_PRESSED) != 0){
mTank.forward(3);
if ((keyStates & FIRE_PRESSED) != 0){
mTank.bullets.start(mTank.getX(), mTank.getY(),mTank.fx,1);
}
}else if ((keyStates & FIRE_PRESSED) != 0)
mTank.bullets.start(mTank.getX(), mTank.getY(),mTank.fx,1);
}
private void render(Graphics g) {
int w,h;
w=getWidth(); h=getHeight();
g.setColor(0x000000);
g.fillRect(0, 0, w, h);
g.setColor(0xffffff);
g.drawString("Player:"+mNum+" Enemy:"+eNum+" Time:"+time/1000,w/2,h,Graphics.HCENTER|Graphics.BOTTOM);
int x =(w-tile.getWidth())/2;
int y =(h-12-tile.getHeight())/2;
if(x<0){ needToMoveX=true; x=0;} //实现可移动的战斗场景
if(y<0){ needToMoveY=true; y=0;}
if(needToMoveX&&(!needToMoveY)){
int tempx=mTank.getRefPixelX()-(w/2);
if(tempx<0) tempx=0;
if(tempx>tile.getWidth()-w) tempx=tile.getWidth()-w;
layerManager.setViewWindow(tempx,0,w,tile.getHeight());
}else if((!needToMoveX)&&needToMoveY){
int tempy=mTank.getRefPixelY()-((h-12)/2);
if(tempy<0) tempy=0;
if(tempy>tile.getHeight()-(h-12)) tempy=tile.getHeight()-(h-12);
layerManager.setViewWindow(0, tempy, tile.getWidth(),h-12);
}else if(needToMoveX&&needToMoveY){
int tempx=mTank.getRefPixelX(