IAPSucessProcess.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. //
  2. // CtlSucessProcess.cpp
  3. // TileManor
  4. //
  5. // Created by 徐炼新 on 2024/1/25.
  6. //
  7. #include "IAPSucessProcess.hpp"
  8. #include "RUQCoreLayer.h"
  9. #include "RUUtils.h"
  10. IAPSucessProcess* IAPSucessProcess::create(const GoodsInfo& gi) {
  11. auto nCP = new IAPSucessProcess();
  12. nCP->autorelease();
  13. nCP->retain();
  14. nCP->init(gi);
  15. return nCP;
  16. }
  17. IAPSucessProcess::IAPSucessProcess() {
  18. }
  19. IAPSucessProcess::~IAPSucessProcess() {
  20. }
  21. void IAPSucessProcess::init(const GoodsInfo& gi) {
  22. _goodsInfo = gi;
  23. _cntCollecting = 0;
  24. //
  25. for (int i=0; i<6; i++) {
  26. NdReward nd;
  27. _ndsReward.push_back(nd);
  28. }
  29. // 确定要用到的奖励界面资源
  30. const char* resName = nullptr;
  31. if (gi.areas.size() == 1) {
  32. // 只有金币
  33. resName = "shop_buy_success_4.redream";
  34. } else if (gi.areas.size() == 2) {
  35. // 金币和普通道具(只有数量)
  36. resName = "shop_buy_success_5.redream";
  37. } else {
  38. if (gi.areas[2].size() == 2) {
  39. // 包含了两个限时奖励
  40. resName = "shop_buy_success_1.redream";
  41. } else {
  42. if (gi.areas[2][0].name.find("life") == 0) {
  43. resName = "shop_buy_success_3.redream";
  44. } else {
  45. resName = "shop_buy_success_2.redream";
  46. }
  47. }
  48. }
  49. // 在当前scene里面创建界面
  50. auto parent = Director::getInstance()->getRunningScene();
  51. _layer = redutils::RUReboltLayer::createReboltLayer(resName);
  52. parent->addChild(_layer);
  53. _layer->registerOnNotify([this](const redutils::ReboltNotifyData& data){
  54. onNotifyDevelopment(data);
  55. });
  56. _layer->runBehaviacWhitFunName("初始化");
  57. // 设置数量和图片
  58. setRewardInfo();
  59. // 设置金币
  60. _reboltMgr4Coin->setCoderDataVar("P-tCoinCnt", _goodsInfo.areas[0][0].count);
  61. _reboltMgr4Coin->runBehaviacWhitFunName("刷新");
  62. }
  63. void IAPSucessProcess::onNotifyDevelopment(const redutils::ReboltNotifyData& data) {
  64. if (data.notify == "绑定光效1_1") {
  65. _ndsReward[0].light = data.outNode;
  66. } else if (data.notify == "绑定图片1_1") {
  67. _ndsReward[0].reward = data.outNode;
  68. } else if (data.notify == "绑定数字1_1") {
  69. _ndsReward[0].lbCnt = data.outNode;
  70. }
  71. else if (data.notify == "绑定光效1_2") {
  72. _ndsReward[1].light = data.outNode;
  73. } else if (data.notify == "绑定图片1_2") {
  74. _ndsReward[1].reward = data.outNode;
  75. } else if (data.notify == "绑定数字1_2") {
  76. _ndsReward[1].lbCnt = data.outNode;
  77. }
  78. else if (data.notify == "绑定光效1_3") {
  79. _ndsReward[2].light = data.outNode;
  80. } else if (data.notify == "绑定图片1_3") {
  81. _ndsReward[2].reward = data.outNode;
  82. } else if (data.notify == "绑定数字1_3") {
  83. _ndsReward[2].lbCnt = data.outNode;
  84. }
  85. else if (data.notify == "绑定光效1_4") {
  86. _ndsReward[3].light = data.outNode;
  87. } else if (data.notify == "绑定图片1_4") {
  88. _ndsReward[3].reward = data.outNode;
  89. } else if (data.notify == "绑定数字1_4") {
  90. _ndsReward[3].lbCnt = data.outNode;
  91. }
  92. else if (data.notify == "绑定光效2_2") {
  93. _ndsReward[4].light = data.outNode;
  94. } else if (data.notify == "绑定图片2_2") {
  95. _ndsReward[4].reward = data.outNode;
  96. } else if (data.notify == "绑定数字2_2") {
  97. _ndsReward[4].lbCnt = data.outNode;
  98. }
  99. else if (data.notify == "绑定光效2_1") {
  100. // Life
  101. _ndsReward[5].light = data.outNode;
  102. } else if (data.notify == "绑定图片2_1") {
  103. // Life
  104. _ndsReward[5].reward = data.outNode;
  105. } else if (data.notify == "绑定数字2_1") {
  106. // Life
  107. _ndsReward[5].lbCnt = data.outNode;
  108. }
  109. else if (data.notify == "绑定金币节点") {
  110. _item_coin = data.outNode;
  111. _reboltMgr4Coin = data.reboltRedManager;
  112. }
  113. else if (data.notify == "关闭") {
  114. if(_cntCollecting > 0) {
  115. // 正在收集,等待
  116. } else {
  117. // 还需要再设置一遍
  118. setRewardInfo();
  119. acceptItems();
  120. }
  121. }
  122. }
  123. void IAPSucessProcess::setRewardInfo() {
  124. if (_goodsInfo.areas.size() == 1) {
  125. } else if (_goodsInfo.areas.size() >= 2) {
  126. for (int i=0; i<_goodsInfo.areas[1].size(); i++) {
  127. auto lbCnt = dynamic_cast<cocos2d::Label*>(_ndsReward[i].lbCnt);
  128. lbCnt->setString("x"+_goodsInfo.areas[1][i].count);
  129. // 设置图片
  130. if (_goodsInfo.areas[1][i].name == "back1") {
  131. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_1.png");
  132. } else if (_goodsInfo.areas[1][i].name == "fetchtop3") {
  133. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_2.png");
  134. } else if (_goodsInfo.areas[1][i].name == "find3") {
  135. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_3.png");
  136. } else if (_goodsInfo.areas[1][i].name == "reroll") {
  137. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_4.png");
  138. } else if (_goodsInfo.areas[1][i].name == "plusone") {
  139. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_5.png");
  140. } else if (_goodsInfo.areas[1][i].name == "outside_find3") {
  141. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_3.png");
  142. } else if (_goodsInfo.areas[1][i].name == "outside_fetchtop3") {
  143. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_4.png");
  144. } else if (_goodsInfo.areas[1][i].name == "outside_shell3") {
  145. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_5.png");
  146. } else if (_goodsInfo.areas[1][i].name == "outside_claw") {
  147. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_4.png");
  148. } else if (_goodsInfo.areas[1][i].name == "outside_master_card") {
  149. dynamic_cast<cocos2d::Sprite*>(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_5.png");
  150. }
  151. }
  152. if (_ndsReward[5].lbCnt) {
  153. auto lbCnt = dynamic_cast<cocos2d::Label*>(_ndsReward[5].lbCnt);
  154. if (_goodsInfo.areas[2].size() > 1) {
  155. lbCnt->setString(_goodsInfo.areas[2][1].count);
  156. } else {
  157. lbCnt->setString(_goodsInfo.areas[2][0].count);
  158. }
  159. }
  160. if (_ndsReward[4].lbCnt) {
  161. auto lbCnt = dynamic_cast<cocos2d::Label*>(_ndsReward[4].lbCnt);
  162. lbCnt->setString(_goodsInfo.areas[2][0].count);
  163. }
  164. }
  165. }
  166. void IAPSucessProcess::acceptItems() {
  167. // 走到这一步应该不会崩溃了,可以通知外部了
  168. if (_cbWhileFinished) {
  169. _cbWhileFinished();
  170. }
  171. //
  172. // // 获取各种奖励的入口节点
  173. // auto nd4Meta = MapUIController::getInstance()->getNode4MetaGame();
  174. // auto nd4Life = MapUIController::getInstance()->getLifeNode();
  175. //
  176. // // 按照顺序来
  177. // auto cb4Meta = [=](const ItemInGoods& item) {
  178. // auto metaSys = SystemManager::getInstance()->getMetaGameSystem();
  179. // if (item.count.find("h") != std::string::npos) {
  180. // int hrs = atoi(item.count.substr(0, item.count.size()-1).c_str());
  181. // metaSys->getSomeReward(item.name, 0, 0, hrs*60);
  182. // } else if (item.count.find("m") != std::string::npos) {
  183. // int mins = atoi(item.count.substr(0, item.count.size()-1).c_str());
  184. // metaSys->getSomeReward(item.name, 0, 0, mins);
  185. // } else {
  186. // metaSys->getSomeReward(item.name, 0, atoi(item.count.c_str()));
  187. // }
  188. // };
  189. // auto cb4Life = [=](const ItemInGoods& item) {
  190. // // 调整数值
  191. // if (item.count.find("h") != std::string::npos) {
  192. // int hrs = atoi(item.count.substr(0, item.count.size()-1).c_str());
  193. // UserDataManager::getInstance()->beginUnlimitedLife(hrs*60);
  194. // } else if (item.count.find("m") != std::string::npos) {
  195. // int mins = atoi(item.count.substr(0, item.count.size()-1).c_str());
  196. // UserDataManager::getInstance()->beginUnlimitedLife(mins);
  197. // }
  198. // };
  199. //
  200. // float delayIdx = 0;
  201. // float delayStep = 0.1;
  202. //
  203. // // 体力奖励
  204. // if (_ndsReward[5].reward) {
  205. // if (_goodsInfo.areas[2].size() > 1) {
  206. // acceptItem(_ndsReward[5], nd4Life->getNd4Collect(), delayIdx*delayStep, _goodsInfo.areas[2][1], cb4Life);
  207. // } else {
  208. // acceptItem(_ndsReward[5], nd4Life->getNd4Collect(), delayIdx*delayStep, _goodsInfo.areas[2][0], cb4Life);
  209. // }
  210. // _cntCollecting ++;
  211. // delayIdx ++;
  212. // }
  213. // if (_ndsReward[4].reward) {
  214. // acceptItem(_ndsReward[4], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[2][0], cb4Meta);
  215. // delayIdx ++;
  216. // _cntCollecting ++;
  217. // }
  218. //
  219. // // 道具奖励
  220. // if (_ndsReward[3].reward) {
  221. // acceptItem(_ndsReward[3], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][3], cb4Meta);
  222. // delayIdx ++;
  223. // _cntCollecting ++;
  224. // }
  225. // if (_ndsReward[2].reward) {
  226. // acceptItem(_ndsReward[2], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][2], cb4Meta);
  227. // delayIdx ++;
  228. // _cntCollecting ++;
  229. // }
  230. // if (_ndsReward[1].reward) {
  231. // acceptItem(_ndsReward[1], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][1], cb4Meta);
  232. // delayIdx ++;
  233. // _cntCollecting ++;
  234. // }
  235. // if (_ndsReward[0].reward) {
  236. // acceptItem(_ndsReward[0], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][0], cb4Meta);
  237. // delayIdx ++;
  238. // _cntCollecting ++;
  239. // }
  240. // // coin
  241. // auto pos = _item_coin->getParent()->convertToWorldSpace(_item_coin->getPosition());
  242. // pos = Director::getInstance()->getRunningScene()->convertToNodeSpace(pos);
  243. // MapUIUtils::getInstance()->flyCoins(pos, atoi(_goodsInfo.areas[0][0].count.c_str()), [=](){
  244. // someCollected();
  245. // });
  246. // _cntCollecting ++;
  247. }
  248. void IAPSucessProcess::acceptItem(NdReward& nr, cocos2d::Node* tar, float delay, const ItemInGoods& iig, std::function<void(const ItemInGoods&)> finished) {
  249. // 在nd里面加入一个拖尾和例子效果
  250. // 光效渐隐
  251. {
  252. auto d = DelayTime::create(delay);
  253. auto f = FadeOut::create(0.1);
  254. nr.light->runAction(Sequence::create(d, f, NULL));
  255. }
  256. // 数字渐隐
  257. {
  258. auto d = DelayTime::create(delay);
  259. auto f = FadeOut::create(0.1);
  260. nr.lbCnt->runAction(Sequence::create(d, f, NULL));
  261. }
  262. // 以贝塞尔的方式运动到目标节点
  263. {
  264. auto posSrc = nr.reward->getPosition();
  265. auto posDst = nr.reward->getParent()->convertToNodeSpace(tar->getParent()->convertToWorldSpace(tar->getPosition()));
  266. cocos2d::ccBezierConfig bc;
  267. bc.endPosition = posDst;
  268. bc.controlPoint_1 = posSrc + cocos2d::Vec2(0, posSrc.y < posDst.y ? -200 : 200);
  269. bc.controlPoint_2 = posDst + cocos2d::Vec2(0, posSrc.y < posDst.y ? -300 : 300);
  270. float dur = posDst.distance(posSrc) / 100.0 * 0.15;
  271. auto d = DelayTime::create(delay);
  272. auto m = EaseIn::create(BezierTo::create(dur, bc), 1.8);
  273. auto cf = CallFunc::create([=]() {
  274. // 处理回调
  275. if (finished) {
  276. finished(iig);
  277. }
  278. someCollected();
  279. });
  280. auto f = FadeOut::create(0.05);
  281. nr.reward->runAction(Sequence::create(d, m, cf, f, NULL));
  282. // 拖尾
  283. {
  284. cocos2d::Node* ndParent = nr.reward->getParent();
  285. auto ndCont = cocos2d::Node::create();
  286. ndCont->setPosition(nr.reward->getPosition());
  287. ndCont->setLocalZOrder(nr.reward->getLocalZOrder()-1);
  288. ndParent->addChild(ndCont);
  289. redutils::QCoreLayer* efxTail = redutils::QCoreLayer::Layer("efx_shop_tail.redream");
  290. efxTail->playAnim("init");
  291. ndCont->addChild(efxTail, 1);
  292. auto cf1 = CallFunc::create([=]() {
  293. redutils::iterateNode(efxTail, [](cocos2d::Node* nd){
  294. auto sys = dynamic_cast<cocos2d::ZMLCCParticleSystem*>(nd);
  295. if (sys) {
  296. sys->stopSystem();
  297. }
  298. });
  299. });
  300. ndCont->runAction(Sequence::create(d->clone(), m->clone(), cf1, NULL));
  301. cocos2d::MotionStreak* steak = MotionStreak::create(.1, 3, 80, Color3B::WHITE, "reward_tail.png");
  302. ndParent->addChild(steak, nr.reward->getLocalZOrder()-2);
  303. steak->setPosition(nr.reward->getPosition());
  304. BlendFunc bf = {GL_ONE, GL_ONE};
  305. steak->setBlendFunc(bf);
  306. steak->runAction(Sequence::create(d->clone(), m->clone(), NULL));
  307. }
  308. }
  309. }
  310. void IAPSucessProcess::someCollected() {
  311. _cntCollecting --;
  312. if (_cntCollecting == 0) {
  313. // 收集完成了
  314. _layer->removeFromParent();
  315. release();
  316. EventCustom event("EVT_SHOP_SUCCESS");
  317. event.setUserData((void*)true);
  318. Director::getInstance()->getEventDispatcher()->dispatchEvent(&event);
  319. }
  320. }