ActionInstant瞬时动作

比较常用的顺势动作例如:

  • CallFunc*

其他的瞬时动作不是很常用:

不常用 替代
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
2d/actions/CCActionInstant.h
2d/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 //<NSCopying>
{
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
{
/* 直接返回 true ,表示已经完成 */
/* 具体见ActionManager的实现 */
return true;
}

void ActionInstant::step(float dt) {
CC_UNUSED_PARAM(dt);
update(1);
}

void ActionInstant::update(float time) {
CC_UNUSED_PARAM(time);
// nothing
}

在以上代码中值得关注的是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)表示结束