java项目之——坦克大战12

解决坦克停下来也可以打出炮弹:画出炮筒,在fire中把子弹方向给炮筒

1.创建坦克炮筒常量并初始化:

private Direction ptDir = Direction.D;
2.在draw方法里面画出炮筒
public void draw(Graphics g) {
	        Color c = g.getColor();
		g.setColor(Color.RED);
		g.fillOval(x, y, WIDTH, HEIGHT);
		g.setColor(c);
		
			   switch(ptDir){
			   case L: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT/2);break;
			   case LU:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y);break;
			   case U: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y);break;
			   case RU:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y);break;
			   case R: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y+Tank.HEIGHT/2);break;
			   case RD:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y+Tank.HEIGHT);break;
			   case D: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y+Tank.HEIGHT);break;
			   case LD:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT);break;
			   }	   
		
		move();

   }
3,虽然画出了炮筒,但是炮筒方向不随坦克运动改变,所以有以下代码
 
	   if(this.dir!=Direction.STOP){
	       this.ptDir = dir;
	   }
4.在fire方法中修改dir为ptDir
public Missile fire(){
		int x=this.x+Tank.WIDTH/2-Missile.HEIGHT/2;
		int y=this.y-Missile.WIDTH/2+Tank.HEIGHT/2;
		Missile m = new Missile(x, y, ptDir);
		
		return m;
	}

总结:炮筒的创建是很有必要的,炮筒的方向是通过坦克move改变的,在fire方法中传ptDIR实现了炮筒的方向就是子弹打出的方向。


下面是坦克类代码:

public class Tank {
   public static final int XSPEED =5;
   public static final int YSPEED =5;
   
   public static final int WIDTH =30;
   public static final int HEIGHT =30;
   
   TankClient tc;
   int x,y;
   private boolean bL=false,bU=false,bD=false,bR=false;
   enum Direction {L,LU,U,RU,R,RD,D,LD,STOP};
   private Direction dir = Direction.STOP;
   private Direction ptDir = Direction.D;
   
   public Tank(int x,int y){
	   this.x=x;
	   this.y=y;	   
   }
   
   public Tank(int x,int y,TankClient tc){
	   this(x,y);
	   this.tc=tc;	   
   }
   
  
   public void draw(Graphics g) {
	    Color c = g.getColor();
		g.setColor(Color.RED);
		g.fillOval(x, y, WIDTH, HEIGHT);
		g.setColor(c);
		
			   switch(ptDir){
			   case L: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT/2);break;
			   case LU:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y);break;
			   case U: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y);break;
			   case RU:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y);break;
			   case R: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y+Tank.HEIGHT/2);break;
			   case RD:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y+Tank.HEIGHT);break;
			   case D: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y+Tank.HEIGHT);break;
			   case LD:g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT);break;
			   }	   
		
		move();

   }
   void move(){
	   switch(dir){
	   case L: x -= XSPEED;break;
	   case LU: x -= XSPEED; y -= XSPEED;break;
	   case U: y -= XSPEED;break;
	   case RU: x += XSPEED;y -= XSPEED;break;
	   case R: x += XSPEED;break;
	   case RD: x += XSPEED;y += XSPEED;break;
	   case D: y += XSPEED;break;
	   case LD: x -= XSPEED;y += XSPEED;break;
	   case STOP: break;
	   }	  
	   
	   if(this.dir!=Direction.STOP){
	       this.ptDir = dir;
	   }
	  
   }
		
   public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		switch(key){
		case KeyEvent.VK_CONTROL:  tc.m = fire();  break;
		case KeyEvent.VK_LEFT:  bL=true;  break;
		case KeyEvent.VK_UP:    bU=true;  break;
		case KeyEvent.VK_RIGHT: bR=true;  break;
		case KeyEvent.VK_DOWN:  bD=true;  break;
		}
		locateDirection();
	}
   
   public void keyReleased(KeyEvent e) {
	   int key = e.getKeyCode();
	    switch(key){
		case KeyEvent.VK_LEFT:  bL=false;  break;
		case KeyEvent.VK_UP:    bU=false;  break;
		case KeyEvent.VK_RIGHT: bR=false;  break;
		case KeyEvent.VK_DOWN:  bD=false;  break;
		}
		locateDirection();

	}
		
	void locateDirection(){
		if(bL && !bU && !bR && !bD)dir=Direction.L;
		else if(bL && bU && !bR && !bD)dir=Direction.LU;
		else if(!bL && bU && !bR && !bD)dir=Direction.U;
		else if(!bL && bU && bR && !bD)dir=Direction.RU;
		else if(!bL && !bU && bR && !bD)dir=Direction.R;
		else if(!bL && !bU && bR && bD)dir=Direction.RD;
		else if(!bL && !bU && !bR && bD)dir=Direction.D;
		else if(bL && !bU && !bR && bD)dir=Direction.LD;
		else if(!bL && !bU && !bR && !bD)dir=Direction.STOP;		
	}	
	
	public Missile fire(){
		int x=this.x+Tank.WIDTH/2-Missile.HEIGHT/2;
		int y=this.y-Missile.WIDTH/2+Tank.HEIGHT/2;
		Missile m = new Missile(x, y, ptDir);
		
		return m;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值