这节继上一篇触发器扩展,讲一下代码部分的实现。

事件:EventDef.h

  只有一个枚举,是对触发器事件的编号

#ifndef__EVENTDEF__
#define__EVENTDEF__ enum { TRIGGEREVENT_ENTERSCENE = ,
TRIGGEREVENT_LEAVESCENE,
TRIGGEREVENT_INITSCENE,
TRIGGEREVENT_UPDATESCENE,
TRIGGEREVENT_TOUCHBEGAN,
TRIGGEREVENT_TOUCHMOVED,
TRIGGEREVENT_TOUCHENDED,
TRIGGEREVENT_TOUCHCANCELLED,
}; #endif

在程序中使用sendEvent方法,就将cocos2d-x引擎的事件引入到了触发器系统中了 :

boolHelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
sendEvent(TRIGGEREVENT_TOUCHBEGAN);
return true;
}

条件:cons.h 和 cons.cpp

以ArmatureActionState为例:

ArmatureActionState.h

class ArmatureActionState : public cocos2d::extension::BaseTriggerCondition
{
DECLARE_CLASS_INFO
public:
ArmatureActionState(void);//构造方法
virtual ~ArmatureActionState(void);//析构方法 virtual bool init();//初始化方法
virtual bool detect();//获取判断判断结果接口****关键点****
virtual void serialize(constrapidjson::Value &val);//序列化,用于获取编辑器中设置的条件值
virtual void removeAll();//清理当前条件 void animationEvent(cocos2d::extension::CCArmature*armature, cocos2d::extension::MovementEventType movementType, const char*movementID);
private:
int _nTag;
std::string _comName;
std::string _aniname;
int _nState;
bool _bSuc;
};

ArmatureActionState.cpp

void ArmatureActionState::serialize(const rapidjson::Value &val)
{
int count =DICTOOL->getArrayCount_json(val, "dataitems");
for (int i = ; i < count; ++i)
{
const rapidjson::Value&subDict = DICTOOL->getSubDictionary_json(val, "dataitems",i);
std::string key =DICTOOL->getStringValue_json(subDict, "key");
if (key == "Tag")
{
_nTag =DICTOOL->getIntValue_json(subDict, "value");
continue;
}
else if (key =="componentName")
{
_comName =DICTOOL->getStringValue_json(subDict, "value");
continue;
}
else if (key =="AnimationName")
{
_aniname =DICTOOL->getStringValue_json(subDict, "value");
continue;
}
else if (key =="ActionType")
{
_nState =DICTOOL->getIntValue_json(subDict, "value");
continue;
}
}
}

其中的判断条件值elseif (key == "componentName")就对应的前面提的配置文件中的Key,这里通过key来做判断,得到我们想要的值value。

动作:act.h 和 act.cpp

以TMoveTo为例:

和“条件判断”的实现多数方法也是类似,但不同的是detect()替换为done()函数,在该函数里,我们做触发事件后的处理。

void TMoveTo::done()
{
do
{
CCNode*pNode = SceneReader::sharedSceneReader()->getNodeByTag(_nTag);
CC_BREAK_IF(pNode== NULL);
CCActionInterval* actionTo = CCMoveTo::create(_fDuration,_pos);
CC_BREAK_IF(actionTo== NULL);
pNode->runAction(actionTo);
}while (0);
}

最后,我们有时候可能会需要在某一个触发器结束的时候调用另一个触发器,那么我们只需要在当前触发器属性中添加一个“下一个触发器ID”的属性,用来获取下一个触发器。

同一场景中所有新建的触发器都会自动在名字末尾添加一个有序编号,那是触发器的编号ID,我们可以通过这个ID来取得指定的触发器。

void TMoveTo::done()
{
do
{
/* 调用另一个触发器,m_nextTriggerId为下一个触发器的ID */
TriggerObj *obj = TriggerMng::getInstance()->getTriggerObj(m_nextTriggerId);
 obj->done();
}while ();
}

