从这一篇开始,就来开始我们的make things move之旅吧

  在此之前,要知道ActionScript(AS)的语法和JS是不一样的,AS是相对于JS而言更好的支持了面向对象的特性,所以我们可以自己实现一些简单的工具类,让我们更快速的构建我们的工程。不过我们不用全部实现AS中的东西,我们只用实现最基本的类的构造,类的继承和其他一些实用的工具函数就好了。

  其实我还想说的是,我们还是要实现AS的Sprite类和stage,因为这两个东西是实现AS动画最基本的元素,html5 canvas提供的js api还是比较低级的,我们可以简单的封装一下实现AS的sprite 和stage,不过这两个东西还是等后续讲有关动画的原理再来细说吧。另外,其实现在已经有很多开源的HTML5游戏框架,可以直接使用,而且已经很成熟社区也好,比如现在很火的cocos2d-html5,我不是很赞成自己造轮子写一个,不过如果是出于学习目的还是可以一试的,因为这样也比较容易理解框架底层的东西,和提高你的JS水平。话题跑远了……

  文件目录结构

  推荐模仿linux的文件结构吧,随便在哪放你的工程

   创建一个/mtm的文件夹,此文件夹的根目录下:
|-- index.html
|-- /css
|-- /js
|-- /bin 此目录旋转最终的用于执行的js文件
|-- /lib 放置库工具
|-- /etc 放置配置文件
|-- /mtm make things move 工程的主要例子的实现类

工具方法

  一在js/lib/目录下创建一个sys.js的文件

  然后实现我们的第一个构造类的工具方法:__class__。我写多了python,深受python类构造模式的影响(同样的我也不分号党,只有在写java或其他静态语言的时候),双下划线是表示系统内置属性或方法的意思,这只是我自己的习惯,读者可以根据自己的习惯来写,不过建议有一个好的规范,我的在JS里就不算是什么好的。读者也可自己实现一个可构造类并能实现继承的方法,我的实现如下:

// 参数不定,最后一个参数必须是实现的方法的json,前面的都是要继承的类
// opts中的__init__方法则为新类的构造函数
// example: var NewClass = __class__(Class1, Class2, {__init__: function () {}, }) this.__class__ = function (/*Class1, Class2,..., opts*/) {
var args = Array.prototype.slice.call(arguments),
opts
if (typeof args[args.length - 1] === 'function')
opts = {}
else
opts = args.pop()
var clss = opts.__init__ || function () {},
name = opts.__name__ || __filename__(__file__()) //获取当前js文件的名称作为这个类的类名,也可在opts中定义__name__
for (var i = 0, parent; parent = args[i]; i++)
__copy__(parent.prototype, clss.prototype)
__copy__(opts, clss.prototype)
clss.__name__ = clss.prototype.__name__ = name
return clss
}

  上面的方法中用到了几个新的工具方法:

1. __file__       获取当前文件路径

  2. __filename__   获取指定文件路径的文件名(已去掉后缀)

  3. __copy__             简单的拷贝属性的方法

  这些方法都在sys.js实现:

this.__copy__ = function (source, target) {
for (var k in source)
target[k] = source[k]
return target
} this.__file__ = function () {
var e = document.getElementsByTagName('script')
return e.length ? e[e.length - 1].src : ''
}

// 获取当前文件所在的目录
this.__dirname__ = function (s) {
var p = s.lastIndexOf('/')
if (p === 0)
return '/'
if (p === -1)
return ''
return s.slice(0, p)
}

// 获取指定文件路径的文件名字(带后缀)
this.__basename__ = function (s) {
var res = s.match(/\/([^\/]+\.\w+)$/i)
return res ? res[1] : ''
} this.__filename__ = function (s) {
var str = __basename__(s)
return str.length ? str.slice(0, str.lastIndexOf('.')) : str
}

  最后还有一个__load__方法,属于一个文件加载器,没办法js"还“没有import我们自己来实现一个

/**
* @param files {Array} 要加载的js文件的路径数组
* @param ok {Function} 加载完成后的回调
* @example: __load__(['js/sys.js'], function () {console.log('load done!')})
*/
this.__load__ = function () {
var _loaded_path = {}
var _loader = function (src, fnc) {
if (_loaded_path[src])
return fnc()
var s = document.createElement("script")
s.onload = function () {
_loaded_path[src] = 1
fnc()
}
s.onerror = function () {
throw "Error loading: " + src
}
s.src = src
document.body.appendChild(s)
}
return function (files, ok) {
files = files.slice()
if (files.length == 0)
return ok && ok()
_loader(files.shift(), function () {
__load__(files, ok)
})
}
}()

  把上面的代码都放到js/lib/sys.js文件中,就基本完成我们的的工具准备了,我们来试试使用上面的方法,顺便熟悉我们的文件 结构,在 js/mtm/   文件夹下创建一个Test.js文件,在这里我们用我们的工具函数创建我们的第一个类:

var Test = __class__({

    __init__: function () {
this.sayMyName()
}, sayMyName: function () {
alert("I am a Class, my name is " + this.__name__)
} })

再写一个继承类,和Test.js同目录下创建OtherTest.js(注意,我们的__class__方法是可以多重继续的,只是新类里没有可间接从自己类里调用父类的方法):

var OtherTest = __class__(Test, {

    __init__: function () {
// 手动调用父类的构造方法
Test.call(this)
}, sayMyName: function () {
// 手动调用父类的sayMyName方法
Test.prototype.sayMyName.call(this)
// 再弹出一个信息
alert("All done!")
} })

类是写完了,但我们并没有引用,我们来部署一下我们测试环境:在js/etc/ 目录下创建一个mtm_module.js的文件,里面把我们js/mtm/文件里的js路径都写入一个mtm_module数组中:

var mtm_module = [
'js/mtm/Test.js',
'js/mtm/OtherTest.js', ]

以后都把mtm文件的路径往这个数组里加。在js/lib/目录下创建一个main.js的最终执行文件,然后主要就是在这个文件中加载其他js 执行测试代码:

// 把js/mtm/里的测试类都加载进来
__load__(mtm_module, function () { // 实例化一个Test类
var test = new Test() })

最后就是写index.html页面,把主要的sys.js,mtm_module.js, main.js用标签引入就OK了:

<!doctype html>
<html>
<head>
<title> Make things move </title>
</head> <body>
<script src='js/lib/sys.js'></script>
<script src='js/etc/mtm_module.js'></script>
<script src='js/bin/main.js'></script>
</body>
</html>

  到此,如果过程都没有任何问题,你可以打开index.html    然后就会弹出我们上面写的信息!如果你用的是mac 或 linux系统建议直接用命令行工具在该工程根目录输入`python -m SimpleHTTPServer 8000` 然后浏览器上打开localhost:8000就能看到效果了。写了这么多,可能篇幅有些长,下次写看来要控制一下 :p

Make Things Move -- Javascript html5版(一)文件目录结构和工具方法准备的更多相关文章

  1. Make Things Move -- Javascript html5版(二)实现最基本的Sprite类和stage管理对象

    现在这几篇写的都是比较基础的东西,有过相应开发经验的朋友可直接忽略啦. 计算机模拟的动画都是由很多静态的一连串影像(sprite)在一定帧率(fps)内逐帧播放出来的. 对于js来说,我们可以用提供的 ...

  2. Make Things Move -- Javascript html5版(三)三角函数形式的动画

    角度制和弧度制 生活中通常是用角度度来理解的,代码里都是用弧度制来计算. 角度转弧度:DEG_TO_RAD = Math.PI / 180 弧度装角度:RAD_TO_DEG = 180 / Math. ...

  3. HTML5版的String Avoider小游戏

    HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动 ...

  4. javascript+HTMl5游戏下载,开发一个都能月薪上万!舅服你

    HTML5时代已经到来许久了,你是否已经掌握了那么一点呢?今天小编给大家讲讲h5的折叠多设备.跨平台特性, 即用HTML5制作游戏.相比flash,HTML5更加灵活方便,随着浏览器技术的不断升级,H ...

  5. JavaScript+html5 canvas实现本地截图教程

    这篇文章主要介绍了JavaScript+html5 canvas实现本地截图教程,对截图功能感兴趣的小伙伴们可以参考一下 最近有时间了解了下html5的各API,发现新浪微博的头像设置是使用canva ...

  6. js操作文件 HTML5版

    js操作文件 HTML5版,有需要的朋友可以参考下. <!DOCTYPE html> <html> <head> <title>JSFileReader ...

  7. 免费的HTML5版uploadify送上

    相信有不少同学用过uploadify这一款文件上传插件,它支持多文件选择.能显示进度条.可配置性高,总体来说是比较好用的.官网有两个版本供下载,分别是flash版和HTML5版.不过令人惋惜的是,HT ...

  8. jmgraph前端画图组件(html5版)

    原文:jmgraph前端画图组件(html5版)      jmgraph是一个基于html5的WEB前端画图组件.        前端画图对象控件化,支持鼠标和健盘事件响应,可对单个控件样式设定,支 ...

  9. jquery.uploadify上传插件HTML5版中文api使用说明

    插件官网文档:http://www.uploadify.com/documentation/ H5版下载地址:https://download.csdn.net/download/u010075697 ...

随机推荐

  1. LeetCode: Best Time to Buy and Sell Stock II [122]

    [题目] Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  2. 经常使用git命令集

    //创建本地仓库 mkdir git_root;cd git_root;git init // //查看 git status . git log git log ./kernel/driver/ g ...

  3. jAVA 得到Map价值

    jAVA 获取Map中的值 Map<String, String> map=new HashMap<String, String>(); map.put("name& ...

  4. 10个实用的PHP正则表达式汇总

    原文 10个实用的PHP正则表达式汇总 正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符.词或算式等.但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时.本 ...

  5. 使用gson和httpclient呼叫微信公众平台API

    吐槽:微信api很无语.有一部分xml.有一部分json. 最近看如何调用微信公众平台json有关api更方便.终于找到了httpcliect和gson对. 假设你有一个更好的办法,请告诉我. 了解如 ...

  6. WebApiContrib

    https://github.com/WebApiContrib ASP.NET Web API and Protocol Buffers Protocol Buffers are a super e ...

  7. 关于PHP的工作流引擎

    关于PHP的工作流引擎,除了三大主流开源:PorcessMaker(排名第一,因其有拖放式图形定义界面),RadiCore(基于PETRI NET)和CuteFlow以外,另外还有一个不为人知的,但却 ...

  8. jqgrid-asp.net-mvc

    jqgrid-asp.net-mvc 你是否使用jqgrid? 你是否想在C#/asp.net mvc中使用jqgrid? 那你很可能曾经为了分析jqgrid的request url用fiddler忙 ...

  9. SQL点滴22—性能优化没有那么神秘

    原文:SQL点滴22-性能优化没有那么神秘 经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQ ...

  10. ViewPaper实现轮播广告条

    使用V4包中的viewPaper组件自己定义轮播广告条效果. 实现viewpaper的滑动切换和定时自己主动切换效果. 上效果图 布局文件 <RelativeLayout xmlns:andro ...