目前我们的坦克能发子弹,但是只能发一颗,而且打到敌人坦克敌人还不会消失,本篇我们就来解决这个问题…子弹要想做到连发,就得初始化多个子弹,这个时候我们仍然还是跟定义敌人的坦克组一样用Vector集合..
class Hero extends Tank
{
//子弹
Vector<Shot> ss = new Vector<Shot>(); //Vector集合
Shot s = null;
//...
//开火
public void shotEnemy()
{
switch (this.direct) //子弹的方向
{
//s只是代号而已,指向谁就谁,不要理解它是同一颗子弹
case 0:
//创建一颗子弹(下同)
s=new Shot(x+10, y,0);
//把子弹加入向量(下同)
ss.add(s);
break;
case 1:
s=new Shot(x+30,y+10,1);
ss.add(s);
break;
case 2:
s=new Shot(x+10,y+30,2);
ss.add(s);
break;
case 3:
s=new Shot(x,y+10,3);
ss.add(s);
break;
}
//启动子弹线程
Thread t = new Thread(s);
t.start();
}
在到MyPanel类修改和添加代码
public void paint(Graphics g)
{
super.paint(g);
g.fillRect(0, 0, 1200, 900); //填充使背景变为黑色
//从ss中取出每颗子弹,并画出
for(int i=0;i<hero.ss.size();i++)
{
Shot myShot = hero.ss.get(i);
//画出一颗子弹
if(myShot!=null && myShot.isLive == true)
{
g.setColor(Color.yellow);
g.draw3DRect(myShot.x, myShot.y, 1, 1, false);
}
if(myShot.isLive==false) //子弹死亡(下面将用到)
{
//从ss中删除该子弹
hero.ss.remove(myShot);
}
}
随着代码越写越多,可能我们会觉得很乱,这时看Eclipse编写代码页面右边有个Outline
点一下就跳到我们要的类或方法了,比较容易看..
这时,子弹已经可以连发了..不过,打得还真是没有限制哦,无限连发,游戏都没难度了。所以,我们还是来设置一下连发限制吧..
public void keyPressed(KeyEvent e)
{ //.......
//判断玩家是否按下j键
if(e.getKeyCode() == KeyEvent.VK_J)
{
if(this.hero.ss.size()<=4)//最多连发5颗子弹
{
//为什么是<=4?因为进入shotEnemy后才由集合里面个数才由0变为1
//开火
this.hero.shotEnemy();
}
}
}
这样最多能发五颗了,什么叫连发呢?上面paint方法有个子弹死亡的处理,也就是子弹打出后飞出界了或打到敌人坦克就算死亡,那么,接下来就要让敌人坦克碰到我们的子弹就消失吧..
这里我们写一个函数专门判断子弹是否会击中敌人坦克,先到Members.java文件中EnemyTank类添加一个变量isLive用于判断坦克的死活
boolean isLive=true;
//写一个函数专门判断子弹是否会击中敌人坦克
public void hitTank(Shot s,EnemyTank et)
{
//判断该坦克的方向
switch (et.direct)
{
//如果敌人坦克方向是上或是下
case 0:
case 2:
//根据子弹坐标和敌人坦克坐标确定是否子弹到敌人坦克范围(可以测试看看)
if(s.x<et.x && s.x<et.x+20 && s.y>et.y && s.y<et.y+30)
{
//击中
//子弹死亡
s.isLive=false;
//敌人坦克死亡
et.isLive=false;
}
break;
//向左或向右
case 1:
case 3:
if(s.x>et.x && s.x<et.x+30 && s.y>et.y && s.y<et.y+20)
{
//击中