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

📄 tilecanvas.java

📁 使用java 开发的手机小游戏
💻 JAVA
📖 第 1 页 / 共 3 页
字号:

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 + -