123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- /****************************************************************************
- Copyright (c) 2013-2017 Chukong Technologies Inc.
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- #include "editor-support/cocostudio/TriggerObj.h"
- #include "base/CCEventListenerCustom.h"
- using namespace cocos2d;
- namespace cocostudio {
-
- BaseTriggerCondition::BaseTriggerCondition(void)
- {
- }
- BaseTriggerCondition::~BaseTriggerCondition(void)
- {
- }
- bool BaseTriggerCondition::init()
- {
- return true;
- }
- bool BaseTriggerCondition::detect()
- {
- return true;
- }
- void BaseTriggerCondition::serialize(const rapidjson::Value& /*val*/)
- {
- }
-
- void BaseTriggerCondition::serialize(cocostudio::CocoLoader* /*cocoLoader*/, cocostudio::stExpCocoNode* /*cocoNode*/)
- {
-
- }
- void BaseTriggerCondition::removeAll()
- {
- }
- BaseTriggerAction::BaseTriggerAction(void)
- {
- }
- BaseTriggerAction::~BaseTriggerAction(void)
- {
- }
- bool BaseTriggerAction::init()
- {
- return true;
- }
- void BaseTriggerAction::done()
- {
- }
- void BaseTriggerAction::serialize(const rapidjson::Value& /*val*/)
- {
- }
- void BaseTriggerAction::serialize(cocostudio::CocoLoader* /*cocoLoader*/, cocostudio::stExpCocoNode* /*cocoNode*/)
- {
- }
- void BaseTriggerAction::removeAll()
- {
- }
- TriggerObj::TriggerObj(void)
- :_id(UINT_MAX)
- ,_enabled(true)
- {
- }
- TriggerObj::~TriggerObj(void)
- {
- }
- bool TriggerObj::init()
- {
- return true;
- }
- TriggerObj* TriggerObj::create()
- {
- TriggerObj * pRet = new (std::nothrow) TriggerObj();
- if (pRet && pRet->init())
- {
- pRet->autorelease();
- }
- else
- {
- CC_SAFE_DELETE(pRet);
- }
- return pRet;
- }
- bool TriggerObj::detect()
- {
- if (!_enabled || _cons.empty())
- {
- return true;
- }
-
- bool ret = false;
- for (const auto& con : _cons)
- {
- ret = ret || con->detect();
- }
- return ret;
- }
- void TriggerObj::done()
- {
- if (!_enabled || _acts.empty())
- {
- return;
- }
- for (const auto& act : _acts)
- {
- act->done();
- }
- }
- void TriggerObj::removeAll()
- {
- for (const auto& con : _cons)
- {
- con->removeAll();
- }
-
- for (const auto& act : _acts)
- {
- act->removeAll();
- }
- for (const auto& lis : _listeners)
- {
- TriggerMng::getInstance()->removeEventListener(lis);
- }
-
- _cons.clear();
- _acts.clear();
- _listeners.clear();
- }
- void TriggerObj::serialize(const rapidjson::Value &val)
- {
- _id = (unsigned int)(DICTOOL->getIntValue_json(val, "id"));
- int count = DICTOOL->getArrayCount_json(val, "conditions");
- for (int i = 0; i < count; ++i)
- {
- const rapidjson::Value &subDict = DICTOOL->getSubDictionary_json(val, "conditions", i);
- const char *classname = DICTOOL->getStringValue_json(subDict, "classname");
- if (classname == nullptr)
- {
- continue;
- }
- BaseTriggerCondition *con = dynamic_cast<BaseTriggerCondition*>(ObjectFactory::getInstance()->createObject(classname));
- if(con == nullptr)
- {
- CCLOG("class %s can not be implemented!", classname);
- CCASSERT(con != nullptr, "con can't be nullptr!");
- }
-
- CCASSERT(con != nullptr, "con can't be nullptr!");
- con->serialize(subDict);
- con->init();
- _cons.pushBack(con);
- }
-
- count = DICTOOL->getArrayCount_json(val, "actions");
- for (int i = 0; i < count; ++i)
- {
- const rapidjson::Value &subDict = DICTOOL->getSubDictionary_json(val, "actions", i);
- const char *classname = DICTOOL->getStringValue_json(subDict, "classname");
- if (classname == nullptr)
- {
- continue;
- }
- BaseTriggerAction *act = dynamic_cast<BaseTriggerAction*>(ObjectFactory::getInstance()->createObject(classname));
- if(act == nullptr)
- {
- CCLOG("class %s can not be implemented!", classname);
- CCASSERT(act != nullptr, "act can't be nullptr!");
- }
- act->serialize(subDict);
- act->init();
- _acts.pushBack(act);
- }
- int length = DICTOOL->getArrayCount_json(val, "events");
- for (int i = 0; i < length; ++i)
- {
- const rapidjson::Value &sub = DICTOOL->getSubDictionary_json(val, "events", i);
- int event = DICTOOL->getIntValue_json(sub, "id");
- if (event < 0)
- {
- continue;
- }
- char buf[10];
- sprintf(buf, "%d", event);
- std::string custom_event_name(buf);
- EventListenerCustom* listener = EventListenerCustom::create(custom_event_name, [=](EventCustom* /*evt*/){
- if (detect())
- {
- done();
- }
- });
- _listeners.pushBack(listener);
- TriggerMng::getInstance()->addEventListenerWithFixedPriority(listener, 1);
- }
- }
-
- void TriggerObj::serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)
- {
- int length = pCocoNode->GetChildNum();
- int count = 0;
- int num = 0;
- stExpCocoNode *pTriggerObjArray = pCocoNode->GetChildArray(pCocoLoader);
- for (int i0 = 0; i0 < length; ++i0)
- {
- std::string key = pTriggerObjArray[i0].GetName(pCocoLoader);
- const char* str0 = pTriggerObjArray[i0].GetValue(pCocoLoader);
- if (key.compare("id") == 0)
- {
- if (str0 != nullptr)
- {
- _id = atoi(str0);
- }
- }
- else if (key.compare("conditions") == 0)
- {
- count = pTriggerObjArray[i0].GetChildNum();
- stExpCocoNode *pConditionsArray = pTriggerObjArray[i0].GetChildArray(pCocoLoader);
- for (int i1 = 0; i1 < count; ++i1)
- {
- num = pConditionsArray[i1].GetChildNum();
- stExpCocoNode *pConditionArray = pConditionsArray[i1].GetChildArray(pCocoLoader);
- const char *classname = pConditionArray[0].GetValue(pCocoLoader);
- if (classname == nullptr)
- {
- continue;
- }
- BaseTriggerCondition *con = dynamic_cast<BaseTriggerCondition*>(ObjectFactory::getInstance()->createObject(classname));
- CCAssert(con != nullptr, "class named classname can not implement!");
- con->serialize(pCocoLoader, &pConditionArray[1]);
- con->init();
- _cons.pushBack(con);
- }
- }
- else if (key.compare("actions") == 0)
- {
- count = pTriggerObjArray[i0].GetChildNum();
- stExpCocoNode *pActionsArray = pTriggerObjArray[i0].GetChildArray(pCocoLoader);
- for (int i2 = 0; i2 < count; ++i2)
- {
- num = pActionsArray[i2].GetChildNum();
- stExpCocoNode *pActionArray = pActionsArray[i2].GetChildArray(pCocoLoader);
- const char *classname = pActionArray[0].GetValue(pCocoLoader);
- if (classname == nullptr)
- {
- continue;
- }
- BaseTriggerAction *act = dynamic_cast<BaseTriggerAction*>(ObjectFactory::getInstance()->createObject(classname));
- CCAssert(act != nullptr, "class named classname can not implement!");
- act->serialize(pCocoLoader, &pActionArray[1]);
- act->init();
- _acts.pushBack(act);
- }
- }
- else if (key.compare("events") == 0)
- {
- count = pTriggerObjArray[i0].GetChildNum();
- stExpCocoNode *pEventsArray = pTriggerObjArray[i0].GetChildArray(pCocoLoader);
- for (int i3 = 0; i3 < count; ++i3)
- {
- num = pEventsArray[i3].GetChildNum();
- stExpCocoNode *pEventArray = pEventsArray[i3].GetChildArray(pCocoLoader);
- const char *str1 = pEventArray[0].GetValue(pCocoLoader);
- if (str1 == nullptr)
- {
- continue;
- }
- int event = atoi(str1);
- if (event < 0)
- {
- continue;
- }
- char buf[10];
- sprintf(buf, "%d", event);
- std::string custom_event_name(buf);
-
- EventListenerCustom* listener = EventListenerCustom::create(custom_event_name, [=](EventCustom* /*evt*/){
- if (detect())
- {
- done();
- }
- });
- _listeners.pushBack(listener);
- TriggerMng::getInstance()->addEventListenerWithFixedPriority(listener, 1);
- }
- }
- }
- }
-
- unsigned int TriggerObj::getId()
- {
- return _id;
- }
- void TriggerObj::setEnabled(bool enabled)
- {
- _enabled = enabled;
- }
-
- }
|