接上篇。欢迎指正。
现在,需要考虑如何拆分文件。
拆分文件的目的,是为了方便代码管理。很显然,样式表,网页源文件,js代码需要放在不同的地方。另外,对于前端开发来说,主要的逻辑控制流程,都在js文件里面,所以,还需要拆分js文件。我个人习惯上按功能模块来拆分。在拆分前,你需要仔细思考一下,每一个函数和其他函数之间的关联度,尽量做到相关功能函数在一个文件里。
ok,开工。在html所在文件目录下创建2个新文件夹,分别命名为css,js。
1.拆分css。
css样式表写的不多,直接在css文件夹下创建文件,名称姑且叫做main.css
直接把<style>标签里面的内容copy到该文件下,注意,别把标签copy进来了。
.showBox { border: 1px solid #000; }
然后,在页面首部<head>标签里添加一行代码,将css样式表引入:
<head> <link href="css/main.css" rel="stylesheet" type="text/css"/> </head>
2.拆分js文件
很显然字符对象是单独的一部分内容,把这个对象的构造器和挂载到原型上的方法挑出来,组成单独文件。另外,产生随机字符这个函数也只有这个对象会用到,也一并加入进来。文件名不妨定为randomnum.js
/* * 字符对象构造器 */ function CharObj() { var _self = this; _self.chars = null; _self.top = 0; _self.left = 0; _self.v = 0; _self.color = null; } /* * 初始化字符对象数据 */ CharObj.prototype.init = function () { var _self = this; _self.chars = ranChars(); _self.top = 0; _self.left = ranInt(500); _self.v = ranInt(10) + 5; var r = ranInt(100) + 140; var g = ranInt(100) + 100; var b = ranInt(100) + 50; _self.color = "rgb(" + r + "," + g + "," + b + ")"; } /* * 下落 */ CharObj.prototype.move = function () { var _self = this; _self.top += _self.v; } /* * 绘制 */ CharObj.prototype.draw = function () { var _self = this; context.font = ‘bold 30px 幼圆‘; context.fillStyle = _self.color; context.fillText(_self.chars, _self.left, _self.top); } /* * 产生随机字符 */ function ranChars() { var _num = ranInt(allchars.length); return allchars[_num]; }
还有一些变量的声明部分,也可以单独拎出来,文件名命为config.js。应该说命名不是很规范,暂且这么用再说。
var samllchars = "abcdefghijklmnopqrstuvwxyz"; var nums = "0123456789"; var allchars = samllchars + nums; var showBox = document.getElementById("showBox"); var context = showBox.getContext(‘2d‘); var pointSpan = document.getElementById("points"); var missSpan = document.getElementById("miss"); var showCharObjs = []; var points = 0; var pointFlag = false; var misspoints = 0;
还有一些零散的函数,比如,初始化画布,产生随机数,在画布上显示(包括字符队列的添加删除移动等),一并作为通用函数组成单独文件,文件名命为commonfunction.js
/* * 初始化画布 */ function initCanvas() { showBox.setAttribute("width", "600px"); showBox.setAttribute("height", "400px"); } /* * 产生新字符 */ function proNewCharObj() { var _charObj = new CharObj(); _charObj.init(); showCharObjs.push(_charObj); } /* * 循环移动并显示字符 */ function moveAndDrawCharObj() { context.clearRect(0, 0, 600, 400); context.fillStyle = "#000000"; context.fillRect(0, 0, 600, 400); var deleList = []; for (var i = 0; i < showCharObjs.length; i++) { showCharObjs[i].move(); if (showCharObjs[i].top >= 400) { deleList.push(showCharObjs[i].chars); } showCharObjs[i].draw(); } if (deleList) { for (i = 0; i < deleList.length; i++) { deleCharObj(deleList[i]); misspoints++; } missSpan.innerHTML = misspoints; } } /* * 删除字符队列里的字符 */ function deleCharObj(cobj) { var arr = []; for (var i = 0; i < showCharObjs.length; i++) { if (showCharObjs[i].chars != cobj) { arr.push(showCharObjs[i]); } else { pointFlag = true; } } showCharObjs = arr; } /** * 根据键码寻找对应字符 * @param ewhich * @returns {*} */ function getc(ewhich) { var c = ewhich; if (c >= 48 && c <= 57) { c = nums[c - 48]; } else if (c >= 65 && c <= 90) { c = samllchars[c - 65]; } return c; } /** * 统计得分 * @param c */ function countPoint(c) { pointFlag = false; deleCharObj(c); if (pointFlag) { points++; pointSpan.innerHTML = points; } } /* * 产生随机整数 */ function ranInt(num) { return Math.floor(Math.random() * num); }
最后剩下和网页正常运行的主要调用和交互声明函数,单独组成main.js:
initCanvas();
setInterval(proNewCharObj, 1000);
setInterval(moveAndDrawCharObj,
100);
document.onkeydown = function (e) { var c = getc(e.which); countPoint(c); }
ok,到此,文件拆分的问题基本解决。拆分后的文件结构为:
现在,在html文件最后的地方引入js文件,整个html文档改成如下所示:
<html> <head> <link href="css/main.css" rel="stylesheet" type="text/css"/> </head> <body> <div> <a> points: <span id="points">0</span> </a> <a> miss: <span id="miss">0</span> </a> </div> <canvas id="showBox" class="showBox"> </canvas> <br/> <script type="text/javascript" src="javascript/config.js"> </script> <script type="text/javascript" src="javascript/randomnum.js"> </script> <script type="text/javascript" src="javascript/commonfunction.js"> </script> <script type="text/javascript" src="javascript/main.js"> </script> </body> </html>
我觉得,到这里,应该需要了解:
怎么去拆分文件,怎么在html中引入外部文件。
现在,不妨思考一下,
1.为什么css文件的引入位置在网页比较靠前的位置,而把js文件的引入位置放在比较靠后的位置。
2.拆分了好几个js文件出来,这些js文件的引入次序有没有硬性要求,交换次序之后会怎样。
3.把js中所有全局变量放在同一个js文件中是否合适,是否有更好的方案。
这些问题一试便知,也都很容易在搜索引擎上找到答案,不再赘述。
再来考虑一下之前上一篇遗留的一个问题:
1.如何设置配置项并修改之,这一部分可以做成游戏难度设置模块
再加一个问题:
2.既然是游戏,没有背景音乐怎么行?如何引入背景音乐?如何控制音乐的播放?
每消除一个字符,都只是简简单单消除了,能不能在解决上一问题的基础上再修改下,使字符在消除时能够显示一小团焰火并发出爆裂声?