ActionInstant
瞬时动作
比较常用的顺势动作例如:
其他的瞬时动作不是很常用:
不常用
替代
FlipX
Sprite::setFlippedX
FlipY
Sprite::setFlippedY
Hide
Node::setOpacity(0)
Show
Node::setOpacity(255)
Place
Node::setPosition
RemoveSelf
Node::removeXXXXXX
ToggleVisibility
Node::setVisible
看源码的实现,也是调用这些函数或者类似的一次。
路径 1 2 2 d/actions/CCActionInstant.h2 d/actions/CCActionInstant.cpp
源码 基类 – ActionInstant 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class CC_DLL ActionInstant : public FiniteTimeAction { public : virtual ActionInstant* clone () const override = 0 ; virtual ActionInstant * reverse () const override = 0 ; virtual bool isDone () const override ; virtual void step (float dt) override ; virtual void update (float time) override ; }; bool ActionInstant::isDone() const { return true ; } void ActionInstant::step(float dt) { CC_UNUSED_PARAM(dt); update(1 ); } void ActionInstant::update(float time) { CC_UNUSED_PARAM(time); }
在以上代码中值得关注的是step函数的实现:
update(1)
表示动作立马执行完成,具体见Action的代码。
ActionInstant的子类都是重写update
函数。
除了CallFunc系列之外,其他的那些都比较简单。
这里先列出所有的类
类
回调类型
CallFunc
std::function<void>()
SEL_CallFunc
CallFuncN
std::function<Node*>()
SEL_CallFuncN
*__CallFuncO
SEL_CallFuncO
*__CallFuncND
SEL_CallFuncND
PS :SEL_CallFunc*系列都不建议使用,还是用c++11新特性的std::function
CallFunc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 class CC_DLL CallFunc : public ActionInstant //<NSCopying> { public: /* 在js和lua脚本的绑定中,参数被改变 = -= */ /* In lua:local create(local funcID) */ /* In js: var create(var func, var this, var [data]) or var create(var func) */ static CallFunc * create(const std::function<void()>& func); /* SEL_CallFunc, 函数指针方式,不推荐使用 */ /* 兼容2.x版本 */ CC_DEPRECATED_ATTRIBUTE static CallFunc * create(Ref* target, SEL_CallFunc selector); public: /* 执行回调函数 */ virtual void execute(); inline Ref* getTargetCallback() { return _selectorTarget; } inline void setTargetCallback(Ref* sel) { if (sel != _selectorTarget) { CC_SAFE_RETAIN(sel); CC_SAFE_RELEASE(_selectorTarget); _selectorTarget = sel; } } virtual void update(float time) override; virtual CallFunc* reverse() const override; virtual CallFunc* clone() const override; CC_CONSTRUCTOR_ACCESS: CallFunc() : _selectorTarget(nullptr) , _callFunc(nullptr) , _function(nullptr) { } virtual ~CallFunc(); /* SEL_CallFunc, 函数指针方式,不推荐使用 */ /* 兼容2.x版本 */ CC_DEPRECATED_ATTRIBUTE bool initWithTarget(Ref* target); bool initWithFunction(const std::function<void()>& func); protected: /* 函数指针对象 */ Ref* _selectorTarget; /* 无名共用体 */ union { SEL_CallFunc _callFunc; SEL_CallFuncN _callFuncN; }; /* 回调函数 */ std::function<void()> _function; private: CC_DISALLOW_COPY_AND_ASSIGN(CallFunc); };
CallFunc将std::function和函数指针的方式整合到一起,做到了向2.x版本的兼容。
CallFuncN CallFuncN是CallFunc的子类,这也是为什么在CallFunc中的无名结构体中含有SEL_CallFuncN
的原因。
__CallFuncO 其实这个就是CallFuncN的函数指针部分,写这个类的原因主要还是兼容2.x版本
__CallFuncND ND表示的是Node&Data,这个函数指针回调(void(Node, void ))这个void*
类型的参数是额外的数据指针。
总结
step和update的关系在此很清晰:step调用了update
自定义动作的时候,需要从基类继承过来,然后重写update方法。
update方法的参数从0到1,表示开始到结束,比如update(1)表示结束