首页 > ios > ios6_cocos2d的基本动作机制

ios6_cocos2d的基本动作机制

CCAction

  CCAction是整个动作体系的基类,CCActionManager 是运行状态的单例 (singleton)。
包括 2 个属性:
动作的对象: id target;
本动作标识: int tag;
定义了以下关键接口:
-(void) start;
-(BOOL) isDone;
-(void) stop;
-(void) step: (ccTime) dt;
-(void) update: (ccTime) time;
  但是 Action 类没有实现以上接口。只是完成了内存分配和初始化。虽然没有具体的实现内容,Action 类规定了画面更新的基本规则:首先调用 Step 函数。Step 函数依次调用 update 函数。其中调用 update 函数的参数 time 实际上是一个百分比,update 中动作的完成是按照百分比完成的,这样确保最后可以准确到达指定的位置戒者状态而忽略 过程中存在的一些误差。(内存分配、意外任务执行都会导致系统延时进而降低帧数。)

CCFiniteTimeAction

  继承自CCAction仅增加了一个属性,动作完成所需要的时间。
ccTime duration
增加了一个接口,反动作。

- (FiniteTimeAction*) reverse {
CCLOG(@"FiniteTimeAction#reverse: Implement me");
return nil; 
}

CCActionInstant

  作为瞬时动作的基类,从 CCFiniteTimeAction 派生。
该类仅实现了以下两个接口:

          -(void) step: (ccTime) dt
          {
// 因为是马上完成动作,所以用 1 表示动作结束。注意对比下面
IntervalAction的实现方法,它是传递已经历时间不预计完成时间的百分比。
 [self update: 1];
}
-(FiniteTimeAction*) reverse {
// 反动作 原动作相同。
return [[self copy] autorelease]; 
}

CCActionInterval

  作为延时劢作癿基类,CCActionInterval 也从 CCFiniteTimeAction 派生。
  新增了两个属性:firstTick 用亍控制 step 调用 Update的逻辑,elapsed
累计已经经过的时间。
  实现了以下方法:

          -(void) step: (ccTime) dt
          {
             if( firstTick ) {

             firstTick = NO;
             elapsed = 0;
          } else
elapsed += dt;
// 下面这行带要特别注意,这是延时动作(Action)实现的核心逻辑:
已经经历时间除以预计完成时间得到的百分比传递给 update 函数。 [self update: MIN(1, elapsed/duration)];
}
       -(void) start
       {
          elapsed = 0.0f;
          firstTick = YES;
       }

本类的reverse 函数将触发异常,该函数必须由子类实现。

CCActioManager

  这是个标准的单例类,该类的实例由系统按照必要时才加载思路自动分配实现。 99%的情况下读者都是通过 Cocos2d-iPhone 的其他接口而不是直接使用本类的实例 来实现他需要癿功能效果。以下两种情况例外:(参考源代码 (2.0版本)ActionManager.h 48 行)
1.使一个非 CocosNode 对象运动。
2.需要暂停/恢复某个或者全部动作。

CCRepeatForever

  直接从 CCAction 派生,为了确保动作(由内置属性 innerAction 指向)始终被重复执行,以下两点是关键:
1)IsDone 方法始终返回 NO,
2) step 实现中不断重新启动内置其他动作:

-(void) step:(ccTime) dt
{
	[innerAction_ step: dt];
	if( [innerAction_ isDone] ) {
		ccTime diff = innerAction_.elapsed - innerAction_.duration;
		[innerAction_ startWithTarget:target_];

		// to prevent jerk. issue #390, 1247
		[innerAction_ step: 0.0f];
		[innerAction_ step: diff];
	}
}

CCSpeed

  直接从 Action 类派生,通过在 step 函数中修改时间达到修改执行速度的目的:

-(void) step:(ccTime) dt
{
	[innerAction_ step: dt * speed_];
}

CCEaseAction

  类似 Action,按照预先设定的数学公式,来修改 step 的时间参数,达到修改执行速度的目的。

  1. Aditya 9月 3rd, 2012 @ 07:45 | #1

    Keep on writing and cughigng away!

评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks