一,Timer类
1,是Ref的子类,采用引用计数管理内存
2,主要方法update( )实现了一个定时器逻辑
3,抽象类,必须被继承使用
virtual
void
trigger() =
0
;//到时触发的方法
virtual void cancel() = 0; //取消定时器
//两个为纯虚函数,需要在子类重载实现
protected
:
Scheduler* _scheduler; // weak ref 弱引用,在这个指针被赋值时并没有增加对
_scheduler的引用计数
float
_elapsed; //度过的时间
bool _runForever; //标记是否永久运行
bool _useDelay; //标记是否使用延迟
unsigned
int
_timesExecuted; //纪录已经执行的次数
unsigned int _repeat; //0 = once, 1 is 2 executed 定义执行的总次数(_repeat+1次)
float _delay; //延迟时间
float _interval; //时间间隔,隔
_interval调用一次
//初始化方法
void
setupTimerWithInterval(
float
seconds,
unsigned
int
repeat,
float
delay);
{
_elapsed = - 1 ;
_interval = seconds;
_delay = delay;
_useDelay = ( _delay > 0.0f ) ? true : false ;
_repeat = repeat;
_elapsed = - 1 ;
_interval = seconds;
_delay = delay;
_useDelay = ( _delay > 0.0f ) ? true : false ;
_repeat = repeat;
_runForever
= (
_repeat
==
CC_REPEAT_FOREVER
) ?
true
:
false
;
//无限重复次数为一个unsignedint的最大值
#define CC_REPEAT_FOREVER (UINT_MAX -
1
)
}
4,Timer的子类
TimerTargetSelector(绑定Ref基类对象)
//初始化方法
bool
initWithSelector(
Scheduler
* scheduler,
SEL_SCHEDULE
selector,
Ref
* target,
float
seconds,
unsigned
int
repeat,
float
delay);
//
SEL_SCHEDULE是一个Ref函数指针定义
void
TimerTargetSelector
::trigger()
{
if ( _target && _selector )
{
( _target ->* _selector )( _elapsed );//调用初始化传进来的回调方法
}
}
void TimerTargetSelector ::cancel()
{
_scheduler -> unschedule ( _selector , _target );
{
if ( _target && _selector )
{
( _target ->* _selector )( _elapsed );//调用初始化传进来的回调方法
}
}
void TimerTargetSelector ::cancel()
{
_scheduler -> unschedule ( _selector , _target );
}
5,
TimerTargetCallback(绑定任意对象)
bool
TimerTargetCallback
::initWithCallback(
Scheduler
* scheduler,
const
ccSchedulerFunc
& callback,
void
*target,
const
std
::
string
& key,
float
seconds,
unsigned
int
repeat,
float
delay)
{
_scheduler = scheduler;
_target = target;
_callback = callback;
_key = key;
setupTimerWithInterval (seconds, repeat, delay);
return true ;
}
void TimerTargetCallback ::trigger()
{
if ( _callback )
{
_callback ( _elapsed );
}
}
void TimerTargetCallback ::cancel()
{
_scheduler -> unschedule ( _key , _target );
{
_scheduler = scheduler;
_target = target;
_callback = callback;
_key = key;
setupTimerWithInterval (seconds, repeat, delay);
return true ;
}
void TimerTargetCallback ::trigger()
{
if ( _callback )
{
_callback ( _elapsed );
}
}
void TimerTargetCallback ::cancel()
{
_scheduler -> unschedule ( _key , _target );
}
6.
TimerScriptHandler与以上两个类似,有关脚本的
二,Scheduler类
巨多。。好难。。看不懂。。
首先,
Scheduler有两种调度模式:
1,按帧调度(被集成在Node类中)
数据结构:
typedef
struct
_listEntry //双向链表
{
struct _listEntry *prev, *next;
ccSchedulerFunc callback;
void *target;
int priority;
bool paused;
{
struct _listEntry *prev, *next;
ccSchedulerFunc callback;
void *target;
int priority;
bool paused;