增加gameover素材。

loader.add('enemy', 'images/gameover.png')

减少一个gameover变量:

let gameover = false

在敌人的循环中,减少碰撞检测代码:

if(enemy.x + enemy.width > player.x &&     enemy.x < player.x + enemy.width &&     player.y + player.height > enemy.y &&     player.y < enemy.y + enemy.height){        gameover = true}

在step中,减少:

if (gameover) {      context.drawImage(res['gameover'], windowWidth / 2 - res['gameover'].width / 4, windowHeight / 2 - res['gameover'].height / 4, res['gameover'].width / 2, res['gameover'].height / 2)      return}

当初game.js全副代码如下

import './libs/weapp-adapter'import './libs/symbol'import {  ResLoader,  Sprite} from './codetyphon/index'const context = canvas.getContext('2d')const {  windowWidth,  windowHeight} = wx.getSystemInfoSync()let time = 0const enemys = []let gameover = falsefunction rand(min, max) {  return Math.round(Math.random() * (max - min) + min);}const loader = new ResLoader()loader.add('player', 'images/player.png')loader.add('enemy', 'images/enemy.png')loader.add('gameover', 'images/gameover.png')loader.on_load_finish((res) => {  const player = new Sprite(0, 0, res['player'], 0.5)  player.setPosition(windowWidth / 2, windowHeight - player.height)  const step = (timestamp) => {    context.clearRect(0, 0, windowWidth, windowHeight)    if (gameover) {      context.drawImage(res['gameover'], windowWidth / 2 - res['gameover'].width / 4, windowHeight / 2 - res['gameover'].height / 4, res['gameover'].width / 2, res['gameover'].height / 2)      return    }    time += 1;    if (time % 150 == 0) {      const enemy = new Sprite(0, 0, res['enemy'], 0.5)      enemy.setPosition(rand(0, windowWidth), 0)      enemys.push(enemy)    }    player.update()    player.draw(context)    enemys.map(enemy => {      enemy.y++;      enemy.draw(context)      //collision      if (enemy.x + enemy.width > player.x &&        enemy.x < player.x + enemy.width && player.y + player.height > enemy.y &&        player.y < enemy.y + enemy.height) {        gameover = true      }    })    window.requestAnimationFrame(step);  }  window.requestAnimationFrame(step);  wx.onTouchMove(function (res) {    const x = res.changedTouches[0].clientX    const y = res.changedTouches[0].clientY    player.setPosition(x, y)  })})

当初成果如下:

gameover进去后,之前的游戏界面就没了。
所以须要对update和draw拆开:

const step = (timestamp) => {    context.clearRect(0, 0, windowWidth, windowHeight)    //update    if(!gameover){      time += 1;      if (time % 150 == 0) {        const enemy = new Sprite(0, 0, res['enemy'], 0.5)        enemy.setPosition(rand(0, windowWidth), 0)        enemys.push(enemy)      }      player.update()      enemys.map(enemy => {        enemy.y++;        //collision        if (enemy.x + enemy.width > player.x &&          enemy.x < player.x + enemy.width && player.y + player.height > enemy.y &&          player.y < enemy.y + enemy.height) {          gameover = true        }      })    }    //draw    player.draw(context)    enemys.map(enemy => {      enemy.draw(context)    })    if (gameover) {      context.drawImage(res['gameover'], windowWidth / 2 - res['gameover'].width / 4, windowHeight / 2 - res['gameover'].height / 4, res['gameover'].width / 2, res['gameover'].height / 2)    }    window.requestAnimationFrame(step);  }

当初成果如下:

然而游戏完结后,player居然还能够拖动。当初 wx.onTouchMove ~~~~这里再改一下:

wx.onTouchMove(function (res) {    if (!gameover) {      const x = res.changedTouches[0].clientX      const y = res.changedTouches[0].clientY      player.setPosition(x, y)    }})

当初是成果:

然而发现,其实飞机并没有碰上。为什么呢?

因为这里的碰撞检测仅仅是用矩形。而飞机素材是通明的,因而碰撞到的其实是图片矩形,而飞机素材有透明度,所以看起来仿佛没有碰撞到。这怎么办呢?

要么做像素级的碰撞检测,要么进行多边形像素检测。简单的碰撞检测当前再做,这里先设置一个宽度,既碰撞到肯定水平才确定为碰撞到。

当初,碰撞检测代码变为:

const collision_buff = 0.8if (enemy.x + enemy.width * collision_buff > player.x &&          enemy.x < player.x + enemy.width * collision_buff && player.y + player.height * collision_buff > enemy.y &&          player.y < enemy.y + enemy.height * collision_buff) {          gameover = true}

当初,game.js 代码如下:

import './libs/weapp-adapter'import './libs/symbol'import {  ResLoader,  Sprite} from './codetyphon/index'const context = canvas.getContext('2d')const {  windowWidth,  windowHeight} = wx.getSystemInfoSync()let time = 0const enemys = []let gameover = falseconst collision_buff = 0.8function rand(min, max) {  return Math.round(Math.random() * (max - min) + min);}const loader = new ResLoader()loader.add('player', 'images/player.png')loader.add('enemy', 'images/enemy.png')loader.add('gameover', 'images/gameover.png')loader.on_load_finish((res) => {  const player = new Sprite(0, 0, res['player'], 0.5)  player.setPosition(windowWidth / 2, windowHeight - player.height)  const step = (timestamp) => {    context.clearRect(0, 0, windowWidth, windowHeight)    //update    if (!gameover) {      time += 1;      if (time % 150 == 0) {        const enemy = new Sprite(0, 0, res['enemy'], 0.5)        enemy.setPosition(rand(0, windowWidth), 0)        enemys.push(enemy)      }      player.update()      enemys.map(enemy => {        enemy.y++;        //collision        if (enemy.x + enemy.width * collision_buff > player.x &&          enemy.x < player.x + enemy.width * collision_buff && player.y + player.height * collision_buff > enemy.y &&          player.y < enemy.y + enemy.height * collision_buff) {          gameover = true        }      })    }    //draw    player.draw(context)    enemys.map(enemy => {      enemy.draw(context)    })    if (gameover) {      context.drawImage(res['gameover'], windowWidth / 2 - res['gameover'].width / 4, windowHeight / 2 - res['gameover'].height / 4, res['gameover'].width / 2, res['gameover'].height / 2)    }    window.requestAnimationFrame(step);  }  window.requestAnimationFrame(step);  wx.onTouchMove(function (res) {    if (!gameover) {      const x = res.changedTouches[0].clientX      const y = res.changedTouches[0].clientY      player.setPosition(x, y)    }  })})

成果如下