Cocos2d-html5常用API(第二部分)
十三、 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
描述:优先级标识越大的,拍在越后。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4242.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
