📄 microtankcanvas.java
字号:
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
// ----------------游戏主类--------------------------
public class MicroTankCanvas extends GameCanvas implements Runnable,
CommandListener
{
public static boolean mTrucking;//开始游戏的条件
public static MicroTankSprite mTank;// 我方坦克
public static MicroETankSprite eTank;// 敌方坦克
public static TiledLayer mBoard;//游戏背景图层,包括砖块
public static ExplosionSprite explosion;// 爆炸类
public static int num = 3;// 我方先有的生命数
public static int enum = 5;// 敌方生命数
public static int fx;// 移动的方向
public static int sd;// 移动量
public static boolean gameover = false;// 游戏是否结束
public static LayerManager mLayerManager;// 管理图层
public static int w;// 宽
public static int h;// 高
private MicroTankMIDlet midlet;// 一个Midlet类
private Command command;
private Command exitCommand = new Command("退出", Command.EXIT, 0);
// ------------构造函数(此只是一些相关的初始化,线程还没有启动)---------------------
public MicroTankCanvas(MicroTankMIDlet midlet) throws IOException
{
super(true);
this.midlet = midlet;
addCommand(exitCommand);
setCommandListener(this);
mBoard = createBoard();// 绘制背景图层包括砖块
explosion = createExplosion();// 创建一个爆炸精灵,
explosion.setVisible(false);//默认爆炸不可见
mLayerManager = new LayerManager();
mLayerManager.append(explosion);// 先加入爆炸图层
createTank();// 创建我方坦克
createETank();// 创建敌方坦克
mLayerManager.append(mBoard);// 把背景加上去
splash();//绘制初始界面
}
// --------------创建我方坦克--------------------
public static void createTank()
{
try
{
Image image = Image.createImage("/tank.png");
mTank = new MicroTankSprite(image, 14, 14);//实例化我方坦克
mLayerManager.append(mTank);// 把坦克加上去
mLayerManager.append(mTank.bullets);// 坦克的子弹
mTank.setPosition(78, 52);
fx = 3;// 方向
sd = -4;// 移动量
}
catch (IOException ioe)
{
}
catch (Exception e)
{
}
}
// -------------创建敌方坦克-------------------
public static void createETank()
{
try
{
Image images = Image.createImage("/enemyTank.png");
eTank = new MicroETankSprite(images, 14, 14);//实例化敌方坦克
mLayerManager.append(eTank);//加上去
mLayerManager.append(eTank.ebullets);//敌方子弹
eTank.setPosition(18, 12);
eTank.start();//因为敌方的坦克会自己移动
}
catch (IOException ioe)
{
}
catch (Exception e)
{
}
}
private ExplosionSprite createExplosion() throws IOException
{
Image image = Image.createImage("/explosion.png");
return new ExplosionSprite(image, 3, 3);// 因为此为自定义的类,所以要new
}
// --------------游戏背景的绘制,包括砖块--------------
private TiledLayer createBoard() throws IOException
{
Image image = Image.createImage("/bg.png");
TiledLayer tiledLayer = new TiledLayer(11, 11, image, 15, 15);
// 11行11列
int[] map = { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 3, 0, 0, 2, 0, 0,
3, 0, 4, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 4, 0,
3, 0, 0, 0, 0, 0, 4, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2,
0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 2, 0, 4, 0, 2, 0, 2, 0,
4, 0, 0, 2, 0, 3, 0, 3, 0, 0, 2, 0, 2, 2, 0, 4, 0, 0, };
// System.out.println(map.length);
for (int i = 0; i < map.length; i++)
{
int column = i % 11;
int row = (i - column) / 11;
tiledLayer.setCell(column, row, map[i]);
}
return tiledLayer;
}
//----------------用来调用以开始游戏 实质上是启动线程------------
public void start()
{
Thread t = new Thread(this);
t.start();
}
public void run()
{
Graphics g = getGraphics();
while (mTrucking)
{
long times_s = System.currentTimeMillis();
input();//处理按键响应,主要针对我方坦克
tick();//坦克的碰撞处理
render(g);//屏幕的绘制
long times_e = System.currentTimeMillis();
long times = times_e - times_s;
if (times > 80)
{
times = 80;
}
try
{
Thread.sleep(80 - times);
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
}
}
//-------------坦克的碰撞处理-----------------
private void tick()
{
if (mTank.collidesWith(mBoard, true))//碰到地图的砖块
{
System.out.println("我方碰到砖块了");
mTank.undo();//我方坦克的反应
}
if (eTank.collidesWith(mBoard, true))
{
eTank.undo();//敌方坦克的反应
}
if (eTank.collidesWith(mTank, true))//坦克的相撞
{
eTank.setVisible(false);
mTank.setVisible(false);//都不可见
// mTank.setVisible(false);
mLayerManager.remove(MicroTankCanvas.mTank);//双方的坦克移除掉
eTank.setVisible(false);
mLayerManager.remove(MicroTankCanvas.eTank);
eTank.elift = false;
createTank();//再次创建双方的坦克
createETank();
}
}
//----------------处理按键响应 此为对我方坦克-------------------------
private void input()
{
int keyStates = getKeyStates();
if ((keyStates & LEFT_PRESSED) != 0)
{
mTank.forward(-2, 1);//向左移动 坦克本身的方向也在forward()方法中处理好了
fx = 1;//移动方向
sd = -5;//移动量
if ((keyStates & FIRE_PRESSED) != 0)//按下方向键时还能开火
{
mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);//start启动了子弹线程,同时也传入了我方坦克的参数
}
}
else if ((keyStates & RIGHT_PRESSED) != 0)
{
mTank.forward(2, 2);//向右
fx = 2;
sd = 5;
if ((keyStates & FIRE_PRESSED) != 0)
{
mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
}
}
else if ((keyStates & UP_PRESSED) != 0)
{
mTank.forward(-2, 3);
fx = 3;
sd = -5;
if ((keyStates & FIRE_PRESSED) != 0)
{
mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
}
}
else if ((keyStates & DOWN_PRESSED) != 0)
{
mTank.forward(2, 4);
fx = 4;
sd = 5;
if ((keyStates & FIRE_PRESSED) != 0)
{
mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
}
}
else if ((keyStates & FIRE_PRESSED) != 0)//不按下方向键时也能开火,移动量和方向都保存在变量里,只与最近一次按下方向键有关
{
mTank.bullets.start(mTank.getX(), mTank.getY(), fx, sd, 1);
}
}
//---------------屏幕的绘制---------------------------
private void render(Graphics g)
{
w = getWidth();
h = getHeight();
g.setColor(0x000000);
g.fillRect(0, 0, w, h);
g.setColor(244,244,0);
//------------下面的具体位置我就不计算了------------
g.drawString("我方", w / 2 - 33, h / 2-33, g.LEFT | g.TOP);
g.drawString(String.valueOf(num), 30, 250, g.LEFT | g.TOP);
g.drawString("敌方", 50, 250, g.LEFT | g.TOP);
g.drawString(String.valueOf(enum), 80, 250, g.LEFT | g.TOP);
int x = 1;
int y = 1;
// mLayerManager.setViewWindow(mTank.getX()-200,mTank.getY()-200,mTank.getX()+200,mTank.getY()+200);
mLayerManager.paint(g, x, y);
flushGraphics();
if (gameover)
{
mTrucking = false;
w = getWidth();
h = getHeight();
g.setColor(0x000000);
g.fillRect(0, 0, w, h);
g.setColor(0xffffff);
g.drawString("GAME OVER", w / 2 - 80, h / 2, g.LEFT | g.TOP);
g.drawString("Tank 1.0 B", w / 2 - 80, h / 2 + 15, g.LEFT | g.TOP);
g.drawString("七彩阳光", w / 2 - 80, h / 2 + 30, g.LEFT
| g.TOP);
flushGraphics();
}
}
// -----------------绘制初始界面-------------------------
public void splash()
{
Image tanklogo = null;
try
{
tanklogo = Image.createImage("/tanklogo.png");
}
catch (IOException e)
{
}
Graphics g = getGraphics();
g.setColor(0);
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(tanklogo, 0, 0, 0);
g.setColor(0xffffff);
g.drawString("坦克大战", tanklogo.getWidth(), 20, 0);
g.drawString("reasy.net", tanklogo.getWidth(), 40, 0);
g.drawString("j2me技术联盟", tanklogo.getWidth(), 80, 0);
g.setColor(0x999999);
g.drawString("一个演示", tanklogo.getWidth(), 100, 0);
repaint();
command = new Command(mTrucking == false ? "开始" : "重新开始", Command.OK, 1);// 此也妙啊,在这里面还有一个选择判断
addCommand(command);
}
public void commandAction(Command c, Displayable s)
{
if (c.getCommandType() == Command.EXIT)
{
midlet.notifyDestroyed();
}
else if (c.getCommandType() == Command.OK)
{
mTrucking = true;//开始的条件
start();//按下开始命令就开始游戏
}
}
public void stop()
{
mTrucking = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -