跳转到主内容
思享编程网:思考分享,玩转编程世界!

原生JS 实现小游戏 打砖块

文章目录 1. 概述 2. 游戏场景 3. 实现砖块布局 4.小球和挡板 5.挡板运动 6.挡板边界 7.小球运动 8.小球边界 9.碰撞检测 (重点复杂点) 10.音效处理 1. 概述 这是一个游戏,这不仅仅是一个游戏,我们的目标不是为了开发游戏,而是为了掌握常见函数和基本开发思路 (多练多练) 实现代码之前 先有思路 实现具体的功能 和进行不断的调式 以下是本人在培训时期老师写的代码 思路图为老师所画 2. 游戏场景 场景为css 和 html 组成 直接上代码 代码如下

打砖块

网页效果如下:

3. 实现砖块布局 技术准备:

代码实现:

// 让js代码在网页加载后执行

window.onload = function () { //获取场景对象

var _box = document.querySelector("#box"); // ----------------------- 砖块处理部分 //定义行数 var rows = 3; //计算一行放多少砖块 var cols = Math.floor(_box.offsetWidth / 100);

//声明一个保存砖数的数组 var brickArrs = [] //循环 创建砖块 for (var i = 0; i < rows; i++) { //循环创建多行

for (var j = 0; j < cols; j++) { //循环创建一行中的多个砖块

//创建砖块 p 标签 var _p = document.createElement("p"); _p.style.backgroundColor = "#" + Math.random().toString(16).substr(2, 6);

//p 标签定位;位置 _p.style.left = j * 100 + "px"; _p.style.top = i * 40 + "px";

//将砖块添加到场景中 _box.appendChild(_p);

//将砖块保存到数组中 brickArrs.push(_p) } }

网页实现效果:

4.小球和挡板

代码详情在第一段里 5.挡板运动 技术实现: 让挡板运动起来 用左右方向键控制

代码实现:

//-----------挡板运动

var _baffle = document.querySelector("#baffle") var _speed = 20

document.onkeydown = function(e) { //获取事件对象 var e = e || window.event

//判断用户按下的按键 var keyCode = e.keyCode

//用户按下,控制挡板运动 switch(keyCode) { case 37: console.log("向左移动") _baffle.style.left = _baffle.offsetLeft - _speed + "px" break case 39: console.log("向右移动") _baffle.style.left = _baffle.offsetLeft + _speed + "px" break }

6.挡板边界 左右不超出场景边缘 代码实现:

//挡板边界判断,挡板不能超出边界

if(_baffle.offsetLeft < 0) { _baffle.style.left = 0 }else if(_baffle.offsetLeft >= (_box.offsetWidth - _baffle.offsetWidth)){ _baffle.style.left = (_box.offsetWidth - _baffle.offsetWidth) + "px" } }

网页实现效果:

7.小球运动 需求:小球在游戏区域可以运动起来,碰撞墙壁的时候需要反弹 分析图如下图

代码实现:

//----------小球运动

var _ball = document.querySelector("#ball") var speedX = 3 //垂直速度 var speedY = -5 //水平速度 // ballInterval 全部间隔 //setInterval 设置间隔 var ballInterval = setInterval(function () { //小球运动起来 _ball.style.left = _ball.offsetLeft + speedX + "px" _ball.style.top = _ball.offsetTop + speedY + "px"

8.小球边界 需求:小球不能碰撞下边界,一旦碰撞到下边界游戏结束;下边界上必须让小球碰撞到挡板进行反弹 分析图解:

代码实现:

//边界判断

if(_ball.offsetLeft < 0 ) {//左边界 speedX = 3 }else if(_ball.offsetLeft > (_box.offsetWidth - _ball.offsetWidth)) { speedX = -3 }

if(_ball.offsetTop < 0 ) { //上边界 speedY = 5 } else if( ( _ball.offsetLeft >= (_baffle.offsetLeft - _ball.offsetWidth/2)) && (_ball.offsetLeft <= (_baffle.offsetLeft + _baffle.offsetWidth - _ball.offsetWidth/2)) && (_ball.offsetTop >= (_baffle.offsetTop -_ball.offsetHeight)) ) { // 碰到挡板 speedY = -5

}else if(_ball.offsetTop > (_box.offsetHeight - _ball.offsetHeight)){ clearInterval(ballInterval)// clearInterval 清除间隔 alert("你漏球了,结束") //弹窗 阻止代码执行 计时器仍然执行 location.reload()//重新加载当前位置 刷新网页 }

9.碰撞检测 (重点复杂点) 小球和砖块之间的碰撞检测,小球碰到砖块,砖块消失/小球反弹, 具体操作如图

如果碰撞过程中,按照每一个碰撞面去检测,很容易存在 BUG 代码中通过上下碰撞面、左右碰撞面进行同时检测,检测小球坐标一旦进入砖块 内部就算碰撞成功,让砖块消失/代码中通过 DOM removeChild() 函数移除标签,小球的运动反弹 左右碰撞面-水平速度取反、上下碰撞面-垂直速度取反 代码实现:

//判断小球是否和砖块发生碰撞 for(var x = 0; x < brickArrs.length; x++) { //获取一个砖块 var brick = brickArrs[x] //碰撞检测 collide(brick, _ball) }

}, 20)

//--------------------- 碰撞检测:小球、砖块 // brick :砖块 // ball:小球 function collide(brick, ball) { console.log("--------------------------------------") // console.log(brick.offsetLeft, brick.offsetTop, brick.offsetWidth, brick.offsetHeight, "砖块") // console.log(ball.offsetLeft, ball.offsetTop, ball.offsetWidth, ball.offsetHeight, "小球") console.log("--------------------------------------") // 底部碰撞、左侧碰撞、顶部碰撞、右侧碰撞 if( //offset 抵消 (ball.offsetLeft > (brick.offsetLeft - ball.offsetWidth/2)) && (ball.offsetLeft < (brick.offsetLeft + brick.offsetWidth - ball.offsetWidth/2)) && (ball.offsetTop < (brick.offsetTop + brick.offsetHeight)) && (ball.offsetTop > (brick.offsetTop - brick.offsetHeight)) ) { // 底部碰撞 或者 顶部碰撞 // 碰撞发生,砖块:消失,小球:反弹 console.log("碰撞发生,砖块消失,小球反弹.....") speedY = -speedY // 垂直速度取反 _box.removeChild(brick) } else if( //offset 抵消

(ball.offsetTop > (brick.offsetTop - ball.offsetHeight/2)) && (ball.offsetTop < (brick.offsetTop + brick.offsetHeight - ball.offsetHeight/2)) && (ball.offsetLeft > (brick.offsetLeft - ball.offsetWidth)) && (ball.offsetLeft < (brick.offsetLeft + brick.offsetWidth)) ) { // 左侧碰撞 或者 右侧碰撞 speedX = -speedX _box.removeChild(brick) boom() }

}

10.音效处理 当小球和砖块发生碰撞时 创建 audio 标签 设置 src 属性,添加音效文件 不设置 autoplay=true 自动播放 碰撞时调用 audio.play() 播放音效即可 代码如下:

// 音效处理

var _audio = document.createElement("audio") _audio.src = "./img/y993.wav" // _audio.autoplay = true document.appendChild(_audio)

function boom() { _audio.play() }

整体代码如下:

Document

打砖块

网页效果展现如下图:

相关文章