cocos2d-x3.3 源码分析之-动作Action和ActionManager,cocos2dx3.3新建项目

  次阅读 作者:智能小宝 来源:互联网 2015-09-28 13:16 我要评论(0)

cocos2d-x3.3 源码分析之-动作Action和ActionManager,cocos2dx3.3新建项目

写这篇文章,没有花我多少时间。但是由于我的笔记写在云笔记中,图片也多。csdn也不支持直接复制粘贴图片,可以说把笔记移植过来比我当初写还要费事,希望改进吧

\

从入口开始分析,我们来看看addaction函数,他接受一个动作,并绑定自己,是否暂停取决于节点的running属性。

我们来具体看看ActionManager这个类

class CC_DLLActionManager : public Ref

{

public:

ActionManager(void);

~ActionManager(void);

void addAction(Action *action, Node*target, bool paused);

void removeAllActions();

void removeAllActionsFromTarget(Node*target);

void removeAction(Action *action);

void removeActionByTag(int tag, Node*target);

void removeAllActionsByTag(int tag, Node*target);

Action* getActionByTag(int tag, const Node*target) const;

ssize_tgetNumberOfRunningActionsInTarget(const Node *target) const;

void pauseTarget(Node *target);

void resumeTarget(Node *target);

Vector<Node*>pauseAllRunningActions();

void resumeTargets(constVector<Node*>& targetsToResume);

void update(float dt);

protected:

void removeActionAtIndex(ssize_t index,struct _hashElement *element);

void deleteHashElement(struct _hashElement*element);

void actionAllocWithHashElement(struct_hashElement *element);

protected:

struct _hashElement *_targets;

struct_hashElement *_currentTarget;

bool _currentTargetSalvaged;

};

struct _hashElement *_targets;

struct_hashElement *_currentTarget;

如果是对定时器数据结构很熟悉的人没看到这个结构体应该不会陌生。的确,内部结构是相同的,只不过把之前的定时器对象改为现在的action.

\

类似的,每个hash节点一般由一个target标志,根据target找到节点。每个节点弱引用一个动作的array,也就是说,每个节点可以绑定多个动作,paused记录了当前动作的暂停状态。

下面来看看addAction函数:

voidActionManager::addAction(Action *action, Node *target, bool paused)

{

CCASSERT(action != nullptr, "");

CCASSERT(target != nullptr, "");

//查找hash表,看看是否有相同的target,如果没有新建一个插入表中。

tHashElement *element = nullptr;

// we should convert it to Ref*, because wesave it as Ref*

Ref *tmp = target;

HASH_FIND_PTR(_targets, &tmp, element);

if (! element)

{

element =(tHashElement*)calloc(sizeof(*element), 1);

element->paused = paused;

target->retain();

element->target = target;

HASH_ADD_PTR(_targets, target,element);

}

//为弱引用的数组分配内存。

actionAllocWithHashElement(element);

//同一个动作结束前,如果被同一个节点包含两次,触发断言

CCASSERT(!ccArrayContainsObject(element->actions, action), "");

//将新的动作加入数组

ccArrayAppendObject(element->actions,action);

action->startWithTarget(target);

}

现在我们不介绍最后一句,因为我们需要回过头去看看Action及其子类

Action:

class CC_DLL Action: public Ref, public Clonable

{

public:

//动作的默认tag,一般不可以用默认tag索引动作

static const int INVALID_TAG = -1;

/**

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...