📄 missile.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 + -