参考链接:http://www.cocoachina.com/bbs/simple/?t194739.html

cocos2d-x CocoStudio中场景触发器(Trigger)的代码部分和触发器之间的互调的更多相关文章

  1. ylb: 触发器(Trigger)之Instead Of触发器 [注:没内容]

    ylbtech-SQL Server:SQL Server-触发器(Trigger)之Instead Of触发器 触发器(Trigger)之Instead Of触发器 [注:没内容]. ylb: 触发 ...

  2. cocos2d-x CocoStudio中场景触发器(Trigger)的使用和扩展

    场景编辑器中的触发器是一种通过事件触发机制,在特定的事件被触发的时候自动执行自己预先定义的动作或者功能. 编辑器中带有一些默认的事件.条件和动作,当然也可以扩展自定义的事件.条件和动作. 触发器可以创 ...

  3. mysql 利用触发器(Trigger)让代码更简单

    一,什么触发器 1,个人理解 触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了. 2,官方定义 触发器 ...

  4. 如何使用MySQL触发器trigger

    阅读目录:触发器trigger的使用 创建触发器 单一执行语句.多执行语句 new.old详解 查看触发器 删除触发器:慎用触发器,不用就删除 Q:什么是触发器? A: 触发器是与表有关的数据库对象, ...

  5. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  6. Quartz(自动任务)中的触发器Trigger

    1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.qua ...

  7. 数据库技术中的触发器(Trigger)——和ContentObserver功能类似

    刚总结过ContentObserver的作用和特点,顺便总结下数据库技术中的触发器(Trigger),触 发 器 分 为 表 触 发 器 . 行 触 发 器

  8. WPF触发器(Trigger)

    WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...

  9. WPF触发器(Trigger、DataTrigger、EventTrigger)

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

随机推荐

  1. servlet实现文件下载

     之前没怎么用过这个,这次项目中用到了,于是总结一下: 应该说主要注意三方面: 1.写一个servlet 2.在web.xml中配置这个servlet 3.页面上调用这个servlet   第一: 写 ...

  2. VNC+SSH相关应用

    1.安装vnc-server  vncviewer2.执行vncserver  输入密码3.执行vncserver -kill :1 杀死1号屏幕4.修改/root/.vnc/xstartup   u ...

  3. Backbone seajs demo2

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Android InputMethodManager输入法简介

    正文 一.结构 public final class InputMethodManager extends Object Java.lang.Object android.view.inputmeth ...

  5. YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)

    2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec  内存限制: 128 MB 提交: 183  解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...

  6. asp开发微信扫码支付

    这个任务已经给了.现在正在学习开发中.主要注意的是2点. 1:返回参数的验证. 2:通知后业务处理和处理后返回财付通.大部分操作,api中已经处理好. 现在需要的业务逻辑部分. 需要正确3个参数  r ...

  7. 关于RotateAnimation的各构造方法的参数

    本文以RotateAnimation的构造方法 讲解. RotateAnimation(float fromDegrees, float toDegrees) 其他构造器的旋转也可参考这副图. Rot ...

  8. UI开发中的Unit test新工具:网页抓屏比较

    在UI开发中,判断是否正常往往需要看到UI长的模样,所以一般的Unit test无法胜任. 现在有一款通过抓屏而后相素比较的方法,或许对于UI自动化测试能够起到比较好的改进效果. 具体请参见:http ...

  9. Asp.Net生命周期系列三

    上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(HttpApplication). 第二:建立了HttpModule列表,项目经理(HttpRunTime)就 ...

  10. POJ (Manacher) Palindrome

    多敲几个模板题,加深一下对Manacher算法的理解. 这道题给的时间限制15s,是我见过的最长的时间的了.看来是为了让一些比较朴素的求最大回文子串的算法也能A过去 Manacher算法毕竟给力,运行 ...