坦克大战项目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页面上!