Html飞机大战(十一): 飞机撞毁爆炸

好家伙,这篇写英雄撞机爆炸

 

我们先把子弹销毁弄上去

子弹穿过敌机,敌机爆炸后消失,子弹同样也应该销毁,(当然后续会考虑穿甲弹)

 

然后我们还要把主角碰撞爆炸检测也加上去

 

因为他们共用一个思路,所以我们把他写在一起

我们会为子弹和英雄都添加一个destory属性

 

在碰撞检测完成后,我们调用一个方法去把这个属性改为true

 

同时在一个全局函数中,时刻检测这个destory属性,

当这个属性由false转为true时,销毁这个数组中的这个对象

 

当然了,英雄类中还要添加一个方法用于渲染英雄的爆炸动画(然后再将他的destory改为true)

 

思路清晰,开干

 

1.全局检测函数

// 碰撞检测函数
      function checkHit() {
        // 遍历所有的敌机
        for (let i = 0; i < enemies.length; i++) {
          //检测英雄是否撞到敌机
          if (enemies[i].hit(hero)) {
            //将敌机和英雄的destory属性改为true
            enemies[i].collide();
            hero.collide();
          }
          for (let j = 0; j < hero.bulletList.length; j++) {
            enemies[i].hit(hero.bulletList[j]);
            //检测子弹是否撞到敌机
            if (enemies[i].hit(hero.bulletList[j])) {
            //将敌机和子弹的destory属性改为true
              enemies[i].collide();
              hero.bulletList[j].collide();
            }
          }
        }
      }

 

2.全局的删除方法deleteComponent()

function deleteComponent() {
        if (hero.destory) {
          life--;
          hero.destory = false;
          if (life === 0) {
            state = END;
          } else {
            hero = new Hero(HERO);
          }
        }
        for (let i = 0; i < hero.bulletList.length; i++) {
          if (hero.bulletList[i].outOfBounds() || hero.bulletList[i].destory) {
            hero.bulletList.splice(i, 1);
          }
        }
        for (let i = 0; i < enemies.length; i++) {
          if (enemies[i].outOfBounds() || enemies[i].destory) {
            enemies.splice(i, 1);
          }
        }
      }

这里做了一个整合,将子弹/敌机的出界判定销毁和子弹/敌机的碰撞判定销毁整合到一起了

看上去更方便理解了

 

outOfBounds()是一个出界判定
敌机或者子弹出界了就销毁
outOfBounds() {
          return this.y < -this.height;
        }

 

 

3.hero的爆炸动画渲染方法

这里需要补充一下

当我们完成了英雄和敌机的碰撞检测后(假设已经撞上了),

我们先将英雄的live属性改为false,(英雄死了)

然后我们让一个在检测live属性的方法(即hero类的judge)中添加动画渲染的方法

在爆炸动画渲染结束后,将destory属性改为true

最后,全局的删除方法deleteComponent()方法会检测到这个值

然后销毁英雄

judge() {
          const currentTime = new Date().getTime();
          if (currentTime - this.lastTime > this.speed) {
            if (this.live) {
        //活着的时候渲染"活着"数组的图片 this.img
= this.frame.live[this.frameLiveIndex++ % this.frame.live.length]; } else {
        //死亡后渲染"死亡"数组的图片,即渲染爆炸动画 this.img
= this.frame.death[this.frameDeathIndex++]; if (this.frameDeathIndex === this.frame.death.length) { this.destory = true; } } this.lastTime = currentTime; } }

 

4.子弹类的collide方法

非常简单粗暴

collide() {
          this.destory = true;
        }

因为子弹不用考虑爆炸动画(有必要的话后期会做)

 

 

5.英雄类的collide()方法

collide() {
          this.live = false;
        }

 

来看看效果吧:

 

posted @ 2022-09-06 22:54  养肥胖虎  阅读(62)  评论(0编辑  收藏  举报