java项目之——坦克大战11

功能:1.根据主战坦克的方向和位置,打出子弹,Ctrl键的按键处理

            2.根据“坦克打出一发子弹”这句话,来确定 Tank 中的方法 fire ,其返回值为 Missle

            3.根据
Tank 方向和位置设定子弹的方向和位置并 new 出来,然后返回( fire 方法的实现)

1.在按键监听里面加ctrl按键处理,代码如下

	public Tank(int x, int y, TankClient tc) {          //tc是为了能够调用fire
		this(x, y);
		this.tc = tc;
	}

        tc.m=fire();也是创建tc的目的(持有对方的引用,用构造方法进行初始化),主类里面也要进行改动
        Missile m = null;
	Image offScreenImage = null;
	
	public void paint(Graphics g) {
  		if(m!=null)  m.draw(g);
		myTank.draw(g);
	}

       如果没有则不打出子弹(下一个版本将要解决的问题)

<span style="color:#333333;">case KeyEvent.VK_CONTROL:
tc.m = fire();
break;                          //case穿透,如果不加的话</span>

2.坦克里面fire方法(坦克要打出子弹)  返回子弹对象m(子弹应该在中点位置打出,还有静止的时候,子弹也静止打出)
添加常量:高度与宽度
坦克
public static final int WIDTH =30;
public static final int HEIGHT =30;

子弹
public static final int WIDTH =10;
public static final int HEIGHT =10;

坦克打出的位置计算:
public Missile fire() {
		int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
		int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
		Missile m = new Missile(x, y, dir);
		return m;
	}
总结:本版本最主要对象是子弹,子弹打出及方向控制,位置等等。tc的创建,应该重  点理解,持有对方引用,然后通过构造方法初始化,然后赋值 tc.m = fire();

下一版本:创建炮筒,解决禁止子弹无运动方向的问题。

附上坦克类的代码(本版本主要改到类)
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;
   
   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;	   
   }
   
   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;
	   }	   
   }
   public void draw(Graphics g) {
	    Color c = g.getColor();
		g.setColor(Color.RED);
		g.fillOval(x, y, WIDTH, HEIGHT);
		g.setColor(c);
		move();
   }
		
   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, dir);
		
		return m;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值