// // CtlSucessProcess.cpp // TileManor // // Created by 徐炼新 on 2024/1/25. // #include "IAPSucessProcess.hpp" #include "RUQCoreLayer.h" #include "RUUtils.h" IAPSucessProcess* IAPSucessProcess::create(const GoodsInfo& gi) { auto nCP = new IAPSucessProcess(); nCP->autorelease(); nCP->retain(); nCP->init(gi); return nCP; } IAPSucessProcess::IAPSucessProcess() { } IAPSucessProcess::~IAPSucessProcess() { } void IAPSucessProcess::init(const GoodsInfo& gi) { _goodsInfo = gi; _cntCollecting = 0; // for (int i=0; i<6; i++) { NdReward nd; _ndsReward.push_back(nd); } // 确定要用到的奖励界面资源 const char* resName = nullptr; if (gi.areas.size() == 1) { // 只有金币 resName = "shop_buy_success_4.redream"; } else if (gi.areas.size() == 2) { // 金币和普通道具(只有数量) resName = "shop_buy_success_5.redream"; } else { if (gi.areas[2].size() == 2) { // 包含了两个限时奖励 resName = "shop_buy_success_1.redream"; } else { if (gi.areas[2][0].name.find("life") == 0) { resName = "shop_buy_success_3.redream"; } else { resName = "shop_buy_success_2.redream"; } } } // 在当前scene里面创建界面 auto parent = Director::getInstance()->getRunningScene(); _layer = redutils::RUReboltLayer::createReboltLayer(resName); parent->addChild(_layer); _layer->registerOnNotify([this](const redutils::ReboltNotifyData& data){ onNotifyDevelopment(data); }); _layer->runBehaviacWhitFunName("初始化"); // 设置数量和图片 setRewardInfo(); // 设置金币 _reboltMgr4Coin->setCoderDataVar("P-tCoinCnt", _goodsInfo.areas[0][0].count); _reboltMgr4Coin->runBehaviacWhitFunName("刷新"); } void IAPSucessProcess::onNotifyDevelopment(const redutils::ReboltNotifyData& data) { if (data.notify == "绑定光效1_1") { _ndsReward[0].light = data.outNode; } else if (data.notify == "绑定图片1_1") { _ndsReward[0].reward = data.outNode; } else if (data.notify == "绑定数字1_1") { _ndsReward[0].lbCnt = data.outNode; } else if (data.notify == "绑定光效1_2") { _ndsReward[1].light = data.outNode; } else if (data.notify == "绑定图片1_2") { _ndsReward[1].reward = data.outNode; } else if (data.notify == "绑定数字1_2") { _ndsReward[1].lbCnt = data.outNode; } else if (data.notify == "绑定光效1_3") { _ndsReward[2].light = data.outNode; } else if (data.notify == "绑定图片1_3") { _ndsReward[2].reward = data.outNode; } else if (data.notify == "绑定数字1_3") { _ndsReward[2].lbCnt = data.outNode; } else if (data.notify == "绑定光效1_4") { _ndsReward[3].light = data.outNode; } else if (data.notify == "绑定图片1_4") { _ndsReward[3].reward = data.outNode; } else if (data.notify == "绑定数字1_4") { _ndsReward[3].lbCnt = data.outNode; } else if (data.notify == "绑定光效2_2") { _ndsReward[4].light = data.outNode; } else if (data.notify == "绑定图片2_2") { _ndsReward[4].reward = data.outNode; } else if (data.notify == "绑定数字2_2") { _ndsReward[4].lbCnt = data.outNode; } else if (data.notify == "绑定光效2_1") { // Life _ndsReward[5].light = data.outNode; } else if (data.notify == "绑定图片2_1") { // Life _ndsReward[5].reward = data.outNode; } else if (data.notify == "绑定数字2_1") { // Life _ndsReward[5].lbCnt = data.outNode; } else if (data.notify == "绑定金币节点") { _item_coin = data.outNode; _reboltMgr4Coin = data.reboltRedManager; } else if (data.notify == "关闭") { if(_cntCollecting > 0) { // 正在收集,等待 } else { // 还需要再设置一遍 setRewardInfo(); acceptItems(); } } } void IAPSucessProcess::setRewardInfo() { if (_goodsInfo.areas.size() == 1) { } else if (_goodsInfo.areas.size() >= 2) { for (int i=0; i<_goodsInfo.areas[1].size(); i++) { auto lbCnt = dynamic_cast(_ndsReward[i].lbCnt); lbCnt->setString("x"+_goodsInfo.areas[1][i].count); // 设置图片 if (_goodsInfo.areas[1][i].name == "back1") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_1.png"); } else if (_goodsInfo.areas[1][i].name == "fetchtop3") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_2.png"); } else if (_goodsInfo.areas[1][i].name == "find3") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_3.png"); } else if (_goodsInfo.areas[1][i].name == "reroll") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_4.png"); } else if (_goodsInfo.areas[1][i].name == "plusone") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_5.png"); } else if (_goodsInfo.areas[1][i].name == "outside_find3") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_3.png"); } else if (_goodsInfo.areas[1][i].name == "outside_fetchtop3") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_4.png"); } else if (_goodsInfo.areas[1][i].name == "outside_shell3") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_5.png"); } else if (_goodsInfo.areas[1][i].name == "outside_claw") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_4.png"); } else if (_goodsInfo.areas[1][i].name == "outside_master_card") { dynamic_cast(_ndsReward[i].reward)->setSpriteFrame("gmui_prop_5.png"); } } if (_ndsReward[5].lbCnt) { auto lbCnt = dynamic_cast(_ndsReward[5].lbCnt); if (_goodsInfo.areas[2].size() > 1) { lbCnt->setString(_goodsInfo.areas[2][1].count); } else { lbCnt->setString(_goodsInfo.areas[2][0].count); } } if (_ndsReward[4].lbCnt) { auto lbCnt = dynamic_cast(_ndsReward[4].lbCnt); lbCnt->setString(_goodsInfo.areas[2][0].count); } } } void IAPSucessProcess::acceptItems() { // 走到这一步应该不会崩溃了,可以通知外部了 if (_cbWhileFinished) { _cbWhileFinished(); } // // // 获取各种奖励的入口节点 // auto nd4Meta = MapUIController::getInstance()->getNode4MetaGame(); // auto nd4Life = MapUIController::getInstance()->getLifeNode(); // // // 按照顺序来 // auto cb4Meta = [=](const ItemInGoods& item) { // auto metaSys = SystemManager::getInstance()->getMetaGameSystem(); // if (item.count.find("h") != std::string::npos) { // int hrs = atoi(item.count.substr(0, item.count.size()-1).c_str()); // metaSys->getSomeReward(item.name, 0, 0, hrs*60); // } else if (item.count.find("m") != std::string::npos) { // int mins = atoi(item.count.substr(0, item.count.size()-1).c_str()); // metaSys->getSomeReward(item.name, 0, 0, mins); // } else { // metaSys->getSomeReward(item.name, 0, atoi(item.count.c_str())); // } // }; // auto cb4Life = [=](const ItemInGoods& item) { // // 调整数值 // if (item.count.find("h") != std::string::npos) { // int hrs = atoi(item.count.substr(0, item.count.size()-1).c_str()); // UserDataManager::getInstance()->beginUnlimitedLife(hrs*60); // } else if (item.count.find("m") != std::string::npos) { // int mins = atoi(item.count.substr(0, item.count.size()-1).c_str()); // UserDataManager::getInstance()->beginUnlimitedLife(mins); // } // }; // // float delayIdx = 0; // float delayStep = 0.1; // // // 体力奖励 // if (_ndsReward[5].reward) { // if (_goodsInfo.areas[2].size() > 1) { // acceptItem(_ndsReward[5], nd4Life->getNd4Collect(), delayIdx*delayStep, _goodsInfo.areas[2][1], cb4Life); // } else { // acceptItem(_ndsReward[5], nd4Life->getNd4Collect(), delayIdx*delayStep, _goodsInfo.areas[2][0], cb4Life); // } // _cntCollecting ++; // delayIdx ++; // } // if (_ndsReward[4].reward) { // acceptItem(_ndsReward[4], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[2][0], cb4Meta); // delayIdx ++; // _cntCollecting ++; // } // // // 道具奖励 // if (_ndsReward[3].reward) { // acceptItem(_ndsReward[3], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][3], cb4Meta); // delayIdx ++; // _cntCollecting ++; // } // if (_ndsReward[2].reward) { // acceptItem(_ndsReward[2], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][2], cb4Meta); // delayIdx ++; // _cntCollecting ++; // } // if (_ndsReward[1].reward) { // acceptItem(_ndsReward[1], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][1], cb4Meta); // delayIdx ++; // _cntCollecting ++; // } // if (_ndsReward[0].reward) { // acceptItem(_ndsReward[0], nd4Meta, delayIdx*delayStep, _goodsInfo.areas[1][0], cb4Meta); // delayIdx ++; // _cntCollecting ++; // } // // coin // auto pos = _item_coin->getParent()->convertToWorldSpace(_item_coin->getPosition()); // pos = Director::getInstance()->getRunningScene()->convertToNodeSpace(pos); // MapUIUtils::getInstance()->flyCoins(pos, atoi(_goodsInfo.areas[0][0].count.c_str()), [=](){ // someCollected(); // }); // _cntCollecting ++; } void IAPSucessProcess::acceptItem(NdReward& nr, cocos2d::Node* tar, float delay, const ItemInGoods& iig, std::function finished) { // 在nd里面加入一个拖尾和例子效果 // 光效渐隐 { auto d = DelayTime::create(delay); auto f = FadeOut::create(0.1); nr.light->runAction(Sequence::create(d, f, NULL)); } // 数字渐隐 { auto d = DelayTime::create(delay); auto f = FadeOut::create(0.1); nr.lbCnt->runAction(Sequence::create(d, f, NULL)); } // 以贝塞尔的方式运动到目标节点 { auto posSrc = nr.reward->getPosition(); auto posDst = nr.reward->getParent()->convertToNodeSpace(tar->getParent()->convertToWorldSpace(tar->getPosition())); cocos2d::ccBezierConfig bc; bc.endPosition = posDst; bc.controlPoint_1 = posSrc + cocos2d::Vec2(0, posSrc.y < posDst.y ? -200 : 200); bc.controlPoint_2 = posDst + cocos2d::Vec2(0, posSrc.y < posDst.y ? -300 : 300); float dur = posDst.distance(posSrc) / 100.0 * 0.15; auto d = DelayTime::create(delay); auto m = EaseIn::create(BezierTo::create(dur, bc), 1.8); auto cf = CallFunc::create([=]() { // 处理回调 if (finished) { finished(iig); } someCollected(); }); auto f = FadeOut::create(0.05); nr.reward->runAction(Sequence::create(d, m, cf, f, NULL)); // 拖尾 { cocos2d::Node* ndParent = nr.reward->getParent(); auto ndCont = cocos2d::Node::create(); ndCont->setPosition(nr.reward->getPosition()); ndCont->setLocalZOrder(nr.reward->getLocalZOrder()-1); ndParent->addChild(ndCont); redutils::QCoreLayer* efxTail = redutils::QCoreLayer::Layer("efx_shop_tail.redream"); efxTail->playAnim("init"); ndCont->addChild(efxTail, 1); auto cf1 = CallFunc::create([=]() { redutils::iterateNode(efxTail, [](cocos2d::Node* nd){ auto sys = dynamic_cast(nd); if (sys) { sys->stopSystem(); } }); }); ndCont->runAction(Sequence::create(d->clone(), m->clone(), cf1, NULL)); cocos2d::MotionStreak* steak = MotionStreak::create(.1, 3, 80, Color3B::WHITE, "reward_tail.png"); ndParent->addChild(steak, nr.reward->getLocalZOrder()-2); steak->setPosition(nr.reward->getPosition()); BlendFunc bf = {GL_ONE, GL_ONE}; steak->setBlendFunc(bf); steak->runAction(Sequence::create(d->clone(), m->clone(), NULL)); } } } void IAPSucessProcess::someCollected() { _cntCollecting --; if (_cntCollecting == 0) { // 收集完成了 _layer->removeFromParent(); release(); EventCustom event("EVT_SHOP_SUCCESS"); event.setUserData((void*)true); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); } }