从头开始构建web前端应用——字符炸弹小游戏(二)

  接上篇。欢迎指正。

  现在,需要考虑如何拆分文件。

  拆分文件的目的,是为了方便代码管理。很显然,样式表,网页源文件,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:&nbsp;<span id="points">0</span>
</a>
<a>
miss:&nbsp;<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.既然是游戏,没有背景音乐怎么行?如何引入背景音乐?如何控制音乐的播放?

    每消除一个字符,都只是简简单单消除了,能不能在解决上一问题的基础上再修改下,使字符在消除时能够显示一小团焰火并发出爆裂声?

从头开始构建web前端应用——字符炸弹小游戏(二)

时间: 2024-08-06 09:43:00

从头开始构建web前端应用——字符炸弹小游戏(二)的相关文章

从头开始构建web前端应用——字符炸弹小游戏(一)

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

移动web前端的一些硬技能(二)动手前必须掌握的基本常识

记得刚开始接触移动端web的时候,书和网上的资料都不多,查起来很费劲,现在比以前要好很多了,可是还是会有一些刚接触移动端的朋友会问我一些我最初会遇到的问题,或许是书本写的并不那么重,也或许是这些知识写的太散,以至于大多数人并没有很好的注意到. 其实做移动web前端,大多数和pc端的web前端基本一样,只是有一些东西需要注意一下,否则带来的麻烦就不是一星半点了. 一.viewport 如果看过移动端web代码的应该都会看到类似于这一句<meta name="viewport" co

Gulp自动构建Web前端程序

这两天一个朋友在项目上碰到了一个这样的问题,在运营过程中,用户在浏览器上对某个表单进行数据提交时,需要引入新的平台接口数据的业务,通过评估,开发团队马上修改了相关后台代码和部分的前端脚本代码,通过简单测试并很快上线.当是上线后客户端的功能没有发生任何变化和修改前表现的状况是一样.遇到这样的问题,开发团队一时有点迷糊,明明是修改了功能并进行了部署却没有让用户使用到该功能,不知道该如何下手了. 有过一定前端开发经验的朋友应该知道这是浏览器缓存Web资源导致的问题,针对这样的实际问题,项目上应该有自己

腾讯WEB前端开发面试经历,一面二面HR面,面面不到!

[一面]~=110分钟  2014/09/24 11:20  星期三 进门静坐30分钟做题. 填空题+大题+问答题 >>填空题何时接触电脑 何时接触前端运算符 字符串处理        延时 display        position        XMLHttpRequest        正则Jquery绑定事件        cookie >>大题BOM浏览器信息浏览器兼容性举例闭包作用与举例新闻ul列表,插入3个,获取index全文单词首字母大写ajax过程 >&

编写高质量代码:Web前端开发修炼之道(二)

第四章:高质量的css 1)怪异模式和标准模式 在标准模式中,浏览器根据规范表现页面:而怪异模式通常模拟老式浏览器的行为以防止老站点无法工作. 他们两者之间的差异比较典型的表现在IE对盒模型的解析:在标准模式中,网页元素的宽度=padding+border+width;而在怪异模式中,width本身就包括了padding和border. 在怪异模式中:设定width,然后margin:0 auto;是无法居中的.标准模式中可以正常工作. 于是我们尽量避免怪异模式,而选用标准模式,这样就出现了DT

Web前端开发中的小错误

错误1:表单的label标签跟表单字段没有关联 利用“for”属性允许用户单击label也可以选中表单中的内容.这可以扩大复选框和单选框的点击区域,非常实用. 错误2:logo图片没有链接到主页 点击网站logo就能转到主页已经成为了网民的条件反射.此外,值得一提的是,logo是指定放于左上角的. 错误3:不能区分是否已经访问过该链接 访问过的连接状态应该与没有访问过的有所区别,以便于让用户直观地明白哪个链接已经点击过了. 错误4:没有突出当前选中激活的表单项 可以使用“focus”展现选中的文

web前端35个jQuery小技巧!

废话不说 直接代码,有问题可以一起交流 1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 Hide when clicked in the search field, the value.(example can be found below in the comment fields) $(docu

Web前端:博客美化:二、鼠标特效

1.获取JS权限 因为是js代码所以需要放在 侧边栏公告 里 没开通之前,有一个申请的链接,点击即可,我是第二天才看到过审的 ^-^ 2.Ctrl+C.Ctrl+V 数组里的文字随自己心情啦 另:3000是文字消失的速度,数值越大跑的越慢 <!--鼠标点击特效--> <script type="text/javascript"> var a_idx = 0; jQuery(document).ready(function($) { $("body&qu

鲨鱼炸弹小游戏总结

2/3D游戏:2.5D 辅助插件:原生 游戏制作难度系数:初级 游戏教程网址:http://www.raywenderlich.com/4551/how-to-make-a-2-5d-game-with-unity-tutorial-part-1 1.背景自适应(GUITexture)正交模式 void Start() { GUITexture gui = GetComponent<GUITexture>(); // GUITexture的pixelInset值分别为: //width: 51