使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码


Posted in Javascript onApril 07, 2015

源码下载

源码我已经上传到 CSDN 了,无需资源分,下载地址:http://download.csdn.net/detail/zgynhqf/8565873。

源码使用 VS 2013 +TypeScript 1.4 进行开发。打开后,显示如下图:

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

JsTankGame 1.0:老的使用 JS 编写的坦克游戏。

JsTankGame 2.0:新的使用 TS 直接翻译过来的游戏。

JsTankGame:在 2.0 的基础上,对类型进行了重构后的新游戏。

重构步骤

由于老的 JS 游戏是采用 MS Ajax Client Library 构建,并且采用了 OOD 的方式来进行设计,再加之 TypeScript 可以兼容 JS 的全部代码。所以使用 TypeScript 来移植的工作也比较简单,主要是替换类型设计的代码:类、继承、接口等。

完成以上工作后,也就得到了使用 TS 编写的 2.0 版本。过程中体会到了强类型语言的诸多好处,当然也有一些 TS 目前并不完善的地方(后面会说)。

得到了强类型的 2.0 版本后,并没有结束。为了体验强类型对于重构的好处,我决定在这个版本之上做代码结构上的重构。

有了强类型编写的代码,我可以很方便地分析出每一个类型、每一个方法,具体在哪些地方被使用。这样,我就能很快地知道类型之间的依赖关系。不看不知道,一看吓一跳。之前一点一点随心写的代码,本以为类型设计得还不错,之间耦合性应该不是很高。但是图画完之后,才发现与想象中差点很远,这就是没有画图直接编写代码的结果,见下面两张图:

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

可以看出各精灵类型之间的关系是比较乱的,双向依赖随处可见。(其实图中因为把 SpriteManager 画到了另外一张图,所以没有显示出更复杂、更乱的关系。)

据此,我绘制了新的关系图,然后按照此关系来重构了所有的代码。这样就得到了最新的 3.0 版本。使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

新版本的类型关系图如下:

分层:

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

精灵:

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

管理器:

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

代码层面,主要是把各精灵之间耦合的代码,都移植到了上层的管理器中。同时,为精灵定义事件来解除精灵与管理器的直接耦合。

 TS 首次体验中感受的优缺点

优点: Lambda 非常好地解决了 this 指针的问题。 Chrome、IE 都能直接调试 TypeScript! 过程中还发现了弱类型无法发现的错误。因为重命名,还没有修改原来的代码。(SpriteManager.js 98 行)

缺点: 开发环境-还没有集成代码注释功能,只能手动拷贝。 开发环境-目前还不支持 Code Snippets。 开发环境-不支持关键字代码生成:if、while、swith、括号匹配等。 开发环境-不支持代码区域的定义(Region)。 语法-不支持事件的定义。 语法-暂时还不支持为类定义重载方法。见 SpriteBase.IsCollided 方法。

其它:

编译出的 JS 代码有一定的冗余。命令空间处显得特别明显。 重写基类方法,没有提示。 基类的属性获取器/设置器无法重写。 无法分辨哪些方法是虚方法。 接口中不能定义只读的属性。 还存在 BUG。(SpriteManager.ts line 93)。 简单定义一个数字类型的字段的话,默认值并不是 0,而是 NaN。

总结 

总体说来,经过试用,我感觉 TS 到目前的 1.4 版本,已经可以用于正式的大型 JS 项目开发。但是还有很多地方需要改进! 

附 Chrome、IE 调试 TS 截图:

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码

以上所述就是本文的全部内容了,希望能够对大家熟练掌握typescript有所帮助。

Javascript 相关文章推荐
JavaScript对象模型-执行模型
Apr 28 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
Nov 06 Javascript
详解javascript事件绑定使用方法
Oct 20 Javascript
JS实现倒计时(天数、时、分、秒)
Nov 16 Javascript
Vue如何实现组件的源码解析
Jun 08 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
jquery在vue脚手架中的使用方式示例
Aug 29 jQuery
Vue.JS项目中5个经典Vuex插件
Nov 28 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
JS实现扫雷项目总结
May 19 Javascript
Vue+Flask实现图片传输功能
Apr 01 Vue.js
TypeScript具有的几个不同特质
Apr 07 #Javascript
实现前后端数据交互方法汇总
Apr 07 #Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 #Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 #Javascript
javascript实现画不相交的圆
Apr 07 #Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 #Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
Apr 06 #Javascript
You might like
PHP4实际应用经验篇(5)
2006/10/09 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
浅谈Python处理PDF的方法
2017/11/10 Python
Python模块搜索路径代码详解
2018/01/29 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
python的range和linspace使用详解
2019/11/27 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
Python学习之time模块的基本使用
2021/01/17 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
语文教育专业推荐信范文
2013/11/25 职场文书
服装机修工岗位职责
2013/12/26 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
党支部四风整改方案
2014/10/25 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python