Java坦克大战项目4

坦克大战项目4

任务4:让我方坦克运动起来

在坦克绘制完成后,我方坦克通过键盘来控制运动的。按键盘向上的键,坦克向上运动;向右的键,坦克向右运动;向下的键,坦克向下运动;向左的键,坦克向左运动。
在这里需要区分开敌我双方的坦克,这就需要用到封装分类,一个坦克的主类,一个敌方坦克的类,一个我方坦克的类,我方坦克与敌方坦克有不同的属性,但都是继承与坦克主类,这样在画坦克的时候也能够很好的区分开敌我。

坦克类

package TankZhuJieMian;

import java.awt.Color;

//坦克类
class Tank{
    //坦克的横坐标
	private int x ;
	private int y ;
	//坦克的方向
	protected int direction;
	//坦克的颜色
	private Color color;
	//坦克的类型
	private int leixing;
	//坦克的速度
	private int sudu;
	
    public int getDirection() {
		return direction;
	}
	public void setDirection(int direction) {
		this.direction = direction;
	}
	public int getSudu() {
		return sudu;
	}
	public void setSudu(int sudu) {
		this.sudu = sudu;
	}
	public Color getColor() {
		return color;
	}
	public void setColor(Color color) {
		this.color = color;
	}
	public int getLeixing() {
		return leixing;
	}
	public void setLeixing(int leixing) {
		this.leixing = leixing;
	}
	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 Tank( int x, int y, int direction, Color color, int leixing) {
	   super();
	   this.x = x;
	   this.y = y;
	   this.direction = direction;
	   this.color = color;
	   this.leixing = leixing;	   	 
	  
   }
}

我方坦克

class Hero extends Tank{
	//我方坦克子弹的集合
	 Vector<Shot> Heroshots = new Vector<Shot>();
	 Shot myShot=null;
   public Hero(int x,int y,int direction) {
	   super(x,y,direction,Color.RED,1);//我方坦克类型为1
	   	this.setSudu(3);
   }
   
	   public void showShot(int x,int y,int direction){
		   		    
			switch (direction) {
			case 1:// 方向向上
				myShot = new Shot(x + 10, y - 2, 1);
				Heroshots.add(myShot);
				break;
			case 2:// 方向向右
				myShot = new Shot(x + 32, y + 10, 2);
				Heroshots.add(myShot);
				break;
			case 3:// 方向向下
				myShot = new Shot(x + 10, y + 32, 3);			
				Heroshots.add(myShot);
				break;
			case 4:// 方向向左
				myShot = new Shot(x - 2, y + 10, 4);				
				Heroshots.add(myShot);
				break;
			}	
			new Thread(myShot).start();//启动子弹变化的这个线程
   }

}

敌方坦克

public class DfTank extends Tank implements Runnable {
	 public DfTank(int x ,int y,int direction ) {
		   super(x,y,direction,Color.BLUE,0);//敌方坦克类型为0
		   this.setSudu(3);	
		   @Override
	public void run() {
		// TODO 自动生成的方法存根
		
	}
}

绘制敌方坦克,由于有很多敌方坦克,所以绘制敌方坦克时需要用到集合,这样的话也方便后续消灭敌方坦克之后删除坦克

Vector<DfTank> v;
 v = new Vector<DfTank>();
			 	DfTank Df1 = new DfTank(100,100,4);
				DfTank Df2 = new DfTank(100+70,200,2);
				DfTank Df3 = new DfTank(100+140,300,3);
																							
				v.add(Df1);
				v.add(Df2);
				v.add(Df3);
for(int i=0;i<v.size();i++) {
				DfTank Df = v.get(i);
				DrawTank(Df.getX(),Df.getY(),Df.getDirection(),Df.getLeixing(),g);	
			}

接下来就是让我方坦克动起来了,这是需要添加监听

	public void keyPressed(KeyEvent e) {
		// TODO 自动生成的方法存根
		//向上移动,向上移的时候要减Y的坐标
		if(e.getKeyCode()==KeyEvent.VK_UP) {
			Mt.setY(Mt.getY()-Mt.getSudu());
			Mt.setDirection(1);
		}
		//向右移动
		if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
			Mt.setX(Mt.getX()+Mt.getSudu());
			Mt.setDirection(2);
		}
		//向下移动,向下移动时要加Y的坐标
		if(e.getKeyCode()==KeyEvent.VK_DOWN) {
			Mt.setY(Mt.getY()+Mt.getSudu());
			Mt.setDirection(3);
		}
		//向左移动
		if(e.getKeyCode()==KeyEvent.VK_LEFT) {
			Mt.setX(Mt.getX()-Mt.getSudu());
			Mt.setDirection(4);
		}
		//判断是否等于空格,如果按键为空格,则发射子弹
		if(e.getKeyCode()==KeyEvent.VK_SPACE) {
			if(Mt.Heroshots.size()<6) {
				 Mt.showShot(Mt.getX(),Mt.getY(),Mt.getDirection());//调用发射子弹的方法
			}
		}
		repaint();//每次判断、重绘之后刷新页面。
	}

这里值得注意的是,监听需要添加在游戏的主界面上的JFram上,不能添加在游戏开始的JPanel页面上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值