上篇我们已经能画出能移动的坦克了,这次来画出敌人的坦克,敌人的坦克数量肯定是多的,那么考虑用数组还是用集合,毫无疑问我们选的是集合,因为敌人坦克击毁后会再增加坦克,也就是说数目会增加的,那样用数组是不太合理了..集合中我们选择线程安全的Vector…继续续写上篇的代码
首先到Members.java添加一个敌方坦克的类
//敌人的坦克
class EnemyTank extends Tank{
public EnemyTank(int x, int y) {
super(x, y);
}
}
在Tank类定义坦克颜色(区分自己与敌人的坦克)
int color;//坦克的颜色
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
class MyPanel extends Panel implements KeyListener
{
//.....
//敌人的坦克组
Vector<EnemyTank> ets = new Vector<EnemyTank>();
int enSize=3; //敌人坦克初始数量
public MyPanel()
{
//初始化敌人的坦克
for(int i=0;i<enSize;i++)
{ //...
//创建一辆敌人的坦克对象
EnemyTank et =new EnemyTank((i+1)*50,0);//让坦克初始位置不同
et.setColor(0);//敌人坦克颜色
et.setDirect(2);//设置敌人坦克方向向下
ets.add(et);//加入
}
}
//重新paint
public void paint(Graphics g)
{
super.paint(g);
g.fillRect(0, 0, 1200, 900); //填充使背景变为黑色
//画出自己的坦克
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
//画出敌人的坦克
for(int i=0;i<ets.size();i++)
{
this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0);
}
}
程序运行效果如图:
接下来双方都有坦克,就来考虑出子弹吧…
子弹是会移动的,这里我们将用到线程知识,我们需要一个子弹类(为了避免乱了后改不回去,还是新建一个包com.TankGame2复制原来两个java文件)
到Members.java写子弹类,子弹一旦被创建立马就要跑了,我们这里让子弹类实现Runnable接口
//子弹类
class Shot implements Runnable
{
int x;
int y;
int direct;//子弹的方向
int speed=1; //子弹速度
boolean isLive=true;//子弹是否活着
public Shot(int x,int y,int direct)
{
this.x=x;
this.y=y;
this.direct=direct;
}
public void run()
{
while(true)
{
try {
Thread.sleep(50); //经测试休息50毫秒比较好,要不然内存容易撑不了
} catch (Exception e) {
// TODO: handle exception
}
switch(direct)
{
case 0://向上打出
y-=speed;
break;
case 1://向右打出
x+=speed;
break;
case 2://向下打出
y+=speed;
break;
case 3://向左打出
x-=speed;
break;
}
//判断子弹是否碰到边缘 我们刚开始是setsize(400,300)
if( x<0 || x>400 || y<0 || y>300)
{
this.isLive=false;