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

📄 missile.java

📁 基于尚学堂坦克大战的基础上开发,支持多人对战,在线聊天,坦克大战网络版.
💻 JAVA
字号:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Missile {

	public int x, y; // 指定子弹的坐标

	public int missileId; // 子弹的Id

	public int tankId; // 子弹对应的tankId

	public Direction dir; // 子弹的方向

	private int XSPEED = 10, YSPEED = 10; // 子弹的速度

	public static final int WIDTH = 20, HEIGHT = 20; // 子弹的大小

	private boolean live = true; // 判断子弹的是否生存的属性

	private TankClient tc; // 持有TankClient的引用

	public boolean good; // 判断是好子弹还是坏子弹

	int power;

	public boolean auto; // 第三方电脑控制的属性,让电脑自动控制s

	private static Image[] missileimgs = null;

	private ArrayList<Image> powerNumbers = new ArrayList<Image>();

	private static Image[] powerimgs = null;

	private static Map<String, Image> imgs = new HashMap<String, Image>();

	private static Toolkit tk = Toolkit.getDefaultToolkit();

	static {

		powerimgs = new Image[] {
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a0.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a1.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a2.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a3.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a4.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a5.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a6.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a7.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a8.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/a9.png")) };

		missileimgs = new Image[] {
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileL.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileLU.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileR.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileRU.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileU.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileLD.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileD.png")),
				tk.getImage(Tank.class.getClassLoader().getResource(
						"images/missileRD.png")) };
		imgs.put("L", missileimgs[0]);
		imgs.put("LU", missileimgs[1]);
		imgs.put("R", missileimgs[2]);
		imgs.put("RU", missileimgs[3]);
		imgs.put("U", missileimgs[4]);
		imgs.put("LD", missileimgs[5]);
		imgs.put("D", missileimgs[6]);
		imgs.put("RD", missileimgs[7]);
	}

	public Missile(int x, int y, Direction dir) {

		this.x = x;
		this.y = y;
		this.dir = dir;
	}

	public Missile(int tankId, int missileId, int x, int y, Direction dir,
			boolean good, boolean auto, TankClient tc) {
		this(x, y, dir);
		this.tankId = tankId;
		this.missileId = missileId;
		this.good = good;
		this.auto = auto;
		this.tc = tc;
	}

	/**
	 * 在窗口中画出子弹
	 * 
	 * @param g
	 */
	public void drawMissile(Graphics g) {
		if (!live) {
			tc.ms.remove(this);
		}
		/*
		 * Color c = g.getColor(); if(good){ g.setColor(Color.BLACK); }else{
		 * g.setColor(Color.DARK_GRAY); } g.fillOval(x, y, WIDTH, HEIGHT);
		 */

		switch (dir) {
		case L:
			g.drawImage(imgs.get("L"), x, y + Tank.HEIGHT / 2, null);
			break;
		case LU:
			g.drawImage(imgs.get("LU"), x, y, null);
			break;
		case U:
			g.drawImage(imgs.get("U"), x + Tank.WIDTH / 2, y, null);
			break;
		case RU:
			g.drawImage(imgs.get("RU"), x + Tank.WIDTH, y, null);
			break;
		case R:
			g.drawImage(imgs.get("R"), x + Tank.WIDTH, y + Tank.HEIGHT / 2,
					null);
			break;
		case RD:
			g.drawImage(imgs.get("RD"), x + Tank.WIDTH, y + Tank.HEIGHT, null);
			break;
		case D:
			g.drawImage(imgs.get("D"), x + Tank.WIDTH / 2, y + Tank.HEIGHT,
					null);
			break;
		case LD:
			g.drawImage(imgs.get("LD"), x, y + Tank.HEIGHT, null);
			break;
		}

		move();
	}

	/**
	 * 跟据方向,执行移动的位置
	 * 
	 */
	public void move() {
		switch (dir) {
		case L:
			x -= XSPEED;
			break;
		case LU:
			x -= XSPEED;
			y -= YSPEED;
			break;
		case U:
			y -= YSPEED;
			break;
		case RU:
			x += XSPEED;
			y -= YSPEED;
			break;
		case R:
			x += XSPEED;
			break;
		case RD:
			x += XSPEED;
			y += YSPEED;
			break;
		case D:
			y += YSPEED;
			break;
		case LD:
			x -= XSPEED;
			y += YSPEED;
			break;
		}
		if (x > TankClient.DEFAULT_WIDTH || x < 0
				|| y > TankClient.DEFAULT_HEIGHT || y < 0) {
			live = false;
		}
	}

	/**
	 * 得到子弹的区域,所得的区域是子弹的外切矩形
	 * 
	 * @return
	 */
	public Rectangle getRect() {
		return new Rectangle(x, y, WIDTH, HEIGHT);
	}

	public void showPower() {

	}

	public boolean hitTank(Tank t) {

		/**
		 * 判断子弹是否是活的,有没有碰撞,是不是同一方的子弹 加入第三方坦克,现有我方坦克,敌方玩家的坦克,还有电脑控制的坦克
		 */
		if (this.live && this.getRect().intersects(t.getRect()) && t.isLive()
				&& (this.good != t.isGood() || this.auto != t.isAuto())) {
			this.live = false;
			Msg missilemsg = new MissileDeadMsg(this.missileId, tc);
			tc.client.send(missilemsg);
			// 敌方去血量,,,随机到>22的数时,爆击
			power = (int) (Math.random() * 5) + 10;
			if (power > 13) {
				power = (int) (Math.random() * 5) + 30;
			}
			t.blood -= power;
			Explode e = new Explode(x, y, tc);
			tc.explodes.add(e);
			Msg msg = new TankDeadMsg(t);
			tc.client.send(msg);

			if (t.blood <= 0) {
				t.setLive(false);
				int itemRandom = (int)((Math.random() * 10) % 8);
				System.out.println("我被运行到了吗?" + itemRandom);
				// 随机生成掉落物品

				if (itemRandom < 2) {
					int ranx = (int) (Math.random() * TankClient.DEFAULT_WIDTH);
					int rany = (int) (Math.random() * TankClient.DEFAULT_HEIGHT);
					Item item = new Item(x, y, tc);
					tc.items.add(item);
					Msg itemMsg = new NewItemMsg(tc, item);
					tc.client.send(itemMsg);
				}
			}

			//判断是否结束一盘比赛,或游戏
            tc.tank.gameWinOrLose();
            
			return true;
		}
		return false;
	}


	/**
	 * 判断是否击中其他玩家的坦克,并且返回boolean值类型的变量
	 */
	public boolean hitPlayerTanks(ArrayList playerTanks) {
		for (int i = 0; i < playerTanks.size(); i++) {
			if (hitTank((Tank) playerTanks.get(i))) {
				live = false;
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断是否击中电脑控制的坦克,并且返回boolean值类型的变量
	 * 
	 * @param tanks
	 * @return
	 */
	public boolean hitTanks(ArrayList tanks) {
		for (int i = 0; i < tanks.size(); i++) {
			if (hitTank((Tank) tanks.get(i))) {
				live = false;
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断是否撞到障碍物
	 * 
	 * @param walls
	 * @return
	 */
	public boolean hitWalls(ArrayList walls) {
		for (int i = 0; i < walls.size(); i++) {
			Wall wall = (Wall) walls.get(i);
			if (this.live && this.getRect().intersects(wall.getRect())) {
				this.live = false;
				int style = wall.style;
				switch (style) {
				case 0:
					wall.life -= 3;
					wall.step++;
					if (wall.life == 0) {
						tc.walls.remove(wall);
					}
					break;
				case 1:
					wall.life -= 2;
					if (wall.life == 0) {
						tc.walls.remove(wall);
					}
					break;
				case 2:
					wall.life = 0;
					// 让爆炸更猛列一点
					Explode e1 = new Explode(wall.x, wall.y, tc);
					e1.step = (int) (Math.random() * 100) % 5 + 15;
					Explode e2 = new Explode(wall.x + 30, wall.y + 30, tc);
					e1.step = (int) (Math.random() * 100) % 10 + 10;
					Explode e3 = new Explode(wall.x + 25, wall.y - 25, tc);
					e1.step = (int) (Math.random() * 100) % 15 + 5;
					tc.explodes.add(e1);
					tc.explodes.add(e2);
					tc.explodes.add(e3);
					tc.walls.remove(wall);
					break;
				}

				return true;
			}
		}
		return false;
	}

	public boolean isGood() {
		return good;
	}

	public void setGood(boolean good) {
		this.good = good;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -