Cocos2d-html5(version2.2.1)常用API

一些约定:
1.实例的引用,新的实例交由cc._xxx变量存储,并在类的内部使用的
为了能让外部能使用,并统一接口,都会给类定义一个getInstance方法
并将对应的实例返回出去的。
cc.Application的实例
eg:cc.Application.getInstance(),当然在执行之前要先创建cc.Application实例

2.另外一些cocos层面的全局变量,作者都将其纳入到cc的命名空间下了。 防止冲突。
而我们就不要再使用cc作为自己的变量。

一、常量
cc.IS_SHOW_DEBUG_ON_PAGE
类型:boolean
默认值:false
位置:CCCommon.js
(静态、常量)
功能:是否在网页上显示调试信息

二、cc命名空间下的方法 
1.cc.log
功能:输出调试信息
依赖:cc.IS_SHOW_DEBUG_ON_PAGE
位置:CCCommon.js
默认:在控制台输出调试信息
描述:cc.IS_SHOW_DEBUG_ON_PAGE为true时,在网页上显示调试信息
cc.IS_SHOW_DEBUG_ON_PAGE为false时,在控制台输出调试信息

2.cc.Assert
功能:输出断言信息
依赖:cc.IS_SHOW_DEBUG_ON_PAGE
位置:CCCommon.js
参数:cond 条件,true、false或者条件表达式
message 当cond为false时,输出该信息到控制台,当不支持console.assert时,用alert方式替代
描述:只有当cc.COCOS2D_DEBUG为0时才会被屏蔽,当然还要调用cc.initDebugSetting方法

3. cc.initDebugSetting
功能:更新调试模式
依赖:cc.COCOS2D_DEBUG(大于等于0的数)
位置:CCCommon.js
描述:当cc.COCOS2D_DEBUG = 0时,cc.log, cc.Assert, cc.logINFO, cc.logERROR 被屏蔽
当cc.COCOS2D_DEBUG = 1时,cc.logINFO被赋值为cc.log, cc.logERROR 被屏蔽
当cc.COCOS2D_DEBUG > 1时,cc.logINFO, cc.logERROR 均被赋值为cc.log

4. cc.setup(el, width, height)
功能:设置canvas的尺寸
参数:el:可以是dom元素,也可以是dom元素的id
width:canvas元素的宽度
height:canvas元素的高度
约束:el的标签必须采用DIV或者CANVAS
描述:做了哪些事
el为canvas时:
1. 宽度以参数传入的为准,假如没传宽高,则以元素自身的宽高为准,假如
自身没设置width、height样式时,cocos默认设置为480px宽,320px高,设置在属性中的。
2. 在canvas的上一层再包裹一层div元素,尺寸与canvas一致(设置在内联style)
,并做居中处理
3. 将canvas对象赋值给cc.canvas
el为div标签时:
1. 创建一个canvas标签,用属性方式设置宽高,添加“gameCanvas”class
2. 为div做居中处理,并用style内联方式设置宽高
3. 将canvas对象赋值给cc.canvas
最后:
1.当支持visibilitychange事件(选项卡显示隐藏状态变更)时,每当选项卡显示时,
cc.Director.getInstance()._resetLastUpdate();
2.手机平台,将div、canvas、body设置为不可选中的状态,对iphone、ipad禁用选状态下背景默认高亮的效果。
在pc端是可以选中的。
疑惑:
1.不知道为什么canvas的尺寸设置于属性,而包裹层div的尺寸却设置于内联样式中,为什么风格
不统一一点?
2.当el为div标签时,canvas有“gameCanvas”class,而el为canvas时,却没有为canvas添加该class的。


5.cc.Color3B
功能:创建一种颜色,颜色由rgb三种元色构成。是一个构造函数。
参数:r1,g1,b1,分别代表rgb,取值在[0,255]
位置:CCTypes.js
默认:是参数缺失情况下,r,g,b成员变量赋值为0
描述:没有传任何参数时,rgb均为0
传入一个参数时,如果是cc.Color3B实例时,会返回该实例的拷贝
传入三个参数时,分别赋值给成员变量r,g,b,并去除小数部分的。

6.cc.Color4B
功能:创建一种颜色,颜色由rgba三种元色构成。是一个构造函数
参数:r1,g1,b1,分别代表rgb,a表示透明度,取值在[0,255]
位置:CCTypes.js
默认:是参数缺失情况下,r,g,b,a成员变量赋值为0
描述:没有传任何参数时,rgb均为0
传入一个参数时,如果是cc.Color3B实例时,会返回该实例的拷贝
传入三个参数时,分别赋值给成员变量r,g,b,并去除小数部分的。
注意:在我们获取颜色值时,通常是#3c3c3c这种类型的颜色值,这些值是16进制的
,我们可以用0x3c来作为参数,是一种快速转换成数值的方式。

7.cc.RenderDoesnotSupport 
功能: 返回cc.__renderDoesnotSupport内置变量
位置: miniFramework.js
描述: 万一当
cc.__renderDoesnotSupport为undefined时,返回false

8.cc.create3DContext
功能:创建一个webgl环境

位置: miniFramework.js 
返回:一个webgl的环境,创建失败就返回null
参数:canvas:canvas元素
opt_attribs:创建webgl的一些参数。
位置:miniFramework.js
描述:cocos在检测是否支持webgl的时候,opt_attribs参数设置为
{'stencil': true, 'preserveDrawingBuffer': true },
stencil: 是绘图缓存的一种,表示至少用8位来保存。
它为屏幕上的每个像素点保存一个无符号的正数值。通过这个值,可以的得知哪些像素点的颜色值
需要更新,哪些不需要,从而达到增加渲染管线的渲染速度的。
preserveDrawingBuffer:缓存种类Color(颜色缓冲区),Depth(深度缓冲区),Stencil(模版缓存区),
当设置为true时,表示会缓存绘图信息,除非canvas尺寸发生变化。
当设置为false时,表示每次渲染后都会去清缓存,不管canvas尺寸是否发生变化。
注意:
* DrawingBuffer绘图缓存在3种情况下是必须被系统自动清空的:
1.首次创建的时候
2.当canvas的尺寸发生变化时
3.当创建webgl的preserveDrawingBuffer配置参数为false时,每当渲染结束后都会清空缓存
* Color(颜色缓冲区),Depth(深度缓冲区)默认值都是true的,而Stencil(模版缓存区)默认值为false。

9.cc.Point
功能:构造函数,创建一个点,包括x,y两个平面坐标
参数:x,y
位置:CCGeometry.js
描述:当没有传入参数时,初始值为x = 0,y=0

注意:cc.PointMake即将会被废弃,官方建议不要使用,起作用跟cc.Point作用一致。

10.{cc.Point} cc.p
功能:返回cc.Point实例
参数:x,y
位置:CCGeometry.js(Geometry:几何)
描述:用cc.Point 新建一个实例然后返回而已,方便我们创建点对象,省去我们写new 关键字,
说白就是简化书写,偷懒。

11.{cc.Point} cc.PointZero
功能:返回(0,0)点实例
位置:CCGeometry.js

12.{Boolean} cc.pointEqualToPoint
功能:返回两个cc.Point实例是否指向同一个点
参数:point1,point2 (类型为cc.Point)
位置:CCGeometry.js
注意:一旦传入0,false,undefined,null,或者没有传入参数,该方法均
返回false,也许是cocos作者认为这些值没意义,不具备可比性,一律返回fasle

13.{cc.Size} cc.Size
功能:构造函数,创建一个尺寸实例,包含width宽度,height高度
参数:width,height
位置:CCGeometry.js
描述:假如没传width,height参数进去,会给定默认值0,0

注意:cc.SizeMake即将会被废弃,官方建议不要使用,起作用跟cc.Size作用一致。

14.{cc.Size} cc.SizeZero
功能:返回一个宽高都为0的尺寸实例
参数:N/A
位置:CCGeometry.js

15.{Boolean} cc.sizeEqualToSize
功能:返回两个cc.Size实例是否相同(width,height变量相等)
参数:size1,size2 (类型为cc.Size)
位置:CCGeometry.js
注意:一旦传入0,false,undefined,null,或者没有传入参数,该方法均
返回false。

16.{cc.Rect} cc.Rect
功能:构造函数,具有两个成员参数
{cc.Point} origin: origin.x, origin.y
{cc.Size} size: size.width,size.height
参数:x1,y1,width1,height1
位置:CCGeometry.js
描述:这个方法采用模拟了方法的重载
当没有传入参数:origin赋值为横纵坐标为0的cc.Point实例,size赋值为高度为0的cc.Size实例
当传入一个参数:认定这个参数的类型就是cc.Rect
当传入二个参数:认定第一个参数为cc.Point类型,第二个参数为cc.Size类型
当传入四个参数:将参数分别赋值给origin.x, origin.y, size.width, size.height
注意:
* 我觉得它根据了arguments.length,按传入参数个数来做不同处理,对于模拟方法重载
的层面来讲,个人觉得是好赞的做法!
* cc.RectMake即将会被废弃,官方建议不要使用,起作用跟cc.Rect作用一致。
* 在这里不要以为它就只有这个成员变量,它还有四个对应的类成员属性,分别
为x,y,width,height,以Object.defineProperties(cc.Rect.prototype,这样的方式定义的。

17.{cc.Rect} cc.rect
参数:x1,y1,width1,height1
位置:CCGeometry.js
描述:用cc.Rect 新建一个实例然后返回而已,方便我们创建矩形对象,省去我们写new 关键字,
说白就是简化书写,偷懒。

18.{cc.Rect} cc.RectZero
功能:返回一个以(0,0)作为原点,宽度高度均为0的矩形对象

19.{Boolean} cc.rectEqualToRect
功能:比较两个矩形实例是否相等
参数:rect1, rect2 均为{cc.Rect}类型
描述:一旦传入0,false,undefined,null,或者没有传入参数,该方法均
返回false。

20.{Boolean} cc.rectContainsRect
功能:返回一个矩形是否包含另一个矩形
true:第一个矩形包含第二个矩形,且第一个矩形的尺寸较大
false:第一个矩形没有包含第二个矩形,或者跟第二个矩形相同
参数:rect1, rect2 均为{cc.Rect}类型
描述:一旦传入0,false,undefined,null,或者没有传入参数,该方法均
返回false。
注意:这里当两个矩形相同,会返回false。

21.{Number} cc.rectGetMaxX
功能:返回矩形右下角点的x坐标

22.{Number} cc.rectGetMidX
功能:返回矩形底边中点的x坐标

23.{Number} cc.rectGetMinX
功能:返回矩形左下角点的x坐标

24.{Number} cc.rectGetMaxY
功能:返回矩形左上角点y坐标

25.{Number} cc.rectGetMidY
功能:返回矩形左边中点y坐标

26.{Number} cc.rectGetMinY
功能:返回矩形左下角点y坐标

27.{Boolean} cc.rectContainsPoint
功能:判断点是否在矩形上
参数:{cc.Rect} rect, {cc.Point} point

28.{Boolean} cc.rectIntersectsRect
功能:判断两个矩形是否存在交集
参数:{cc.Rect} rectA, {cc.Point} rectB

29.{Boolean} cc.rectOverlapsRect
功能:判断两个矩形是否存在交集
参数:{cc.Rect} rectA, {cc.Point} rectB
质疑:这两个函数在功能上与cc.rectIntersectsRect完全一致,不知道cocos作者为什么
要搞两个功能一样的方法出来。


30.{cc.Rect} cc.rectUnion
功能:返回一个包含这两个矩形的最小矩形
参数:{cc.Rect} rectA, {cc.Point} rectB

31.{cc.Rect} cc.rectIntersection
功能:获取两个矩形重合部分的矩形
参数:{cc.Rect} rectA, {cc.Point} rectB

32.cc.setContextMenuEnable
功能:设置canvas元素上点击鼠标右键是否弹出菜单列表
参数:true:弹出菜单
false:不弹出菜单(默认值)
位置:CCApplication.js

(33-46为仿射矩阵相关操作) 
33.AffineTransform
功能:构造函数,定义a,b,c,d,tx,ty成员变量
返回:{cc.AffineTransform}
描述:以上变量构成一个坐标矩阵
参数:a,b,c,d,tx,ty

34.__AffineTransformMake
功能:返回包含a,b,c,d,tx,ty属性的jason对象
返回:{object}

35.__PointApplyAffineTransform
功能:计算指定点point通过变换矩阵t后得到的目标坐标值
返回:{object}
参数:{cc.Point} point , {objct} t(变换矩阵)
描述:[a, b ] * [point.x,point.y] 计算得出坐标值的。
c, d
tx,ty
遵循f(x) = a*x + b,
[a*pint.x + c*point.y + tx,b*point.x + d*point.y + ty]
36.PointApplyAffineTransform
功能:计算指定点point通过变换矩阵t后得到的目标坐标值
返回:{object}
参数:{cc.Point} point , {objct} t
描述:功能跟__PointApplyAffineTransform一样,只不过这个方法对外作为
构造器角色。

37._PointApplyAffineTransform
功能:计算指定点point通过变换矩阵t后得到的目标坐标值
返回:{object}
参数:{Number} x , {Number} y, {objct} t
描述:功能跟__PointApplyAffineTransform一样。只是参数{cc.Point} point
拆分成x,y。x为point.x,y为point.y。

38.__SizeApplyAffineTransform
功能:计算指定点point通过变换矩阵t后得到的目标坐标值
返回:{object}
参数:{cc.Size} size , {objct} t
描述:[a, b ] * [size.widht,size.height] 计算得出目标尺寸。
c, d
tx,ty
由于面积不需要叠加位移,所以不用遵循f(x) = a*x + b,只要f(x) = a*x就ok。
[a*size.widht + c*size.height,b*size.widht + d*size.height]

39.AffineTransformMakeIdentity
功能:返回一个变换矩阵,这个矩阵不包含任何变化。
描述:任何点或尺寸与该方法返回的矩阵进行乘法运算,都不会对原始点或尺寸对象
产生任何变化。
返回:{object}
{a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0}

40.AffineTransformIdentity
功能:返回一个变换矩阵,这个矩阵不包含任何变化。
描述:任何点或尺寸与该方法返回的矩阵进行乘法运算,都不会对原始点或尺寸对象
产生任何变化。
返回:{object}
质疑:功能跟cc.AffineTransformMakeIdentity一样,都用作构造器,不知道为什么要
搞两个方法出来。


41.RectApplyAffineTransform
功能:获取一个经过变换矩阵变形后的矩形。
返回:{cc.Rect} rect, {cc.AffineTransform} anAffineTransform
描述:其原理是通过获取四个顶点坐标,计算每个点通过变换矩阵t后得到的目标坐标值,
再从四个变换后的顶点求出该矩形的圆点和尺寸。根据这些属性新创建一个矩形
对象并返回该对象。
质疑:var top = cc.rectGetMinY(rect);应该改为var bottm = cc.rectGetMinY(rect);
var bottom = cc.rectGetMaxY(rect);应该改为var top = cc.rectGetMaxY(rect);
语义上会更好。


42._RectApplyAffineTransformIn
功能:获取一个经过变换矩阵变形后的矩形。
返回:{cc.Rect} rect, {cc.AffineTransform} anAffineTransform
描述:功能与RectApplyAffineTransform一样,但_RectApplyAffineTransformIn将变换后的
矩形属性拷贝到rect参数,并返回该参数。
质疑:var top = cc.rectGetMinY(rect);应该改为var bottm = cc.rectGetMinY(rect);
var bottom = cc.rectGetMaxY(rect);应该改为var top = cc.rectGetMaxY(rect);
语义上会更好。


43.AffineTransformTranslate
功能:仿射矩阵的平移操作后的结果。
返回:{cc.AffineTransform} t,{Number} tx,{Number} ty
描述:仿射矩阵的结合顺序一般最后才做平移操作。
[t.a, t.b ] * [tx,ty] => [tx*t.a+ ty*t.c, tx*t.b + ty*t.d]
t.c, t.d
[t.a, t.b ] + [tx*t.a+ ty*t.c, tx*t.b + ty*t.d] =>[t.a,t.b]
t.c, t.d t.c,t.d
t.tx,t.ty tx*t.a+ ty*t.c + tx, tx*t.b + ty*t.d + ty

注意:这里是先做乘法操作,得出的结果是平移操作的变换矩阵,也就是说tx,ty是未经历任何转换的平移量,
但要融合到t,先要做一下矩阵乘法操作,然后才能与t的直接相加操作得到组合后的变换矩阵。

44.AffineTransformScale
功能:仿射矩阵的缩放操作后的结果。
返回:{cc.AffineTransform}
描述:仿射矩阵的与缩放操作组合后的结果。
[t.a, t.b ] + [sx,0] =>[t.a*sx,t.b*sx]
t.c, t.d 0,sy t.c*sy,t.d*sy
t.tx,t.ty t.tx, t.ty

45.AffineTransformConcat
功能:仿射矩阵的缩放操作后的结果。
返回:{cc.AffineTransform}
参数:{cc.AffineTransform} t1, {cc.AffineTransform} t2
描述:两个仿射矩阵组合后的结果,非平移的都是采用乘法操作。
[t1.a,t1.b] * [t2.a,t2.b]
t1.c,t1.d t2.c,t2.d
t1.tx,t1.ty t2.tx,t2.ty
=>[t1.a*t2.a+t1.b*t2.c, t1.a*t2.b+t1.b*t2.d]
t1.c*t2.a+t1.d*t2.c, t1.c*t2.b+t1.d*t2.d
t1.tx*t2.a+ t1.ty*t2.c + t2.tx, t1.tx*t2.b + t1.ty*t2.d + t2.ty

a,b,c,d都是通过矩阵乘法算来的,后面的tx,ty要做两步才能得出结果,
第一:先算出[t1.tx,t1.ty]在[t2.a,t2.b]变换矩阵变换后的平移量,按照乘法得到
t2.c,t2.d
[t1.tx*t2.a+ t1.ty*t2.c, t1.tx*t2.b + t1.ty*t2.d]
第二:知道变换后的平移量就可以直接与[t2.tx,t2.ty]相加得出结果。
这两步做了AffineTransformTranslate方法做的事了。

46.AffineTransformEqualToTransform
功能:判断两个矩阵是否相等。
返回:true/false
参数:{cc.AffineTransform} t1, {cc.AffineTransform} t2
描述:判断它们的a,b,c,d,tx,ty属性是否相等

47.ArrayRemoveObject
功能:从数组中移除指定对象
参数:{Array} arr
{*} var
描述:arr数组元素类型决定了var的类型


三、cc属性
1.{String} cc.ENGINE_VERSION
功能:返回当前正在使用的cocos-html5的引擎版本
位置:CCConfig.js
eg:“Cocos2d-html5-v2.2.1”


2.{c.Point} cc.POINT_ZERO
位置:CCGeometry.js
返回(0,0)点实例,该实例包含x,y两个成员变量

3.{c.Size} cc.SIZE_ZERO
位置:CCGeometry.js
返回(0,0)尺寸实例,该实例包含width,height两个成员变量

4.{c.Point} cc.SIZE_ZERO
位置:CCGeometry.js
返回:左下角点(0,0)作为原点,宽,高长度均为0的矩形实例,
该实例包含x,y,width,height均为0的四个成员变量

5.cc._sharedApplication
功能:指向cc.Application创建的实例
描述:在cc.Application构造器中,初始化时,将实例指针this赋值给cc._sharedApplication
,所以完全等价于当做是cc.Application实例。
注意:用意为cocos其他类或者方法使用之,主要用于引擎内其他方法使用,外部用cc.Application.
getInstance()来获取
位置:CCApplication.js 

四、sys命名空间 

位置:cocos2d/core/platform/Sys.js
描述:在cocos2d-html这个分支中,Sys只有属性,没有方法。
属性:
1.platform
返回:“browser”
只读,可枚举,可配置(enumerable、configurable)

2.version
返回:cc.ENGINE_VERSION
只读,可枚举,可配置(enumerable、configurable)
如在v2.2.1的话,返回“Cocos2d-html5-v2.2.1”

3.os
返回设备操作系统类型的名称
只读,可枚举,可配置(enumerable、configurable)
* 'Windows'(WP7会被断言为Windows的)
* 'OS X'
* 'UNIX'
* 'Linux'
* 'iOS'
* 'Android'

4.capabilities
返回JSON对象
{
canvas: true
opengl:
touches:
mouse:
keyboard:
accelerometer:
}
只读,可枚举,可配置(enumerable、configurable)

5.localStorage
返回window.localStorage对象,假如不支持本地存储时,将返回一个空函数function(){}.
质疑:这里cocos的写法有一些低级错误,我要指出,源码如下:
try{
sys.localStorage = window.localStorage;
}catch(e){
if( e.name === "SECURITY_ERR" ) {
cc.log("Warning: localStorage isn't enabled. Please confirm browser cookie or privacy option");
}
sys.localStorage = function(){};
}

这里做了一个try..catch捕获异常,目的是应付用户对Chrome浏览器的Cookie栏目勾选了阻止网站设置任何数据,但是在这种情况下 cc.log并没有将错误信息打印出来,因为在最新版的Chrome中,e.name显示为”SecurityError“了,没有下划线的。所以源码存在一点
问题的。


五、cc.Browser
cc.Browser
位置: miniFramework.js
属性
1.ua: userAgent(小写)

2.platform: navigator.platform(小写),eg:"Win32"

3.isMobile: 是否移动设备,根据ua是否含有'mobile'和'android'字样。
质疑:从判断逻辑来睇,并不只是判断Mobile,因为iPad平台都有'mobile'字样,Android平台的平板
也是必定有'android',所以isMobile我认为是断言是否移动设备,而不是字面上的手机设备


4.mode: 如果为ie浏览器,则返回document.documentMode,获知ie处于哪种内核模式
IE6/IE7:undefined
IE8: 8
IE8(兼容模式):7
IE9: 9
IE9(兼容模式):7||8
IE10: 10
IE10(兼容模式):7||8||9

5.supportWebGL
false: 当document.ccConfig.renderMode为1时
或者 document.ccConfig.renderMode为0时的移动设备
true: 必须先支持WebGL,
pc: renderMode为0或2
移动设备: renderMode 为2
质疑: 当我们指定document.ccConfig.renderMode为2时,也即只选用WebGL渲染页面,在最新版的Chrome中测试出现了
相当多的关于WebGL的警告错误,多的程度已经让Chrome报如下的错误:

too many errors, no more errors will be reported to the console for this context.
最终导致不能正常显示cocos2d-html5引擎的功能测试的。唯一能解决目前的方案是将
document.ccConfig.renderMode设为1,
也即强制只采用canvas来渲染。


6.{Boolean} __renderDoesnotSupport:
true: 当document.ccConfig.renderMode强制用WebGL来渲染,但浏览器不支持WebGL,表示不支持渲染。
false: 表示支持渲染,由cc.RenderDoesnotSupport 方法设置。
注意:
* 即使返回false时,也不表示肯定没问题的,如
supportWebGL中,提到的质疑部分。
* 在tests-boot-html5.js里面我们为document.ccConfig赋值,假如没赋值,将其赋值为{}
* document.ccConfig.renderMode = 2表示只选择WebGL方式来渲染
* document.ccConfig.renderMode = 1表示只选择canvas方式来渲染
* 移动设备默认就是只采用canvas进行渲染的

7.{Boolean} supportWebAudio
true: 表示支持html5的音频处理接口(对应html标签为

类的方法

1.create

功能:创建一个cc.Speed实例

参数:N/A

返回值类型:{cc.Speed}

普通方法

1.setSpeed

功能:设置速度

参数:{Number} speed

描述:这里speed的用法,主要控制速度的,

1 -> 速度不变

>1 -> 提速

<1 -> 减速

2.getSpeed

功能:获取速度

返回值类型:{Number}

3.clone

功能:返回自身的一个拷贝副本

返回值类型:{cc.Speed}

描述:这个副本将会拥有与自身一样的速度(_speed),但是自身的内建动作对象(_innerAction)

与副本的_innerAction并不完全等价,只是它们在动作的持续时间_duration属性是相同的。

4.initWithAction

功能:初始化动作对象

参数:{cc.ActionInterval} action

{Number} speed

描述:1.将action设置为内建动作对象(_innerAction)

2.speed设置为该实例的_speed属性值。

注意:初始化成功后会返回true,但action为空时,cocos抛出异常

5.ctor

功能:初始化函数

参数:N/A

描述: 1.设置_speed为0

2.设置_innerAction为null

3.执行cc.Action的初始化函数

6.startWithTarget

功能:将动作对象挂载在节点上

调用时机:动作开始之前的那一刻

参数:{cc.Node} target

描述:1.将自身(动作)的节点(主语)设置为target

2.内建动作对象的节点(主语)设置为target

3.内建动作对象的_elapsed(动作已执行时间)初始化为0

4.内建动作对象的_firstTick(动作是否首次被激活)设置为true

7.isDone

功能:获取动作是否已经结束

参数:N/A

返回:{Boolean}

描述:通过调用内建动作对象(_innerAction)的同名方法,

其实现依据为 动作当前已执行的时间 >= 动作的持续总时间.

8.getInnerAction

功能:获取内建动作对象

参数:N/A

返回值类型:{cc.ActionInterval}

9.setInnerAction

功能:设置内建动作对象

参数:{cc.ActionInterval} action

10.stop

功能:停止动作

参数:N/A

描述:将自身和内建动作对象(_innerAction)的目标节点都设置为null

11.step

功能:停止动作

参数:{Number} dt 单位为秒

描述:内建动作对象(_innerAction)执行同名方法。

调整速度的原理:

1.首先step的调用的时间间隔是固定的

2.通过dt*this._speed/this._duration的得出每一帧占动作总进程的比例,也就是说在经过相同的时间,而动作的进程比例增大,则意味著提速,反之,减速。

所以推导出this._speed>1为提速,this._speed<1为减速。

十三、 cc.Follow类
功能:用于模拟摄像机跟拍效果。
位置:CCAction.js
继承树:
cc.Class
cc.Action
cc.Follow

概念解析:
1.什么是跟拍?
答:首先存在一个对象,它正在运动,然后拍摄镜头跟着这个对象拍摄。
好像你看足球比赛的时候,直播的镜头总是把镜头跟随足球而调整它的位置,让足球尽可能保持在屏幕的
正中央,这就是跟拍,镜头追随者运动之中的足球做跟随运动。在cocos2d当中,足球就相当于游戏中的
角色,角色在地图中进行移动,为了让角色(sprite对象)维持在屏幕正中间,我们让地图(layer对象)跟随角色
跟随运动,角色向左走,那么模拟镜头的跟拍,那么实质就是地图向右走。所以这个动作一般为layer对象执行
的动作。

2.什么是跟拍范围?
答:拿足球比赛为例,一般镜头只会拍摄球场以内的范围,当有球员被红牌罚下场,并走进更衣室,镜头只会跟拍这个
球员到球场更衣室的出入口处,然后就不跟拍了,那么这个足球场内的这个范围就是所谓的跟拍范围。
在cocos2d,跟拍范围是一个cc.Rect实例来的。

3.设置跟拍范围的目的何在?
答:在cocos2d中,设置跟拍范围是为了控制超出这个范围就不跟拍了。

4.什么是边界?
答:跟拍范围是一个矩形来的(cc.Rect实例),
左边界:跟拍对象向左运动到x轴的该坐标值时,则停止跟拍运动
右边界:跟拍对象向右运动到x轴的该坐标值时,则停止跟拍运动
上边界:跟拍对象向上运动到y轴的该坐标值时,则停止跟拍运动
下边界:跟拍对象向下运动到y轴的该坐标值时,则停止跟拍运动

注意:跟拍对象的位移在超出跟拍范围之后,依然会继续运动的,只是摄像头不再进行跟拍而已。

介绍一下边界值的计算:
* 假设我规定了跟拍范围为(-300,-400,屏幕宽度+300*2,屏幕高度+400*2)
拍摄范围你可以理解成直播中的足球场,而直播画面理解成canvas的视口,
在最初的时候,很多人以为左边界为-300,右边界为屏幕宽度+300,上边界为屏幕高度+400,下边界为-400,
这些是跟拍范围的范围边界,和cocos的边界概念是不等价的!

* cocos的边界是基于跟拍对象的,它计算的是这个对象的在哪个范围内会被跟拍的意思
而跟拍的过程有一个规定就是跟拍对象维持在屏幕的正中央位置,所以,
左边界:-300
右边界:300
上边界:400
下边界:-400
表达的意思就是这个对象在cc.Rect {-300,-400,600,800}这个矩形范围内都是会被跟拍的。

* 推导出的规律就是
设跟拍范围为rect
左边界:-(跟拍范围的右边界的x坐标值 - 屏幕宽度)
=> -(rect.x+rect.width - 屏幕宽度)
右边界:-rect.x
上边界:-rect.y
下边界:-(跟拍范围的上边界的y坐标值 - 屏幕高度)
=> -(rect.y+rect.height - 屏幕宽度)

1.ctor
功能:初始化函数
参数:N/A
返回值类型:cc.Follow
描述:
1.跟拍范围的四个边界(上下左右)都设置为0
2.跟拍范围(_worldRect)设置为空范围{0,0,0,0}
3.跟拍对象(_followedNode)设置为null
4.屏幕右下角的点对象(_fullScreenSize)与 屏幕正中央的点对象(_halfScreenSize)
都设置为null
5.是否限制拍摄范围的标识(_boundarySet)设置为false
6.将是否需要根据跟拍对象的位移来调整跟拍动作的执行者(通常为layer,如地图)的位置
的标识(_boundaryFullyCovered)设置为false。

2.isBoundarySet
功能:获取是否限制摄像机的跟拍范围。
参数:N/A
返回值类型:{Boolean}
描述:1.返回true的话,当超出跟拍范围就会停止跟拍
2.返回false的话,一直进行跟拍
注意:1.当初始化函数中,会将其默认设置为false的
2.当在initWithTarget方法中,当传入一个非空的cc.Rect实例作为跟拍范围(rect)参数
时,设置_boundarySet属性为true,否则都会被设置为false的。

3.setBoudarySet
功能:设置是否限制摄像机的跟拍范围。
参数:{Boolean} value
注意:从isBoundarySet方法的注意部分看出,这个方法应尽量少使用,因为
是否限制摄像机的跟拍范围的标识(_boundarySet)会由initWithTarget方法自动维护的。

4.isDone
功能:返回跟拍动作是否已完成
参数:N/A
返回值:{Boolean}
描述:判断依据为跟拍对象是否还在舞台上。
这个就好比球赛结束的时候,裁判收回足球并离开球场(跟拍对象离开舞台),
则直播的画面就会结束一样(跟拍动作结束)。

5.stop
功能:返回跟拍动作是否已完成
参数:N/A
返回值:{Boolean}
描述:1.将动作对象的节点(动作的执行者_target)设置为null
2.重新执行父类cc.Action的同名方法。
质疑:在父类cc.Action的同名方法就已经做了对_target设置为null的工作了,
但在该方法中,重复了该操作,这是多余的。


6.initWithTarget
功能:初始化跟拍动作对象的节点和跟拍范围
参数:{cc.Node} followedNode
{cc.Rect} rect
返回值:{Boolean}
描述:
1.计算屏幕右下角的点对象(_fullScreenSize)与 屏幕正中央的点对象(_halfScreenSize)
2.设置是否限制摄像机的跟拍范围的标识(_boundarySet),当rect为非空矩形({0,0,0,0})则为true,
否则设置为false
3.设置四个边界值
4.初始化成功后返回true值

注意:当跟拍对象(followedNode)为空时,cocos抛出异常,并终止该方法的所有后续操作。

7.step
功能:每帧画面要做的更新
参数:{Number} dt 单位为秒
描述:
1.假如没有设置跟拍,那么跟拍对象会由屏幕的正中央为起始点(0.5*屏幕宽度,0.5*屏幕高度)进行位移的。
2.假如设置了跟拍,则跟拍对象会由屏幕的正中央为起始点进行位移,并且当运动超出它的边界时,则停留在
相应的边界上。例如,左边界为-300,而跟拍对象向左移动到-350,则它在-301到-350这段距离时,位置以
左边界为准,实际上就是欺骗跟随动作的执行者(layer层),让它认为跟拍对象以经停止运动来达到不跟拍
的效果的。

特殊情况:当跟拍范围小于屏幕时,则不做任何事。因为地图都无屏幕大,那么精灵在上面移动也无必要调整地图位置,
源于精灵不会超出屏幕以外。
注意:1.跟随动作的执行者(通常为layer)要根据跟拍对象的位置来调整自身的位置的。
2.设置对跟拍对象的运动的目的是以此来推算layer层究竟要如何位移,来达到跟拍的效果。

十四、 cc.ActionInterval类
功能:用于设置动作的间竭变化(相当于分解动作)。
位置:CCActionInterval.js
继承树:
cc.Class
cc.Action
cc.FiniteTimeAction
cc.ActionInterval

类的方法:
1.create
功能:构造函数
参数:{Number} d (单位:秒)
返回值类型:{Boolean}
描述: 1.创建一个cc.ActionInterval实例
2.初始化实例的过渡时间为d

普通方法:
1.ctor
功能:初始化函数
参数:N/A
描述: 1.执行cc.FiniteTimeAction的同名方法

过度时间_duration设置为0
动作标识_tag设置为-1
将动作的执行节点_target/_originalTarget设置为null

2.将动作已执行的时间(_elapsed)设置为0
3.是否首次被激活的标识(_firstTick)设置为false

2.getElapsed
功能:获取动作已执行的时间(单位:秒)
参数:N/A

3.initWithDuration
功能:初始化动作的过渡时间(动作由开始到结束所经历的时间)
参数:{Number} d (单位:秒)
返回值类型:{Boolean}
描述: 1.设置过渡时间
2.将动作已执行的时间(_elapsed)设置为0
3.是否首次被激活的标识(_firstTick)设置为true
4.设置完之后返回true
注意:当参数d为0的时候,会用一个表示极小数的常量cc.FLT_EPSILON作为过渡时间,
cc.FLT_EPSILON为0.0000001192092896,这种处理手法的目的不明。

4.isDone
功能:获取动作是否完成
参数:{Number} d (单位:秒)
返回值类型:{Boolean}
描述: 动作已执行的时间(_elapsed) 是否大于等于 动作的过渡时间

5.clone
功能:返回自身的一个副本
参数:N/A
返回值类型:{Boolean}
描述: 1.创建一个cc.ActionInterval实例
2.初始化实例的过渡时间为自身的过渡时间

6.step
功能:每一帧画面要做的更新
参数:{Number} dt (单位:秒)
描述:1.对动作已执行的时间(_elapsed)增加dt时间
但当是否首次被激活的标识(_firstTick)为true时,(_elapsed)设置为0
2.计算当前动作的进程比例(用0-1的值表示)
3.将进程比例作为参数调用实例的update方法
注意:这个update方法需要子类去重写,step只负责调用之
质疑:这个方法直接使用数值0.0000001192092896,而不使用cc.FLT_EPSILON,这个使
代码风格很不统一

7.getTarget
功能:获取动作实施者(节点)
参数:N/A
返回类型:{cc.Node}

8.setTarget
功能:设置动作实施者(节点)
参数:{cc.Node} target

9.getOriginalTarget
功能:获取动作初始实施者(节点)
参数:N/A
返回类型:{cc.Node}
注意:OriginalTarget和Target差别在于,在动作对象执行stop方法时,Target会被设置为null
,而OriginalTarget不会,相同之处是它们都在startWithTarget方法中被初始化为相同的
节点。OriginalTarget可以理解成动作对象的主要实施者(经常执行该动作的节点)。

10.setOriginalTarget
功能:设置动作初始实施者(节点)
参数:{cc.Node} originalTarget

11.startWithTarget
功能:设置动作初始实施者(节点)
参数:

12.reverse
功能:返回反向的动作对象
参数:N/A
描述:这个方法用于被重写,理解其为一个接口。
注意:假如子类不重写,则永远会返回null

13.setAmplitudeRate
功能:设置振幅的比率
参数:{Number} amp
描述:空方法,主要用于让子类重写的。

14.getAmplitudeRate
功能:获取振幅的比率
参数:N/A
返回值类型:{Number}
描述:空方法,主要用于让子类重写的。

十五、 cc.Sequence类
功能:用于设置动作的间竭变化(相当于分解动作)。
位置:CCActionInterval.js
继承树:
cc.Class
cc.Action
cc.FiniteTimeAction
cc.ActionInterval
cc.Sequence

类的成员变量:
1._actions
类型:Array
默认值:null
作用:存储动作对象

2._split
类型:{Number}
默认值:null
作用:第一个动作占序列动作的时间比例
注意:类的内部,永远都是只处理两个动作对象,假如序列动作由两个以上动作组成,
则将前两个合并成序列动作,再进行操作。
例如:4个动作组成的序列动作会如下:
动作1,动作2 => 序列动作1
序列动作1,动作3 => 序列动作2
序列动作2,动作4 => 序列动作3
最终这4个动作的合并结果为序列动作3

3._last
类型:{Number}
默认值:0
作用:用于标识动作序列中哪个动作在执行中。如第一个动作在执行中,那么_last为0,
第二个动作在执行中,那么_last为1。

类的方法:
1.create
功能:创建一个序列动作
参数:{Array|cc.FiniteTimeAction} tempArray
描述:这里的参数既可以是{Array|cc.FiniteTimeAction},也可以是以多个参数方式
例如:
cc.Sequence.create([action1,action2,action3]);
也可以写成:
cc.Sequence.create(action1,action2,action3);
注意:这种参数类型可变的处理迎合不同人的书写习惯,可以借鉴其处理手法。

2._actionOneTwo
功能:合并两个动作对象
参数:{cc.FiniteTimeAction} actionOne,{cc.FiniteTimeAction} actionTwo
描述:内置方法,不建议在cocos框架外部使用。

普通方法:
1.initWithTwoActions
功能:合并两个动作对象。
参数:{cc.FiniteTimeAction} actionOne, {cc.FiniteTimeAction} actionTwo
描述:1.将参数存储于_actions
2.叠加两个动作对象的过渡时间,调用父类{cc.ActionInterval}同名方法
注意:两个参数任意一个为null都会抛出异常,初始化成功之后返回true。

2.ctor
功能:构造器
参数:N/A
描述:1.调用上一级父类cc.ActionInterval的同名方法
2.将_actions赋值为空数组

3.clone
功能:返回一个序列动作的拷贝
返回值类型:{cc.Sequence}
参数:N/A

4.startWithTarget
功能:挂载动作执行者
返回值类型:{cc.Sequence}
参数:1.计算动作一与动作二的切换时间点(动作一占动作序列总时间的比例)
2._last赋值为-1

5.stop
功能:卸载动作执行者
参数:N/A
描述:1.执行父类{cc.Action}的同名方法
2.卸载最后一个动作的执行者

6.update
功能:更新序列动作的每一帧变化操作
参数:{Number} time(0-1的比例,标识序列动作的进程的)
描述:* 处理第一个动作(可能是序列动作)
1.推算第一个动作的当前进程(0-1的比例,标识序动作一的进程的)
2.关停动作2

* 处理第二个动作
1.推算第二个动作的当前进程(0-1的比例,标识序动作二的进程的)
2.关停动作1

注意:1.从实现的角度来看,支持顺时动作的,顺时动作的进程标识为1。
2.该方法主要对两个动作对象进行调度的,在动作一执行时,停掉动作二
动作二执行时,停掉动作一,每个动作的更新由动作一,动作二的update
方法具体处理。让我们只要处理好单个动作,再结合本类就可以轻松达到
串联动作的效果。

7.reverse
功能:返回一个倒序列动作(反向做的序列动作)
返回值类型:{cc.Sequence}
参数:N/A

8.copy
功能:返回一个序列动作的拷贝
返回值类型:{cc.Sequence}
参数:N/A
描述:功能等价于clone

十六、 cc.Repeat类
功能:用于设置动作的重复执行,主要控制重复的那个动作对象的update方法调用。
位置:CCActionInterval.js
继承树:
cc.Class
cc.Action
cc.FiniteTimeAction
cc.ActionInterval
cc.Repeat

类的成员变量:
1._times
类型:{Number}
功能:需要重复的总次数

2._total
类型:{Number}
功能:当前重复次数

普通方法:
1.initWithAction
类型:{cc.FiniteTimeAction} action, {Number} times
描述:1.计算重复动作总的执行时间
2.action作为内部对象(重复的那个动作)
3.times作为需要重复的总次数
注意:action为{cc.ActionInstant},即时动作,瞬间完成,重复的总次数-1

2.isDone
功能:是否完成所有动作
类型:{Number}
返回值类型:{Boolean}
描述:当前重复次数 等于 需要重复的总次数

3.clone
功能:拷贝重复动作副本
类型:N/A
返回类型:{cc.Repeat}

4.stop
功能:关停动作
描述:1.卸载自身的执行者
2.卸载内部动作的执行者

5.startWithTarget
功能:挂载动作执行者
类型:{cc.Node} target
描述:1.自身挂载执行者
2.内部动作挂载执行者
3.计算当前循环的时间区间(_nextDt),用于与update方法的参数time进行比较,
识别是否进入下一次重复动作。

6.setInnerAction
功能:设置内部动作(被重复的那个动作)
参数:{cc.FiniteTimeAction} action

7.getInnerAction
功能:获取内部动作(被重复的那个动作)
返回类型:{cc.FiniteTimeAction} action

8.reverse
功能:获取反向重复动作
返回类型:cc.Repeat

9.update
功能:更新序列动作的每一帧变化操作
参数:{Number} time(0-1的比例,标识序列动作的进程的)
描述:1.管理重复的那个动作的update调用时机
2.根据time识别每一轮循环的结束,关停动作,并重启之,同时更新当前循环
的完成的时间点_nextDt。

注意:1.因为动作的update方法传入的参数为0-1之间的,确保所有数值都落在
这个区间,例如即使我有一个数为1235.23时,我将其与1取余,即提取
数据的小数部分,1235.23 % 1 = 0.23,从而达到目的,这种写法很值得
借鉴,不难,但用得很妙!

疑问:1.类的成员变量_actionInstant,用于标识重复动作是否为瞬时完成,默认值为false
,而这个属性没有公开的方法提供修改,类的内部除了初始化的时候赋值以外,没有
任何对其进行任何操作。在update方法中的使用很费解。
2.当time大于1时,理论上表示所有循环结束,但当出现当前循环数小于指定重复数时,
对_total加1处理,这个_total在 _actionInstant为true时,使用到。而_actionInstant
在本类中,不可能被修改为true,除非它的子类修改了。

十七、cc.RepeatForever类
功能:用于设置动作的无限重复执行。
位置:CCActionInterval.js
继承树:
cc.Class
cc.Action
cc.FiniteTimeAction
cc.ActionInterval
cc.RepeatForever

类的方法:
1.create
功能:创建{cc.RepeatForever}实例
参数:{cc.ActionInterval} action
返回类型:{cc.RepeatForever}
描述:这个方法是为了方便创建无限循环动作的,除了new一个实例,
并初始化实例(设置需要重复的那个动作对象为内部动作)

普通方法:
1.reverse
功能:获取反向重复动作
返回类型:cc.RepeatForever

2.isDone
功能:是否完成所有动作
类型:{Number}
返回值类型:{Boolean}
描述:永远都返回false,因为无限循环的,就是没有停下来的那一刻。

3.setInnerAction
功能:设置内部动作(被重复的那个动作)
参数:{cc.ActionInterval} action
注意:cc.RepeatForever 和 cc.Repeat 都有该方法,但是cc.Repeat类传入的
action类型为{cc.FiniteTimeAction}(是cc.ActionInterval的父类)

4.getInnerAction
功能:获取内部动作(被重复的那个动作)
返回类型:{cc.ActionInterval} action
注意:cc.RepeatForever 和 cc.Repeat 都有该方法,但是cc.Repeat类传入的
action类型为{cc.FiniteTimeAction}(是cc.ActionInterval的父类)

5.initWithAction
功能:设置内部动作(被重复的那个动作)
参数:{cc.ActionInterval} action

6.clone
功能:拷贝重复动作副本
类型:N/A
返回类型:{cc.RepeatForever}

7.startWithTarget
功能:挂载动作执行者
类型:{cc.Node} target

8.step
功能:每隔一帧被调用一次
参数:{Number} dt(单位:秒)
类型:当检测内部动作(需要重复执行的那个动作)已经完成之后,再重新执行该动作。

十八、cc.Touch类功能:触摸点相关
位置:CCTouchDelegateProtocol.js
继承树:
cc.Class
cc.Touch

公共方法:
1.cc.pSub
功能:计算两点之间的差距
参数:{cc.Point} v1,{cc.Point} v2
返回类型:{cc.Point}
描述:点v1(10,10)与v2(4,5)的差距为(6,5)

普通方法:
1.getLocation
功能:获取当前触点的位置
参数:N/A
返回类型:{cc.Point}

2.getPreviousLocation
功能:获取较早前触点的位置
参数:N/A
返回类型:{cc.Point}

3.getDelta
功能:获取触点当前位置与较早前的位置的差距
返回类型:{cc.Point}

4.getID
功能:获取ID

5.getId
功能:获取ID
描述:功能与getID一样

6.setTouchInfo
功能:获取ID
参数:{Number} id,{Number} x,{Number} y
描述:将x,y作为最新触点的坐标,并设置id值

7._setPrevPoint
功能:设置较早前的触点坐标
参数:{Number} x,{Number} y

8.ctor
功能:构造函数
描述:1.id初始化为0
2.当前触点,较早前触点位置初始化(0,0)

十九、cc.TouchDispatcher类
功能:触摸相关事件的调度分发
位置:CCTouchDispatcher.js
继承树:
cc.Class
CCTouchDispatcher.js

常量介绍:
1.cc.TOUCH_BEGAN
功能:标识触摸开始的事件
常量值:0

2.cc.TOUCH_MOVED
功能:标识触摸滑动的事件
常量值:1

3.cc.TOUCH_ENDED
功能:标识触摸结束的事件
常量值:2

4.cc.TOUCH_CANCELLED
功能:标识触摸结束的事件
常量值:3

相关公共方法:
1.cc.less
功能:判断第一个事件处理器的优先级是否低于第二个
参数:{cc.TouchHandler} p1,{cc.TouchHandler} p2
返回类型:{Boolean}
描述:数字越大,表示优先级低。

2.cc.ArrayAppendObjectToIndex
功能:将指定对象添加到数组的指定位置
参数:{Array} arr,{*} addObj,{Number} index
返回类型:{Boolean}
描述:指定对象为addObj,指定的位置为index

3.cc.ArrayRemoveObjectAtIndex
功能:删除数组指定位置的元素
参数:{Array} arr,{Number} index

普通方法:
1.isDispatchEvents
功能:获取是否分派事件(注册事件)
返回类型:{Boolean}

2.setDispatchEvents
功能:设置是否分派事件(注册事件)
参数:{Boolean} dispatchEvents

3.forceAddHandler
功能:强制添加事件处理器
参数:{cc.TouchHandler} handler,{Array|cc.TouchHandler} array
描述:1.将handler与array的所有元素进行对比优先级,按照优先级越低,插入到array的位置
将会越后。
2.当发现handler的代理{cc.TouchDelegate}出现在array时,不添加hanndler,并直接
返回array。

注意:有必要了解一下{cc.TouchDelegate}是什么,代理是什么意思?
答:{cc.TouchDelegate}包含了所有触摸相关的事件类型,如onTouchBegan,onTouchesMoved等等,
主要是为了统一事件接口,统一管理触摸类的事件。

4.forceRemoveAllDelegates
功能:强制移除所有事件代理
参数:N/A
描述:1.清空保存标准事件处理器的数组
2.清空保存绑定了作用域的事件处理器的数组
注意:清空数组的手法比较新颖,采用[].length = 0来实现。

5._removeDelegate
功能:强制移除事件代理
参数:{cc.TouchDelegate} delegate
描述:1.在没有停止添加,删除事件代理的情况下:
从_targetedHandlers和_standardHandlers分别搜索匹配的事件代理,然后删除之。
2.在停止添加,删除事件代理的情况下:
从this._handlersToAdd搜索匹配,找到就删除之,假如匹配不到,就将delegate
添加到_handlersToRemove

注意:1.有个锁(_locked)的概念,就是是否停止添加,删除事件代理
2._handlersToAdd和_handlersToRemove用于锁(_locked)生效的情况下,
分别用于暂时存放要添加的事件处理器和要删除的事件处理器,待解锁时
再去进行添加、删除操作。

6.findHandler
功能:找出事件处理器
参数:{Array||cc.TouchDelegate} array, {cc.TouchDelegate} delegate
返回值类型:{cc.TargetedTouchHandler|cc.StandardTouchHandler|Null}
描述:1.当传入一个参数时,认为该参数为delegate,
首先从_targetedHandlers找出匹配参数的事件处理器({cc.TargetedTouchHandler})
如找不到,从_standardHandlers找出匹配参数的事件处理器({cc.StandardTouchHandler})
2.当传入两个个参数时,
从array找出匹配参数的事件处理器。
3.都找不到时,返回null
注意:{cc.TouchHandler} 与 {cc.TouchDelegate}的区别是,前者包含后者,并且包含事件代理的优先级等信息
,后者只是封装了事件。

7.forceRemoveDelegate
功能:强制移除指定事件代理
参数:{cc.TouchDelegate} delegate
描述:从_targetedHandlers和_standardHandlers分别搜索匹配的事件代理,然后删除之。

8.rearrangeHandlers
功能:事件处理器按优先级降序排列
参数:{Array} array
描述:优先级标识越大的,拍在越后。


源引:http://www.52ij.com/jishu/4241.html 

你可能感兴趣的:(Cocos2d-js)