📄 tilecanvas.java
字号:
import java.util.Random;
import javax.microedition.lcdui.*;
public class TileCanvas extends Canvas implements Runnable {
static final int TMARGE = 18; //顶部间距
static final int LMARGE = 3; //左边间距
static final int ROWCOL = 11; //单元格数
int map[][] = new int[ROWCOL][ROWCOL]; //地图数组
Display display;
Map lmap;
MenuCanvas BCai;
Rcav rcav;
Graphics bg; //后台缓存画图笔
Image buf; //后台缓存画图板
Anemy anemy[] = null; //敌人数组
Image[] imgShip = new Image[10]; //主船
Image imgMainPic; //主船当前图片
Image imgBomb = null; //炮弹图片
Image imgWater = null; //水柱图片
Image imgFlame = null; //爆炸图片
Image[] imgSwirl = new Image[3]; //漩涡图片
Image imgIsland = null; //无树岛
Image imgTree = null; //带树岛
Image imgBottle = null; //瓶子
Image imgHelpMan = null; //遇难者
Image imgBone = null; //窟窿
Image imgBg = null; //背景
Image imgLife = null; //生命
Image imgScore = null; //分数
Image imgLevel = null; //关数
Image imgLevelBg = null; //每关开始信息板
Image imgGameOver = null; //GAMEOVER图片
Image imgAllFinish = null; //过关图片
int nEnemy; //敌人数
int life = 5; //生命数
int score = 0; //计分
int level = 0; //关数
int i, j; //地图打印坐标
int addLife = 1000; //主船生命加1的分数界限
int personRow = 5; //角色的在数组中的行位置,最初的位置要和地图保持一致
int personColumn = 5; //角色的在数组中的列位置
int oldPersonRow = personRow; //前一步行位置
int oldPersonColumn = personColumn; //前一步列位置
int y = 16 * personRow; //主船坐标Y
int x = 16 * personColumn; //主船坐标X
int oldKeyCode = 0; //炮弹方向判断值
int tmpKeyCode = 0; //暂存按键值,当主船行走完把值传给oldKeyCode
int direction;//按键值
int mainDir;//主船方向
int swirlNum = 0;//画漩涡的图片数
int bombChange1 = 0;//炮弹1步长
int bombChange2 = 0;//炮弹2步长
int xBomb1, yBomb1, xBomb2, yBomb2;
int step = 16;//单元格大小
boolean isDead = false; //主船死亡标志
boolean iswillDead = false; //主船将要死亡标志
boolean inWalking = false; //是否移动
boolean changeEnemy = false; //敌船可移动标志
boolean isBomb = false; //是否画炮弹
boolean bbc1 = true; //炮弹1是否到达目标
boolean bbc2 = true; //炮弹2是否到达目标
boolean bFlame1 = false; //炮弹1是显示爆炸标志
boolean bFlame2 = false; //炮弹2是显示爆炸标志
boolean bWater1 = false; //炮弹1是显示水柱标志
boolean bWater2 = false; //炮弹2是显示水柱标志
boolean isRun; //RUN控制标志
boolean isDispLevel = false; //显示关卡图片标志
boolean bGameOver; //生命为0游戏结束标志
boolean bAllFinish; //完成所有关卡标志
Random rd = new Random();
public TileCanvas(MenuCanvas BCai, Display display) {
this.setFullScreenMode(true);
this.BCai = BCai;
this.display = display;
buf = Image.createImage(180, 196); //将缓冲对象的Graphics附给bg
bg = buf.getGraphics();
Thread t = new Thread(this);
t.start();
isRun = true;
bGameOver = false; //游戏失败标志
bAllFinish = false; //游戏胜利结束标志
mainDir = 4;
lmap = new Map(); //实例化MAP对象
level++;
lmap.createMap(map, level); //生成地图
nEnemy = lmap.getEnemyNum(level);
anemy = new Anemy[nEnemy];
lmap.createEnemy(map, anemy, level); //生成敌船数组
try {
imgSwirl[0] = Image.createImage("/picres/xuanwo_1_16x16.png");
imgSwirl[1] = Image.createImage("/picres/xuanwo_2_16x16.png");
imgSwirl[2] = Image.createImage("/picres/xuanwo_3_16x16.png");
imgIsland = Image.createImage("/picres/dao1_16x16.png");
imgTree = Image.createImage("/picres/dao2_16x16.png");
imgBottle = Image.createImage("/picres/bottle.png");
imgHelpMan = Image.createImage("/picres/help.png");
imgBone = Image.createImage("/picres/bone.png");
imgBg = Image.createImage("/picres/bg_game_sea.png");
imgLife = Image.createImage("/picres/heart.png");
imgScore = Image.createImage("/picres/score.png");
imgLevel = Image.createImage("/picres/level.png");
imgLevelBg = Image.createImage("/picres/level_bg.png");
imgGameOver = Image.createImage("/picres/gameover.png");
imgAllFinish = Image.createImage("/picres/Congratulation.png");
imgFlame = Image.createImage("/picres/flame3.png");
imgShip[1] = Image.createImage("/picres/ship1_ld_18x18.png");
imgShip[2] = Image.createImage("/picres/ship1_down_18x18.png");
imgShip[3] = Image.createImage("/picres/ship1_rd_18x18.png");
imgShip[4] = Image.createImage("/picres/ship1_left_18x18.png");
imgShip[6] = Image.createImage("/picres/ship1_right_18x18.png");
imgShip[7] = Image.createImage("/picres/ship1_lu_18x18.png");
imgShip[8] = Image.createImage("/picres/ship1_up_18x18.png");
imgShip[9] = Image.createImage("/picres/ship1_ru_18x18.png");
imgBomb = Image.createImage("/picres/bomb.png");
imgWater = Image.createImage("/picres/waterbomb.png");
imgMainPic = imgShip[4];
} catch (Exception e) {
e.printStackTrace();
}
}
protected void paint(Graphics g) {
bg.setColor(0x339de9);
bg.fillRect(0, 0, getWidth(), getHeight());
//画地图
drawMap(bg);
if (!isDead) {
bg.drawImage(imgMainPic, LMARGE + x, TMARGE + y + 15,
Graphics.BOTTOM | Graphics.LEFT);//如果玩家没有死则画玩家的船
}
if (changeEnemy) {
for (int i = 0; i < nEnemy; i++)
if (!anemy[i].isDead) {
bg.drawImage(anemy[i].shCurrPic, LMARGE
+ anemy[i].pixColumn,
TMARGE + anemy[i].pixRow + 15, Graphics.BOTTOM
| Graphics.LEFT);
if (((anemy[i].pixRow) == anemy[i].row * 16)
&& ((anemy[i].pixColumn) == anemy[i].column * 16)
&& anemy[i].willDead)
bg.drawImage(imgFlame, LMARGE + anemy[i].pixColumn,
TMARGE + anemy[i].pixRow, Graphics.TOP
| Graphics.LEFT);
}
} else {
for (int i = 0; i < nEnemy; i++) {
if (!anemy[i].isDead) {
bg.drawImage(anemy[i].shCurrPic, LMARGE
+ anemy[i].pixColumn,
TMARGE + anemy[i].pixRow + 15, Graphics.BOTTOM
| Graphics.LEFT);
}
}
}
if (isBomb) {//判断是否发射,如果为真则画炮弹
if (bbc1)// 画炮弹的轨迹
{
bg.drawImage(imgBomb, LMARGE + xBomb1, TMARGE + yBomb1,
Graphics.TOP | Graphics.LEFT);
}
if (bbc2) {
bg.drawImage(imgBomb, LMARGE + xBomb2, TMARGE + yBomb2,
Graphics.TOP | Graphics.LEFT);
}
// 画爆炸
if (!bbc1 && bFlame1) {
drawFlame(bg, 1, xBomb1, yBomb1);
}
if (!bbc2 && bFlame2) {
drawFlame(bg, 2, xBomb2, yBomb2);
}
if (!bbc1 && bWater1) {
drawWater(bg, 1, xBomb1, yBomb1);
}
if (!bbc2 && bWater2) {
drawWater(bg, 2, xBomb2, yBomb2);
}
}
if (isDispLevel) {
bg.drawImage(imgLevelBg, 35, 60, Graphics.TOP | Graphics.LEFT);
bg.setColor(0xf8f244);
bg.drawString("THE " + (level + 1) + " LEVEL", 65, 85, Graphics.TOP
| Graphics.LEFT);
bg.drawString("Loading...", 75, 110, Graphics.TOP | Graphics.LEFT);
}
//画状态信息
bg.setColor(0xffffff);
bg.drawImage(imgLife, 10, 4, Graphics.TOP | Graphics.LEFT);
bg.drawString(" X " + life, 20, 1, Graphics.TOP | Graphics.LEFT);
bg.drawImage(imgScore, 50, 4, Graphics.TOP | Graphics.LEFT);
bg.drawString(" " + score, 80, 1, Graphics.TOP | Graphics.LEFT);
bg.drawImage(imgLevel, 125, 4, Graphics.TOP | Graphics.LEFT);
bg.drawString(" " + level, 160, 1, Graphics.TOP | Graphics.LEFT);
g.drawImage(buf, 0, 0, Graphics.LEFT | Graphics.TOP);
if (bGameOver) {
g.drawImage(imgGameOver, 0, 60, Graphics.LEFT | Graphics.TOP);
}
if (bAllFinish) {
g.drawImage(imgAllFinish, 0, 60, Graphics.LEFT | Graphics.TOP);
}
}
public void mainShipMove() {
oldPersonRow = personRow; //记录主船旧坐标
oldPersonColumn = personColumn;
switch (direction) {
case 56:
walkDown();
mainDir = 2;
break;
case 50:
walkUp();
mainDir = 8;
break;
case 52:
walkLeft();
mainDir = 4;
break;
case 54:
walkRight();
mainDir = 6;
break;
case 51:
walkUpRight();
mainDir = 9;
break;
case 49:
walkUpLeft();
mainDir = 7;
break;
case 55:
walkDownLeft();
mainDir = 1;
break;
case 57:
walkDownRight();
mainDir = 3;
break;
}
map[oldPersonRow][oldPersonColumn] = -1; //恢复主船原来位置标记
map[personRow][personColumn] = Map.SHIP; //标记主船
}
public void NewLevel() {
level++;
if (level != Map.ALLLEVEL + 1) {
lmap.createMap(map, level);//放这里 生成地图
nEnemy = lmap.getEnemyNum(level);
anemy = new Anemy[nEnemy];
lmap.createEnemy(map, anemy, level); //生成敌船数组
if (isDead)
life -= 1;
personRow = 5; //角色的在数组中的行位置,最初的位置要和地图保持一致
personColumn = 5; //角色的在数组中的列位置
oldPersonRow = personRow;
oldPersonColumn = personColumn;
y = 16 * personRow; //主船坐标Y
x = 16 * personColumn;
oldKeyCode = 52;
isDead = false;
iswillDead = false;
imgMainPic = imgShip[4];
mainDir = 4;
changeEnemy = false;
} else {
isRun = false;
rcav = new Rcav(BCai, display);//记录仓库
rcav.matches("xxx", score);
SoundEffects.getInstance().stopBackgroundSound();
bAllFinish = true;
repaint();
delay(4000);
BCai.fd = true;
BCai.PT = 1;
BCai.menuY = 59;
display.setCurrent(BCai);
}
}
public void run() {
while (isRun) {
if(isDead)
System.out.println("1"+isDead);
if (isDispLevel) {
repaint();
delay(1000);
isDispLevel = false;
NewLevel();
} else if (!isDead) {
if (!changeEnemy) {
if (inWalking) {
inWalking = false;
mainShipMove();
} else {
walkStop();
if (direction == 53) {
Fire();
map[personRow][personColumn] = Map.SHIP; //标记主船
changeEnemy = true;
}
}
} else {
EnemyMove();
// 如果玩家在敌船碰撞检测时,被发现在攻击范围内,则标记为死亡
if (iswillDead) {
System.out.println("3-will1 "+isDead);
isDead = true;
System.out.println("3-will2 "+isDead);
}
if (testEnemyAllOver()) {
if(isDead){
if(life>0){
System.out.println("2"+isDead);
isDispLevel = true;
}
}
else
isDispLevel=true;
}
}
} else {
life();
}
addLife();
}
}
public boolean testEnemyAllOver() {
boolean enemyAllOver = true;
for (int i = 0; i < nEnemy; i++) {
if (!anemy[i].isDead && anemy[i].shLevel != Map.BEAT) {
enemyAllOver = false;
break;
}
}
return enemyAllOver;
}
//处理按键事件
protected void keyPressed(int keyCode) {
switch (keyCode) {
case 49://Downleft
case 50://Down
case 51://DownRight
case 52://Left
case 54://Right
case 55://UpLeft
case 56://Up
case 57://UpRight
inWalking = true;
direction = keyCode;
tmpKeyCode = keyCode;
break;
case 53:
direction = keyCode;
}
if (keyCode == -6) {
BCai.PT = 1;
BCai.menuY = 74;
display.setCurrent(BCai);
}
}
protected void Fire() {
int angel = 0;//炮弹发射的角度
isBomb = true;
switch (oldKeyCode) {
case 51:
case 55:
angel = 45;
break;
case 49:
case 57:
angel = -45;
break;
case 50:
case 56:
angel = 90;
break;
case 52:
case 54:
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -