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

事件: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. java Cache框架

    Cache框架乱炖   各类开源的缓存解决方案 JBossCache/TreeCacheJBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让 ...

  2. 几百万的数据,mysql快速高效创建索引

    有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加不成功,想了很多办法,终 ...

  3. Oracle下的IF EXISTS()

    妈蛋..作为一个使用了SQL SERVER有4 5年的程序猿,开始用Oracle真他妈不习惯.写法真他妈不一样.比如像写个像IF EXISTS(SELECT * FROM sys.tables WHE ...

  4. 在linux系统下检查postgresql数据库安装,登录数据库及简单的查看数据库

    1.    检查Linux系统是否安装数据库 首先查看自己的系统是否安装了postgresql数据库命令如下: rpm -qa | grep postgresql 如果没有显示查询结果(如下图所示)说 ...

  5. echo "hello" | nc -4t -w1 localhost 8001

    TCP4: echo "hello" | nc -4t -w1 localhost 8001 UDP4: echo "hello" | nc -4u -w1 l ...

  6. 源码解析Android中View的measure量算过程

    Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View ...

  7. JS获取系统的指定定年月日

    /** * 获取系统当前时间 */ function getNowYearMouth(){ var date=new Date; var nowYearMouth=date.getMonth()+1; ...

  8. Android:将View的内容映射成Bitmap转图片导出

    前段时间在网上看到这么个例子是将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下: 在Android中自有 ...

  9. UISlide

    UISlide属性   1.   minimumValue  : 当值可以改变时,滑块可以滑动到最小位置的值,默认为0.0 _slider.minimumValue = 10.0; 2.   maxi ...

  10. 【转】vim - tab变空格

    vim中将tab自动转换成空格 在vim中,有时需要将tab转换成space.使用ret命令(replace tab).[range]ret[ab]! [new-tabstop] 举例:将第一行到文件 ...