设置一个子弹数组:
const bullets = []
加载子弹素材
loader.add('bullet', 'images/bullet.png')
增加点击事件:
wx.onTouchEnd((result) => { if (!gameover) { const bullet = new Sprite(0, 0, res['bullet'], 0.1) bullet.setPosition(player.x, player.y)//子弹的坐标,就是player的坐标。 bullets.push(bullet) }})
step中,update减少:
bullets.map(bullet => { bullet.y -= 5;})
step中,draw减少:
enemys.map(enemy => { enemy.draw(context)})
当初,能够停火了。然而炮弹还没有碰撞检测:
在子弹的update中,加上碰撞检测
bullets.map((bullet, bullet_index) => { bullet.y -= 5; if (bullet.y <= bullet.height) { bullets.splice(bullet_index, 1) } else { enemys = enemys.filter((enemy) => { if (enemy.x + enemy.width * collision_buff > bullet.x && enemy.x < bullet.x + enemy.width * collision_buff && bullet.y + bullet.height * collision_buff > enemy.y && bullet.y < enemy.y + enemy.height * collision_buff) { bullets.splice(bullet_index, 1) } else { return enemy } }) }})
当初成果如下
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 = 0let enemys = []const bullets = []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.add('bullet', 'images/bullet.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_index) => { enemy.y++; if (enemy.y >= windowHeight) { enemys.splice(enemy_index, 1) } else { //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 } } }) bullets.map((bullet, bullet_index) => { bullet.y -= 5; if (bullet.y <= bullet.height) { bullets.splice(bullet_index, 1) } else { enemys = enemys.filter((enemy) => { if (enemy.x + enemy.width * collision_buff > bullet.x && enemy.x < bullet.x + enemy.width * collision_buff && bullet.y + bullet.height * collision_buff > enemy.y && bullet.y < enemy.y + enemy.height * collision_buff) { bullets.splice(bullet_index, 1) } else { return enemy } }) } }) } //draw player.draw(context) enemys.map(enemy => { enemy.draw(context) }) bullets.map(bullet => { bullet.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) } }) wx.onTouchEnd((result) => { if (!gameover) { const bullet = new Sprite(0, 0, res['bullet'], 0.1) bullet.setPosition(player.x, player.y) bullets.push(bullet) } })})
分数
let score = 0
在bullets的碰撞检测代码 bullets.splice(bullet_index, 1) 上面加上:
score += 1
在step的drew中减少:
context.font = 'normal 20px sans-serif';context.fillStyle = '#fff'context.fillText(score, 10, 30)
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 = 0let enemys = []const bullets = []let gameover = falseconst collision_buff = 0.8let score = 0function 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.add('bullet', 'images/bullet.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_index) => { enemy.y++; if (enemy.y >= windowHeight) { enemys.splice(enemy_index, 1) } else { //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 } } }) bullets.map((bullet, bullet_index) => { bullet.y -= 5; if (bullet.y <= bullet.height) { bullets.splice(bullet_index, 1) } else { enemys = enemys.filter((enemy) => { if (enemy.x + enemy.width * collision_buff > bullet.x && enemy.x < bullet.x + enemy.width * collision_buff && bullet.y + bullet.height * collision_buff > enemy.y && bullet.y < enemy.y + enemy.height * collision_buff) { bullets.splice(bullet_index, 1) score += 1 } else { return enemy } }) } }) } //draw player.draw(context) enemys.map(enemy => { enemy.draw(context) }) bullets.map(bullet => { bullet.draw(context) }) context.font = 'normal 20px sans-serif'; context.fillStyle = '#fff' context.fillText(score, 10, 30) 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) } }) wx.onTouchEnd((result) => { if (!gameover) { const bullet = new Sprite(0, 0, res['bullet'], 0.1) bullet.setPosition(player.x, player.y) bullets.push(bullet) } })})
成果如下: