~~~~我的生活,我的点点滴滴!!
ActionManagerTest例子里面包括了好几种小例子,不过他们大体是差不多的,都是精灵利用action去展示一些动作,下面我效果图:
这个文件里面包括了好几个类,基本主控制框架一样,这里我们不讲解,我们就拿第一个旋转作为分析例子,看下面源码:
//------------------------------------------------------------------
//
// ActionManagerTest
//
//------------------------------------------------------------------
void ActionManagerTest::restartCallback(Ref* sender)
{
auto s = new ActionManagerTestScene();
s->addChild(restartActionManagerAction());
//replaceScene替换时会删掉上一次的场景,对比pushScene()与popScene()
//看代码里面是递归删除所有子节点并释放
Director::getInstance()->replaceScene(s);
s->release();
}
//对于onEnter()的介绍及与init()等区别见http://blog.csdn.net/ac_huang/article/details/37773369
void CrashTest::onEnter()
{
//必须先调用父类的
ActionManagerTest::onEnter();
auto child = Sprite::create(s_pathGrossini);
child->setPosition( VisibleRect::center() );
addChild(child, 1);
//1.5s旋转90度
child->runAction(RotateBy::create(1.5f, 90));
//DelayTime 表示空白,什么也不做 详见http://blog.csdn.net/ac_huang/article/details/37972017
child->runAction(Sequence::create(
DelayTime::create(1.4f),
FadeOut::create(1.1f),
nullptr)
);
runAction( Sequence::create(
DelayTime::create(1.4f),
CallFunc::create( CC_CALLBACK_0(CrashTest::removeThis,this)),
nullptr)
);
}
初看上面,我觉得runAction()动作他是依次执行,即先花费1.5s旋转,然后在花1.4s等待,最后花费1.1淡出屏幕,但是其实不是这样的,
runAction()虽然看上去他们有先后执行的顺序,其实代码执行到这时,他们都没有执行,他们都是在帧刷新的时候一起执行的(但是runAction
里面的Sequence是有先后顺序的,他为动作序列,想当然会有),那也就意味着1.5s在旋转的时候,后面1.4s的等待同时在进行,然后才是1.1s
的淡出,后面又有一个回调函数去做删除操作,做打断了前面的操作,也就是说runAction()是同时执行的,能强行打断操作,如果把第三个
runAction()里面的等待时间改成2.5s(为什么是2.5s?1.5s做完旋转时淡出运行已经运行了0.1s,所以在只需要1s就能看到淡出完成,所以
是2.5s)就能看到一个完整的过程了。
最后看一下删除,其他的是都是类似的,就不说了。
void CrashTest::removeThis()
{
//删除自己,包括释放掉内存,有可能不会立即释放,因为内存管理机制是用引用计数的
_parent->removeChild(this, true);
nextCallback(this);
}