flappy pig小游戏源码分析(1)——主程序初探
闲逛github发现一个javascript原生实现的小游戏,源码写的很清晰,适合想提高水平的同学观摩学习。读通源码后,我决定写一系列的博客来分析源码,从整体架构到具体实现细节来帮助一些想提高水平的朋友。源码地址为:https://github.com/keenwon/flappy-pig
需要提醒大家的是,我的分析模式是,先给出源码,加上注释让大家通读一遍,然后分解源码逐步分析。
下载了作者的源码后先看一下目录结构:
其中作者使用了Grunt进行了打包,会使用的grunt的小伙伴一看这个目录肯定一目了然,如果你从来没有使用过任何前端构建工具,别担心,你只用关注src文件夹就可以了,打开src文件夹,内容如下:
这就是游戏的全部组成部分了,我们只关心具体的控制逻辑,所以直接进入js文件夹:
var flappy = (function (self) {
'use strict';//开启严格模式,新手可以暂时忽视 var controller = self.controller,//获取控制者对象,之后详细介绍
option = self.option,//获取配置值,之后详细介绍
pig = self.pig,//获取小猪模块,之后详细介绍
pillar = self.pillar,//获取柱子模块,之后详细介绍
pos = self.position,//获取位置模块,之后详细介绍
util = self.util,//获取工具模块,之后详细介绍
$ = self.util.$;//从util.js中我们可以看出,$方法可以通过id获取DOM元素 //主程序
self.game = {//给self对象添加game属性,该属性指向一个对象
init: function () {//game对象的init方法
var t = this;//this指向函数调用者,非特殊情况下(不使用call、apply或者直接调用),一般我们就先认为指向了game对象,因为从后面我们也可以看到,作者也是通过flappy.game.init()调用的。 t._isStart = false;//game有一个isStart属性,用于标识游戏是否开始,初始值为false
t._isEnd = false;//game有一个isEnd属性,用于表示游戏是否结束,初始值为false
t._timer = null;//game对象有一个定时器,初始化为null pig.init(t.fall, t);//调用pig模块的init方法,将game.fall方法和game对象传递过去
pillar.init();//调用pillar模块的init方法
pos.init(t.hit, t);//调用pos模块的init方法,将game.hit方法和game对象传递过去 t.addKeyListener();//将this指向game,给game对象添加键盘监听
},
addKeyListener: function () {//监听键盘事件
var t = this;//this指向函数调用者,从上面可以看到调用者是game
document.onkeydown = function (e) {//监听键盘按下事件
e = e || window.event;//获取事件对象,兼容IE
var currKey = e.keyCode || e.which || e.charCode;//获取按了哪一个按键,兼容各家浏览器
if (currKey == 32) {//如果按下了空格
if (!t._isEnd) {//如果游戏没有结束
t.jump();//那么调用game.jump()方法
} else {
window.location.reload();//如果游戏已经结束,按空格后刷新页面,重新开始
}
util.preventDefaultEvent(e);//阻止事件的默认行为,具体细节在util.js中,我会在相应章节分析
}
};
},
jump: function () {//这里就是game.jump()方法
var t = this;//指向game对象
if (!t._isStart) {//如果游戏没有开始
$('start').style.display = 'none';//将游戏开始界面隐藏
t._createTimer(function () {//调用game._createTimer方法,创建定时器,每二十毫秒执行一次
pig.start();//调用pig模块的start方法,让小猪开始移动,具体细节在pig.js中,我会在相应章节分析
pillar.move();//,调用pillar模块的move方法,让柱子移动,具体细节在pillar.js中,我会在相应章节分析
pos.judge();//调用pos模块的judge方法,判断位置,具体细节在position.js中,我会在相应章节分析
$('score').innerHTML = pillar.currentId + 1;//设置记分板分数
});
t._isStart = true;//设置游戏状态为已开始
} else {
pig.jump();//如果游戏已经开始,那么直接调用pig.jump方法
}
},
hit: function () {//game对象的hit方法
var t = this; t.over();//调用game.over方法,游戏结束
pig.hit();//调用pig模块的hit方法,具体细节在pig.js中,我会在相应章节分析
},
fall: function () {//game对象的fall方法
var t = this; t.over();//调用game.over方法,游戏结束
pig.fall();//调用pig模块的fall方法,具体细节在pig.js中,我会在相应章节分析
},
over: function () {//game对象的over方法,负责结束游戏
var t = this;//获取game对象
clearInterval(t._timer);//取消计时器
t._isEnd = true;//将标识游戏是否结束的变量设置为true
$('end').style.display = 'block';//游戏结束的提示显示出来
},
_createTimer: function (fn) {//game对象的_createTimer方法,创建定时器
var t = this;//获取game对象 t._timer = setInterval(fn, option.frequency);//实现定时器,频率为配置项中的frequency属性,具体细节在option.js中,我会在相应章节介绍
}
}; flappy.init = function () {//暴露接口
self.game.init();//game.init()函数中this指向game
}; return self;//返回self对象,实际上也就是给原本的flappy对象加了点东西 })(flappy || {});
flappy pig小游戏源码分析(1)——主程序初探的更多相关文章
- flappy pig小游戏源码分析(4)——核心pig模块(未完待续)
热身之后,我们要动点真格的了,游戏叫flappy pig,我们的pig终于要出场了. 老规矩,看看目录结构,读者对着目录结构好好回想我们已经讲解的几个模块: 其中game.js是游戏主程序,optio ...
- flappy pig小游戏源码分析(3)——解剖util
这一节我们继续高歌猛进,如果对源码中有无论无何都理解不通的问题,欢迎和我交流,让我也学习一下,我的qq是372402487. 还是按照惯例看看我们的目录结构. 我们在前两节中已经分析了game.js, ...
- flappy pig小游戏源码分析(2)——解剖option
今天继续分析flappy bird的源码.重温一下源码的目录结构. 在本系列第一篇中我们分析了game.js文件,也就是整个程序的架构.这一篇我们来看看option.js文件,这个文件的内容很简单,主 ...
- xss小游戏源码分析
配置 下载地址:https://files.cnblogs.com/files/Lmg66/xssgame-master.zip 使用:下载解压,放到www目录下(phpstudy),http服务下都 ...
- HTML5小游戏源码收藏
html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js ...
- Creator仿超级玛丽小游戏源码分享
Creator仿超级玛丽小游戏源码分享 之前用Cocos Creator 做的一款仿超级玛丽的游戏,使用的版本为14.2 ,可以直接打包为APK,现在毕设已经完成,游戏分享出来,大家一起学习进步.特别 ...
- HashMap的小总结 + 源码分析
一.HashMap的原理 所谓Map,就是关联数组,存的是键值对——key&value. 实现一个简单的Map,你也许会直接用两个LIst,一个存key,一个存value.然后做查询或者get ...
- h5小球走迷宫小游戏源码
无意中找到的一个挺有意思的小游戏,关键是用h5写的,下面就分享给大家源码 还是先来看小游戏的截图 可以用键盘的三个键去控制它,然后通关 下面是源代码 <!doctype html> < ...
- C\C++ 1A2B小游戏源码
学了一段时间,心血来潮写了一个1A2B小游戏,很多人应该玩过,是一个挺有意思的益智小游戏,之前用易语言写过,现在又用C++重写了一下. 编译运行无错,整体程序设计思路为:进入循环,初始化游戏,读入一个 ...
随机推荐
- CListCtrl使用方法汇总
回顾: 刚刚写完,因为是分期写的,所以最初想好好做一下的文章格式半途而废了~说的也许会有点啰嗦,但是所有的基础用到的技术细节应该都用到了. 如果还有什么疑问,请回复留言,我会尽力解答. 如果有错误,请 ...
- Python自带包建立简单web服务器
在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m SimpleHTTPServer 8080 然后就可 ...
- svn:revert to this version 和 revert changes from this version的区别
假设我们有许多个版本,版本号分别是1-10 如果我们在7这里选择revert to this version那么7之后的8,9,10的操作都会被消除 如果在7选择revert changes from ...
- D3D中深度测试和Alpha混合的关系
我在学习D3D的深度测试和Alpha混合的时候,有一些遗憾.书上提供的例子里说一定要先渲染不透明物体,再渲染透明物体,对渲染状态的设置也有特殊要求.我看的很晕.自己查图形学的书,上网找资料,结果还是糊 ...
- JS 原型链学习总结
废话篇: 在js的学习过程中有一大难点就是原型链.学习的时候一直对这一内容不是十分的明白.纠结的我简直难受.,幸好总算给他弄通了,哇咔咔,总算可以不用在睡梦中还想着他了. 正文篇: 要了解原型链我们首 ...
- Android 实现布局动态加载
Android 动态加载布局 通过使用LayoutInflater 每次点击按钮时候去读取布局文件,然后找到布局文件里面的各个VIEW 操作完VIEW 后加载进我们setContentView 方面里 ...
- HDU 1869 六度分离【floyd】
题意:给出n个人,m个关系,问是否满足任意两个人之间的距离通过6个人就可以连接 用floyd就可以了,注意距离是大于7 #include<iostream> #include<cst ...
- IOS中封装一个View的思路
一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...
- matlab数据的导入和导出,以matlab工作区workspace为source和destination
MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入. 保存工作区可以通过菜单进行,也可以通过命令窗口进行. 数据导出 1. 保存整个工作区 选择Fil ...
- shell 括号学习
http://blog.csdn.net/tttyd/article/details/11742241 http://tldp.org/LDP/abs/html/loops1.html