在HsyTnkGame02.java基础上画出三辆坦克,注意颜色
分析
1、因为敌人的坦克,是在MyPanel上,所以我们的代码在MyPanel
2、因为敌人的坦克,后面有自己特殊的属性和方法,可以单开一个EnemyTank
3、敌人坦克数量多,可以放入到集合Vector,因为考虑多线程的问题
在上一篇坦克移动的基础上
Java基础 坦克大战03坦克移动_小黄debug的博客-CSDN博客
进行添加和修改
将敌人坦克进行一次继承封装
/**
* @ClassName EnemyTank
* @Description
* @Author 小黄debug
* @Date 2022/3/20 11:17
* @Version 1.0
**/
public class EnemyTank extends Tank{
public EnemyTank(int x, int y) {
super(x, y);
}
}
然后在MyPanel的基础上进行修改
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
/**
* @ClassName MyPanel
* @Description 坦克大战绘图区
* @Author 小黄debug
* @Date 2022/3/18 6:35
* @Version 1.0
**/
//为了监听键盘事件
public class MyPanel extends JPanel implements KeyListener {
//定义我的坦克
Hero hero = null;
//定义敌人坦克,放入到Vector中
Vector<EnemyTank> enemyTanks = new Vector<>();
int enemyTankSize = 3;
public MyPanel(){
hero = new Hero(100,100); //初始化自己坦克
hero.setSpeed(50);
//初始化敌人的坦克
for(int i = 0; i < enemyTankSize; i++){
//创建一个敌人的坦克
EnemyTank enemyTank = new EnemyTank(100 * (i + 1), 0);
//设置方向
enemyTank.setDirect(2);
//加入
enemyTanks.add(enemyTank);
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形,默认黑色
//画出坦克-封装方法
drawTank(hero.getX(), hero.getY(),g,hero.getDirect(),1);
//画出敌人的坦克
for(int i = 0; i < enemyTanks.size(); i++){
EnemyTank enemyTank = enemyTanks.get(i);
drawTank(enemyTank.getX(), enemyTank.getY(),g,enemyTank.getDirect(),0);
}
}
/**
*
* @param x 坦克的左上角x坐标
* @param y 坦克的在左上角y坐标
* @param g 画笔
* @param direct 坦克方向(上下左右)
* @param type 坦克类型
*/
public void drawTank(int x,int y,Graphics g,int direct,int type){
//根据不同类型的坦克,设置不同颜色
switch (type){
case 0://敌人的坦克
g.setColor(Color.cyan);
break;
case 1://我们的坦克
g.setColor(Color.yellow);
break;
}
//根据坦克方向,来绘制坦克
//(direct) 表示方向(0:向上 1:向右 2:向下 3:向左
switch(direct){
case 0: //表示向上
g.fill3DRect(x,y,10,60,false); //左边的轮子
g.fill3DRect(x+30,y,10,60,false); //右边的轮子
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y+30,x+20,y); //画出炮筒
break;
case 1:
g.fill3DRect(x,y,60,10,false);
g.fill3DRect(x,y+30,60,10,false);
g.fill3DRect(x+10,y+10,40,20,false);
g.fillOval(x+20,y+10,20,20);
g.drawLine(x+30,y+20,x+60,y+20);
break;
case 2: //表示向下
g.fill3DRect(x,y,10,60,false); //左边的轮子
g.fill3DRect(x+30,y,10,60,false); //右边的轮子
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y+30,x+20,y+60); //画出炮筒
break;
case 3:
g.fill3DRect(x,y,60,10,false);
g.fill3DRect(x,y+30,60,10,false);
g.fill3DRect(x+10,y+10,40,20,false);
g.fillOval(x+20,y+10,20,20);
g.drawLine(x,y+20,x+30,y+20);
break;
default:
System.out.println("暂时没有处理");
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W){
//改变坦克的方向
hero.setDirect(0);
//修改坦克的坐标 y -= 1;
hero.moveUp();
}else if(e.getKeyCode() == KeyEvent.VK_D){
//改变坦克的方向
hero.setDirect(1);
hero.moveRight();
}else if(e.getKeyCode() == KeyEvent.VK_S){
//改变坦克的方向
hero.setDirect(2);
hero.moveDown();
}else if(e.getKeyCode() == KeyEvent.VK_A){
//改变坦克的方向
hero.setDirect(3);
hero.moveLeft();
}
//将面板重绘
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}