cocos2d-x CocoStudio中场景触发器(Trigger)的代码部分和触发器之间的互调

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

事件:EventDef.h

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

#ifndef__EVENTDEF__
#define__EVENTDEF__ 

enum { 

TRIGGEREVENT_ENTERSCENE = 0,
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 = 0; 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 (0);
}

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

时间: 2024-10-23 13:41:03

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

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

场景编辑器中的触发器是一种通过事件触发机制,在特定的事件被触发的时候自动执行自己预先定义的动作或者功能. 编辑器中带有一些默认的事件.条件和动作,当然也可以扩展自定义的事件.条件和动作. 触发器可以创建多个,每个触发器都有可以设置自己的:事件.条件.动作. 事件: 是指触发监听的条件,在程序代码中,我们要在希望开启触发监听的地方用sendEvent(事件ID)来启动事件监听,这时候才会检测“条件”是否满足. 默认包含8种事件,分别是SceneOnEnter.SceneOnExit.SceneIn

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

一,什么触发器 1,个人理解 触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了. 2,官方定义 触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行.触发器经常用于加强数据的完整性约束和业务规则等. 触发器可以从 DBA_TRIGGERS ,USER_TRIGGER

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

1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.quartz.Trigger 类.当前,Quartz 有三个可用的 Trigger: Java代码 ·org.quartz.SimpleTrigger ·org.quartz.CronTrigger ·org.quartz.NthIncludeDayTrigger 2.SimpleTrigger的介绍正如

MySQL 触发器trigger

一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 语法: create trigger triggerName after/before insert/update/delete on 表名 for each row   #这句话在mysql是固定的 begin sq

PL/SQL 07 触发器 trigger

--触发器 触发器有三类: 数据操作触发器    用before触发器进行数据校验    用after触发器进行级联操作    语句触发器限制数据的操作和记录操作日志    instead of 触发器(只针对视图不允许DML操作时) 数据定义触发器    监视数据库中用户的一些重要操作 系统触发器 --触发器的限制 不应该使用事务控制语句COMMIT, ROLLBACK, SAVEPOINT 由触发器调用的任何过程与函数都不能使用事务控制语句 不能声明任何LONG或LONG RAW变量 可以访

mysql之触发器trigger

mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 语法: create trigger triggerName after/before insert/update/delete on 表名 for each row   #这句话在mysql是固定的

cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界

Cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入?到自己的游戏中,简化的设计是从2.0到3.0+的一个质的飞跃.(假设用的2.x版本号的cocos2d-x,看前一篇文章box2d) 以下相同以一个小demo来展示一下物理引擎的运用,同一时候说一下我在运用物理引擎中遇到的一些小小的问题. Cocos2d-x 3.0+中的物理属性: 1.物理世界被集成到场景中,当你创建一个场景,你能够

MySQL触发器trigger

触发器(trigger):监视某种情况,并触发某种操作,触发器必须有名字,最多64个字符,可能后面会附有分隔符. 它和MySQL中其他对象的命名方式基本相象 触发器创建语法四要素:1.监视地点(table) 2.监视事件DML 3.触发时间(after/before) 4.触发事件DML { BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后. { INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert

深入理解MVVM模式中Silverlight的Trigger、Action和Behavior及Silverlight的继承机制

接触Silverlight已经有两三个月了,开始一直感觉他和Winform很相似,拖拖控件就行了,所以一直把经历放在了研究后台和服务器交互和性能优化上面,很少去仔细研究Silverlight的页面.前几天,公司突然让修改一个Winform的项目,再回过头来看Winform,有种"不堪回首"的感觉. 十一长假即将来临,在这里先祝大家假期快乐.今天难得有空,抽出点时间研究了一下Silverlight的继承和触发器,拿出来和大家分享一下.Silverlight和WPF中页面布局使用的都是XA