javascript HTML5 canvas实现打砖块游戏


Posted in Javascript onJune 18, 2020

本文实例编写的一个小游戏,基于HTML5中的canvas。游戏主要是小球反弹击打小方块。在代码中主要实现了小方块的生成,键盘键事件的监听,小球的移动和碰壁之后的反弹以及怎样消除小方块等方法。代码使用到了一个js脚本库

游戏开发流程:

1、创建画布:

将画布放在div标签里面,这样可以控制画布居中的位置,再对div标签加上一些样式比如border和border-radius,这样一来使其看上去像手机,利于观看。

<div id="main">
 <!--将画布嵌在div块里面,使其可以居中-->
 <canvas id="liuming_canvas" width="300px" height="500px">
 </canvas>
</div>

2、创建移动的小木块:

定义一个可以用于移动的小方块,该移动小方块包含如下的属性,坐标位置,小方块的长和宽和小方块每次移动的距离。

var diamond = {
 x : 100, 
 y : 485,
 width : 100,
 height : 15,
 move : 10
}

3、创建用于击打的小球:

定义一个用于移动和击打小方块的小球,该小球包含如下的属性,小球的做坐标位置,半径,在x轴和y轴的速度。其中x轴和y轴的速度是为小球计算移动的方向和移动之后的坐标值。

var ball_impact = {
 x : 150,
 y : 465,
 r : 10,
 vx : 200,
 vy : 200
}

4、生成一系列的小方块:

生成一系列的小方块用于被小球击打,小球的生成主要是根据画布的大小和小方块的坐标与长宽以及各个小方块的x轴和y轴的间隔。

var diamond_impact = [];//定义存储击打小方块的数组
diamond_impact.length = 0;
var width_span = 25; // 任意两个小方块的横向间隔 
var height_span = 25; //任意两个小方块的水平间隔 
for(var i =1 ; i <=10 ; i++){//控制每行输出的小方块
 for(var j = 1 ; j < 10 ; j++){//输出每列的小方块 只有x轴和y轴的坐标不一样而已
 var diamond_impact_children = {
 x : width_span,
 y : height_span,
 width : 10,
 height : 10
 };
 width_span += 30;
 diamond_impact.push(diamond_impact_children); //将得到的小方块放在 diamond_impact 中,已被以后使用
 }
 height_span += 25;
 width_span = 25;
}

5、编写移动小方块的移动方法:

移动小方块的实现,首先需要监听获得键盘的事件,之后再根据获得的键盘事件来分别处理来向那个方向移动,在此处我分别定义了四个方向,目的是为了只在左右移动可能不能完全消灭小方块,
在移动的过程之中还要判断移动小方块的位置,以防止是否已经出界。在此处我分别定义了四个方法来处理各个方向的移动。

//键盘事件,获取当前在那个方向运动

var direction = "";
document.onkeydown = function (e) {
 if (e.keyCode == 37 ) direction = "left" ;
 if (e.keyCode == 39 ) direction = "right";
 if (e.keyCode == 38 ) direction = "up";
 if (e.keyCode == 40 ) direction = "down";
}
 
//定义四个方法来重绘制方块的位置 分别有 左、右、上、下

function move_right_diamond(){
 clear_diamond();//清除以前的方块
 init_canvas_background();//再次初始化画布 下同
 //重新绘制小方块的位置
 if(diamond.x + diamond.width >= canvas.width){ //判断方块是否已经到达最右端
 cxt.fillStyle = "#17F705";
 cxt.fillRect(diamond.x,diamond.y,diamond.width,diamond.height);
 }else{
 diamond.x += diamond.move;
 cxt.fillStyle = "#17F705";
 cxt.fillRect(diamond.x,diamond.y,diamond.width,diamond.height);
 }
}
//其余方法类似

6、编写小球移动的方法以及碰壁和接触移动小方块反弹的方法:

反弹:小方块的反弹,主要改变其x轴和y轴方向的速度,由于我们定义的是匀速运动,为此我们只需要改变其速度的方向。
移动:根据小球的速度和指定的移动大小来计算出新的小球坐标,之后再绘制新的小球。
反弹图片实例:(对于触碰墙壁反弹类似,就不多说)

小球移动的代码:

cxt.arc(ball_impact.x,ball_impact.y,ball_impact.r,0,Math.PI * 2,true);
cxt.closePath();
cxt.fill();
ball_impact.x += ball_impact.vx * cyc /1000;//改变其坐标的位置
ball_impact.y += ball_impact.vy * cyc /1000;

7、小球击打小方块,小方块消失的方法:

击打:小球击打小方框,主要判断小球和小方块的坐标位置即可。注意此处将会分别判断y轴和x轴将小球的击打的小方块限定在一个区域里面。
小时:击中当前小方块之后改变其长宽,之后重绘小方块即可,由于当前的小方块的长宽都为0,即绘制之后的小方块没有。
图解击打的坐标变化:

8、判断游失败和成功的方法:

失败:是要小球的掉到最低端即小球的Y坐标大于画布的Y坐标 就是失败;
成功:计数判断是否消灭的小方块数是否和指定的小方块数相同。

if(ball_impact.y + ball_impact.r >= canvas.height){
 cxt.fillStyle = "#FC0000";
 cxt.font = "bold 50px 微软雅黑";
 cxt.fillText("FAILURE!",30,250);
 diamond.move = 0;//不能移动板块
}

//判断是否与所有的小方块数相等
if(count_sum == 90){
 cxt.fillStyle = "#FCF205";
 cxt.font = "bold 50px 微软雅黑";
 cxt.fillText("SUCCESS!",20,250);//在画布上书写SUCCESS 
 diamond.move = 0;//不能移动板块
 ball_impact.vx =0;
 ball_impact.vy =0;
else{
 count_sum = 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
可输入的下拉框
Jun 19 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
Jan 23 Javascript
Javascript算符的优先级介绍
Mar 20 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
Mar 23 Javascript
js时钟翻牌效果实现代码分享
Jul 31 Javascript
bootstarp modal框居中显示的实现代码
Feb 18 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
Dec 26 Javascript
小程序ios音频播放没声音问题的解决
Jul 11 Javascript
Vue隐藏显示、只读实例代码
Jul 18 Javascript
AjaxFileUpload.js实现异步上传文件功能
Apr 19 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 Javascript
vue 解决provide和inject响应的问题
Nov 12 Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 #Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 #Javascript
JS简单编号生成器实现方法(附demo源码下载)
Apr 05 #Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
Apr 05 #Javascript
JavaScript图像延迟加载库Echo.js
Apr 05 #Javascript
超漂亮的Bootstrap 富文本编辑器summernote
Apr 05 #Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
Apr 05 #Javascript
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
js 设置选中行的样式的实现代码
2010/05/24 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
Python random模块用法解析及简单示例
2017/12/18 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
QML用PathView实现轮播图
2020/06/03 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
linux面试题参考答案(9)
2015/01/07 面试题
幼儿园家长会邀请函
2014/01/15 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
给老婆的检讨书
2015/01/27 职场文书
团支部书记竞选稿
2015/11/21 职场文书