📄 enemy.java
字号:
package tank;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.List;
import java.util.Random;
public class Enemy implements Ancestor{
int x,y;
int oldX,oldY;
private boolean live;
private static Random r=new Random();
private int step=r.nextInt(12)+3;
private int stepFire=r.nextInt(10)+30;
private TankClient tc;
private Director dir;
private Director ptDir;
private static final int TANK_XSPEED=5;
private static final int TANK_YSPEED=5;
private boolean leftFlag=false;
private boolean upFlag=false;
private boolean rightFlag=false;
private boolean downFlag=false;
private boolean good;
public Enemy(int x, int y,Director dir,TankClient tc){
this.x=x;
this.y=y;
this.dir=dir;
this.tc=tc;
this.ptDir=Director.DOWN;
this.dir=Director.DOWN;
this.good=false;
live=true;
}
private static final int TANK_WIDTH=30;
public static int getTANK_WIDTH() {
return TANK_WIDTH;
}
private static final int TANK_HEIGHT=30;
public static int getTANK_HEIGHT() {
return TANK_HEIGHT;
}
public void paint(Graphics g){
if (!isLive()){
this.tc.enemyList.remove(this);
return;
}
Color c=g.getColor();
g.setColor(Color.black);
g.fillOval(x,y, TANK_WIDTH,TANK_HEIGHT);
g.setColor(Color.CYAN);
switch(ptDir){
case LEFT:
g.drawLine(x, y+TANK_HEIGHT/2, x+TANK_WIDTH/2, y+TANK_HEIGHT/2);
break;
case LU:
g.drawLine(x, y, x+TANK_WIDTH/2, y+TANK_HEIGHT/2);
break;
case UP:
g.drawLine(x+TANK_WIDTH/2, y, x+TANK_WIDTH/2, y+TANK_HEIGHT/2);
break;
case RIGHT:
g.drawLine(x+TANK_WIDTH/2, y+TANK_HEIGHT/2, x+TANK_WIDTH, y+TANK_HEIGHT/2);
break;
case RU:
g.drawLine(x+TANK_WIDTH/2, y+TANK_HEIGHT/2, x+TANK_WIDTH, y);
break;
case DOWN:
g.drawLine(x+TANK_WIDTH/2, y+TANK_HEIGHT/2, x+TANK_WIDTH/2, y+TANK_HEIGHT);
break;
case RD:
g.drawLine(x+TANK_WIDTH/2, y+TANK_HEIGHT/2, x+TANK_WIDTH, y+TANK_HEIGHT);
break;
case LD:
g.drawLine(x+TANK_WIDTH/2, y+TANK_HEIGHT/2, x, y+TANK_HEIGHT);
break;
default:
g.drawLine(x+TANK_WIDTH/2, y+TANK_HEIGHT/2, x+TANK_WIDTH/2, y+TANK_HEIGHT);
}
g.setColor(c);
//tankDriction();
move();
autoFire();
}
public void keyPressed(KeyEvent e) {
if(x<0){
x=0;
return;
}
if(x+TANK_WIDTH>TankClient.getGAME_WIDTH()){
x=TankClient.getGAME_WIDTH()-TANK_WIDTH;
return;
}
if(y<30){
y=30;
return;
}
if(y+TANK_HEIGHT>TankClient.getGAME_HEIGHT()){
y=TankClient.getGAME_HEIGHT()-TANK_HEIGHT;
return;
}
int key=e.getKeyCode();
switch(key){
case KeyEvent.VK_UP:
upFlag=true;
break;
case KeyEvent.VK_DOWN:
downFlag=true;
break;
case KeyEvent.VK_LEFT:
leftFlag=true;
break;
case KeyEvent.VK_RIGHT:
rightFlag=true;
break;
}
}
public void keyReleased(KeyEvent e){
int key =e.getKeyCode();
if(KeyEvent.VK_CONTROL==key){
fire();
}
else if(KeyEvent.VK_UP==key){
upFlag=false;
}
else if(KeyEvent.VK_DOWN==key){
downFlag=false;
}
else if(KeyEvent.VK_LEFT==key){
leftFlag=false;
}
else if(KeyEvent.VK_RIGHT==key){
rightFlag=false;
}
}
void tankDriction(){
if(upFlag && !downFlag && !leftFlag && !rightFlag){
dir=Director.UP;
ptDir=Director.UP;
}
else if(!upFlag && downFlag && !leftFlag && !rightFlag){
dir=Director.DOWN;
ptDir=Director.DOWN;
}
else if(!upFlag && !downFlag && leftFlag && !rightFlag){
dir=Director.LEFT;
ptDir=Director.LEFT;
}
else if(!upFlag && !downFlag && !leftFlag && rightFlag){
dir=Director.RIGHT;
ptDir=Director.RIGHT;
}
else if(upFlag && !downFlag && leftFlag && !rightFlag){
dir=Director.LU;
ptDir=Director.LU;
}
if(upFlag && !downFlag && !leftFlag && rightFlag){
dir=Director.RU;
ptDir=Director.RU;
}
else if(!upFlag && downFlag && leftFlag && !rightFlag){
dir=Director.LD;
ptDir=Director.LD;
}
else if(!upFlag && downFlag && !leftFlag && rightFlag){
dir=Director.RD;
ptDir=Director.RD;
}
else if(!upFlag && !downFlag && !leftFlag && !rightFlag){
dir=Director.STOP;
}
}
void move(){
movePath();
this.oldX=x;
this.oldY=y;
switch(dir){
case UP:
y-=TANK_YSPEED;
break;
case DOWN:
y+=TANK_YSPEED;
break;
case LEFT:
x-=TANK_XSPEED;
break;
case RIGHT:
x+=TANK_XSPEED;
break;
case LU:
x-=TANK_XSPEED;
y-=TANK_YSPEED;
break;
case RU:
x+=TANK_XSPEED;
y-=TANK_YSPEED;
break;
case RD:
x+=TANK_XSPEED;
y+=TANK_YSPEED;
break;
case LD:
x-=TANK_XSPEED;
y+=TANK_YSPEED;
break;
}
collideCheck();
}
void moveBack(){
this.x=oldX;
this.y=oldY;
}
void collideCheck(){
if(x<0 || x+TANK_WIDTH>TankClient.getGAME_WIDTH() ||y<30 || y+TANK_HEIGHT>TankClient.getGAME_HEIGHT()){
moveBack();
}
for(int i=0;i<tc.enemyList.size();i++){
Enemy en=tc.enemyList.get(i);
if(en!=this){
if(this.getRect().intersects(en.getRect())){
moveBack();
}
if(this.getRect().intersects(tc.getT().getRect())){
moveBack();
}
}
}
collidesWithWall(tc.getW1());
collidesWithWall(tc.getW2());
}
void collidesWithWall(Wall w){
if(this.getRect().intersects(w.getRect())){
moveBack();
}
}
void fire (){
if(!live){return;}
tc.missileList.add(new Missile(this.x+(TANK_WIDTH-Missile.getMissile_WIDTH())/2,this.y+(TANK_HEIGHT-Missile.getMissile_HEIGHT())/2,ptDir,this.good,this.tc));
}
void autoFire(){
if (stepFire==0){
stepFire=r.nextInt(10)+30;
this.fire();
}
stepFire--;
}
public Rectangle getRect(){
return new Rectangle(x,y,TANK_WIDTH,TANK_HEIGHT);
}
public boolean isBeHit(List<Missile> missileList){
for (int i=0;i<missileList.size();i++){
Missile mis=missileList.get(i);
if(this.getRect().contains(mis.getRect())&& this.good!=mis.isGood()){
this.setLive(false);
mis.setLive(false);
return true;
}
}
return false;
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void movePath(){
Director[] dirs= Director.values();
if(step==0){
step=r.nextInt(12)+3;
int rn=r.nextInt(dirs.length-1);
dir=dirs[rn];
ptDir=dirs[rn];
}
step--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -