在cocos2d里面,通过Node的方式,将整个场景以及里面的object给组织起来,这样很容易画了,从root node开始遍历,把整棵树画出来就是了. 剩下就是animation,timer, 还有mouse, touch,keyboard的 事件的处理。在cocos2d里面提供了三个模块来管理这些,schedule负责timer和 animation的驱动,Action则负责改变对象的参数实现一些动画效果。还有event dispatcher负责事件的分发.

Schedule

cocos2d里面的scheduler用于管理时间的调度(timeout的回调),同时这个schedule也驱动着整个游戏,让游戏能够跑动起来.

在前面的关于director笔记里面, 在Application run的时候,就是注册了一个timer,然后以一定的帧率去调用director的DrawScrene函数。这样能够保持游戏的画面不断的更新。

Application.run -->SetInterval(Director.mainloop, animationInterval)

Director.mainloop --> Director.drawScrene --> Director.runningScrene.vist()

在游戏里面除了要不断的更新画面以外,还要更新游戏中的一些数据和状态(比如游戏里面游戏主题位置,场景的滚动之类的),还有一些动画效果,也要 定时的更新物体的的一些参数,好让物体动起来。

所以cocos2d里面就提供了schedule来管理time的调度, 在drawScene的每里面,也就是游戏的每一帧里面都会调用scheduler 的update。

//function in class Director
drawScene:function () {
// calculate "global" dt
this.calculateDeltaTime(); if (!this._paused)
this._scheduler.update(this._deltaTime);
//other codes

在CCScheduler.js里面提供了两个class, 一个是Timer, timer负责回调函数和时间的计算,另外一个是Scheduler,它负责管理Timer的实例。 所以当注册了一个timerout的函数之后,它的回调函数被调用的流程如下:

drawScene --> scheduler.update(delta_time) --> Timer.update --> Timer.callSelector --> timer.selector.call(target, elapsed_time)

在Timer.update里面会判断是不是timerout了,如果是的话,就去调用回调函数, 否则就啥都不干。

在scheduler还提供了priority来调用timer的回调函数, priority越小,越被早调到。scheduler里面有三个updateList: updatesNegList, update0List, updatePosList; 在scheduler update的时候,会去分别遍历这三个list, 调用里面每个元素的update, 之后检查如果元素被markForDeletion的话,就把它从list中去掉。schedule中还提供了 Hash方便timer的查找。

在Node里面提供了schedule相关的函数, schedule, unschedule, scheduleUpdate, unscheduleUpdate, unscheduleAllCallbacks, scheduleOnce。这一族函数就是 在schedule的基础上做一些封装,target就是Node的this.

//function in class Node
schedule:function (callback_fn, interval, repeat, delay) {
interval = interval || 0; cc.Assert(callback_fn, "Argument must be non-nil");
cc.Assert(interval >= 0, "Argument must be positive"); repeat = (repeat == null) ? cc.REPEAT_FOREVER : repeat;
delay = delay || 0; this.getScheduler().scheduleCallbackForTarget(this, callback_fn, interval, repeat, delay, !this._running);
}

感觉最常用的是schedule和scheduleUpdate, sheduleUpdate这个会在每一帧去回调Node的update函数。

Action

Action用于实现一些动画效果。所谓的的动画效果就是改变Node的一些参数。 Action的基类对象里面有target,和tag, tag用于便于ActionManager管理Action, 然后target就指向要需要改变的对象.

cc.Action = cc.Class.extend(/** @lends cc.Action# */{
//***********variables*************
_originalTarget:null,
_target:null,
_tag:cc.ACTION_TAG_INVALID,

在cocos2d里面action是这样跑起来的,首先在director初始化的时候会将actionManager放到schedule里面:

    //in function Director.init
this._scheduler = new cc.Scheduler();
//action manager
this._actionManager = new cc.ActionManager();
this._scheduler.scheduleUpdateForTarget(this._actionManager, cc.PRIORITY_SYSTEM, false);

这样每一帧就会去调用actionManager的update. 在ActionManager里面会遍历所有的action,然后调用action的step, 之后如果 action isDone的话,就把action从list中去掉。 调用流程如下:

Director.drawScrene -->schedule.update --> ActionManager.Update --> action.step

然后在Node里面runAction函数,会把action添加到ActionManager里面

//in class Node
runAction:function (action) {
cc.Assert(action != null, "Argument must be non-nil");
this.getActionManager().addAction(action, this, !this._running);
return action;
}

在Node里面还提供了action的其他函数, stopAction, stopAllAction, stopActionByTag, getActionByTag, 这些也都是对ActionManager的相应函数的封装。

Event dispatcher

在cocos2d里面的touch, mouse等事件的处理还是很清晰的。以mouse 为例

System event  -->  MouseDispatchter --> MouseDelegate

如果要处理mouse事件的话,首先实现MouseEventDelegate这个接口,然后在调用MouseDispahter的addMouseDelegate方法将自己加进去。 在MouseDispatcher收到系统事件后,它会遍历所有注册的delegate,然后去调用相应的方法.

具体的例子可以看CClayer, CCLayer在onEnter的时候,把自己注册到MouseDispahter里面,然后在onExit的时候取消注册

cocos2d-html5 笔记5: 事件的更多相关文章

  1. Cocos2d html5 笔记 1: overview

    昨天接触到了cocos2d-html5的的东东了, 第一次看其源代码一头雾水,幸好samples目录下面有几个例子,可以从这个入手. MoonWarriors是一个射击类的游戏, 有点像以前玩的雷电, ...

  2. H5案例分享:html5重力感应事件

    html5重力感应事件 一.手机重力感应图形分析 1.设备围绕z轴的旋转角度为α,α角度的取值范围在[0,360). 设备在初始位置,与地球(XYZ)和身体(XYZ)某个位置对齐. 设备围绕z轴的旋转 ...

  3. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  4. javascript - 工作笔记 (事件四)

    在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装,  JavaScript Code  12345   yx.bind(item, "click&quo ...

  5. HTML5笔记3——Web Storage和本地数据库

    上一篇:HTML5笔记2——HTML5音/视频标签详解 Web Storage概述 在HTML5中,除了Canvas元素之外,另一个新增的非常重要的功能是可以再客户端本地保存数据的Web Storag ...

  6. 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

    学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...

  7. html5重力感应事件之DeviceMotionEvent

    前言 今天主要介绍一下html5重力感应事件之DeviceMotionEvent,之前我的一篇文章http://www.haorooms.com/post/jquery_jGestures, 介绍了第 ...

  8. jQuery:自学笔记(4)——事件与事件对象

    jQuery:自学笔记(4)——事件与事件对象 jQuery中的事件 什么是事件 所谓事件,就是被对象识别的操作,即操作对象队环境变化的感知和反应,例如单击按钮或者敲击键盘上的按键. 所谓事件流,是指 ...

  9. HTML5服务器发送事件(Server-Send Events)

    HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送 ...

  10. HTML5 服务器发送事件(Server-Sent Events)

    沈阳SEO:HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获 ...

随机推荐

  1. [转]【eoeAndroid索引】史上最牛最全android开发知识汇总

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

  2. 拜托,这才是“Uber”的正确读法

    在美国,私家车主可以注册成为Uber司机,这对传统的出租车行业形成了很大的挑战,同时也让Uber始终处于舆论的风口浪尖. 7月14日,美国用车应用Uber正式宣布进入北京市场.在进入中国后,Uber选 ...

  3. Tcl之group arguments

    1 doubel quotes This allows substitutions to occur within the quotations - or "interpolation&qu ...

  4. 编辑器CocoStudio和CocosBuilder的对比

    来源:http://4137613.blog.51cto.com/4127613/1352805   CocosBuilder CocoStudio 控件种类 支持大部分cocos2d-x自带的常用控 ...

  5. ajax 瀑布流实现

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. dom 侧栏分享

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 转】MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3544208.html 感谢! 一.正则表达式去除代码行号 作为开发人员,我们经常从网上复制一些代码,有些时候复制 ...

  8. 个人用户安装SEP注意事项

    一.安装时选择“非管控客户端” 二.安装时选择“自定义安装” 三.不要安装“应用程序与设备控制”,否则会拖慢开机   离线病毒库下载地址 http://www.symantec.com/securit ...

  9. class int

    class int(object): """ int(x=0) -> integer int(x, base=10) -> integer Convert a ...

  10. c# 调用zebra打印指令 打印到USB端口

    c# 调用zebra打印机指令打印条码,如果直接打印到lpt1端口的打印机,通过copy指令没有问题, 但如果ZEBRA打印机是通过USB连接,打印机端口为usb001,则程序不能直接拷贝到usb00 ...