现在代码已经越写越多了,这里我们又新建一个包com.TankGame4,复制原来的两个java文件,首先我们来实现一个功能:防止敌人的坦克重叠运动。我们把判断是否碰撞的函数写到EnemyTank类中
Members.java
//敌人的坦克,把敌人做成线程类
class EnemyTank extends Tank implements Runnable
{
//定义一个向量,可以访问到MyPanel上所有敌人的坦克
Vector<EnemyTank> ets = new Vector<EnemyTank>();
//.......
//得到MyPanel的敌人坦克向量
public void setEts(Vector<EnemyTank> vv)
{
this.ets=vv;
}
//.....
}
接下来到MyPanel类的构造函数
public MyPanel()
{//...
//初始化敌人的坦克
for(int i=0;i<enSize;i++)
{
//.......
//将MyPanel的敌人坦克向量交给该敌人坦克
et.setEts(ets);
//...
}
接下来大概计算我们的坦克与敌人坦克相遇的各种情形时的距离
根据这四种情况写代码(代码虽然多,但是思路差不多)
在EnemyTank类写isTouchOtherEnemy()函数
//判断是否碰到了敌人的坦克
public boolean isTouchOtherEnemy()
{
boolean b=false;
switch(this.direct)
{
case 0:
//我的坦克向上
//取出所有的敌人坦克
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et = ets.get(i);
//如果不是自己
if(et!=this)
{
//如果敌人的方向是向下或者向上
if(et.direct==0 || et.direct==2)
{
//左点
if(this.x>=et.x && this.x<=et.x+20 && this.y>=et.y && this.y<=et.y+30)
{
return true;
}
if(this.x+20>=et.x && this.x+20<=et.x+20 && this.y>=et.y && this.y<=et.y+30)
{
return true;
}
}
if(et.direct==3 || et.direct==1)
{
if(this.x>=et.x && this.x<=et.x+30 && this.y>=et.y && this.y<=et.y+20)
{
return true;
}
if(this.x+20>=et.x && this.x+20<=et.x+30 && this.y>=et.y && this.y<=et.y+20)
{
return true;
}
}
}
}
break;
case 1:
//坦克向右
//取出所有的敌人坦克
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et = ets.get(i);
//如果不是自己
i