IAPCtlShopUI.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. //
  2. // IAPCtlShopUI.cpp
  3. // TileManor
  4. //
  5. // Created by 徐炼新 on 2024/1/16.
  6. //
  7. #include "IAPCtlShop.hpp"
  8. #include "ui/UIPageView.h"
  9. #include "RUUtils.h"
  10. #include "RUPlatform.h"
  11. #include "IAPConf.hpp"
  12. #include "IAPCtlShopUI.hpp"
  13. #include "IAPCtlShopItem.hpp"
  14. #include "IAPDefine.hpp"
  15. #include "IAPCardView.hpp"
  16. #include "IAPRunTimeData.hpp"
  17. #include <regex>
  18. IAPCtlShopUI* IAPCtlShopUI::_instance = nullptr;
  19. IAPCtlShopUI* IAPCtlShopUI::getInstance() {
  20. if (_instance == nullptr) {
  21. _instance = new IAPCtlShopUI();
  22. _instance->autorelease();
  23. _instance->retain();
  24. }
  25. return _instance;
  26. }
  27. IAPCtlShopUI::IAPCtlShopUI() {
  28. }
  29. IAPCtlShopUI::~IAPCtlShopUI() {
  30. }
  31. bool IAPCtlShopUI::isShowing() {
  32. return _bUIShowing;
  33. }
  34. void IAPCtlShopUI::clear() {
  35. _goodsInfo.clear();
  36. for (auto& gi : _goodsItems) {
  37. gi->release();
  38. }
  39. _goodsItems.clear();
  40. _placementItems.clear();
  41. _failItems.clear();
  42. for(const auto& placement : _placements){
  43. _indicators[placement.first].clear();
  44. }
  45. _allSizes.clear();
  46. _cb = nullptr;
  47. }
  48. bool IAPCtlShopUI::create(Node* pNode, IAPConf* cfg, iapshop::ShopRequirement& requirement,int placementId) {
  49. redutils::Platform::getInstance()->reportLog("open iap");
  50. _cfg = cfg;
  51. _bUIShowing = true;
  52. _placementId = placementId;
  53. clear();
  54. _layer = redutils::RUReboltLayer::createReboltLayer("shop_interface.redream");
  55. pNode->addChild(_layer, 3);
  56. _layer->registerOnNotify([this](const redutils::ReboltNotifyData& data){
  57. _onNotifyDevelopment(data);
  58. });
  59. _layer->runBehaviacWhitFunName("初始化");
  60. // _igCoin->doOwnInit();
  61. if (_goodsInfo.size() == 0) {
  62. IAPConf::getInstance()->getAllGoods(_goodsInfo);
  63. }
  64. // 构建 list 区域
  65. constructShopItem(false, requirement);
  66. cocos2d::Size size = _ndScrollArea->getContentSize();
  67. _tableView = redutils::RUTableView::create(&_tableData, cocos2d::Size(size.width, size.height));
  68. _tableView->setCascadeOpacityEnabled(true);
  69. _tableView->setCascadeColorEnabled(true);
  70. _tableView->setDirection(ScrollViewSmooth::Direction::VERTICAL);
  71. _tableView->setVerticalFillOrder(TableViewSmooth::VerticalFillOrder::TOP_DOWN, false);
  72. _tableView->setDelegate(&_tableData);
  73. _tableView->setBounceable(true);
  74. // _tableView->setOutSightClean(false);
  75. _ndScrollArea->addChild(_tableView);
  76. return true;
  77. }
  78. bool IAPCtlShopUI::addAPlacement(const iapshop::IAPPlacement &plInfo){
  79. // 如果该活动ID存在,则添加失败
  80. if(_placements.count(plInfo.id) != 0)return false;
  81. _placements[plInfo.id] = plInfo;
  82. std::vector<Node*> nodeVec;
  83. _indicators[plInfo.id] = nodeVec;
  84. return true;
  85. }
  86. void IAPCtlShopUI::removePlacement(const std::string &id){
  87. _placements.erase(id);
  88. _indicators.erase(id);
  89. }
  90. bool IAPCtlShopUI::addCardToPlacement(const std::string &id, iapshop::IAPCard *card){
  91. if(_placements.count(id) == 0)return false;
  92. _placements[id].cards.push_back(card);
  93. return true;
  94. }
  95. bool IAPCtlShopUI::removeCardToPlacement(const std::string id, int cardIndex){
  96. if(_placements.count(id) == 0)return false;
  97. if(cardIndex < 0 || cardIndex >= _placements[id].cards.size()){
  98. return false;
  99. }
  100. _placements[id].cards.erase(_placements[id].cards.begin() + cardIndex);
  101. return true;
  102. }
  103. void IAPCtlShopUI::clearPlacement(){
  104. _placements.clear();
  105. _indicators.clear();
  106. }
  107. size_t IAPCtlShopUI::getPlacementCount(){
  108. return _placements.size();
  109. }
  110. void IAPCtlShopUI::_onNotifyDevelopment(const redutils::ReboltNotifyData& data) {
  111. if (data.notify == "绑定显示区域") {
  112. _ndScrollArea = data.outNode;
  113. } else if (data.notify == "绑定coin节点") {
  114. // _igCoin = new MapIGCoin(data.reboltRedManager);
  115. } else if (data.notify == "退出") {
  116. auto rm = RemoveSelf::create();
  117. auto cf = CallFunc::create([=]() {
  118. _layer->removeFromParent();
  119. _layer = nullptr;
  120. _bUIShowing = false;
  121. redutils::Platform::getInstance()->reportLog("iap closed");
  122. });
  123. _layer->runAction(Sequence::create(rm, cf, NULL));
  124. if (_cb) {
  125. _cb();
  126. }
  127. _cb = nullptr;
  128. }
  129. }
  130. void IAPCtlShopUI::constructShopItem(bool bShowAll, iapshop::ShopRequirement& requirement) {
  131. int index = 0;
  132. _tableData.setCascadeOpacity(true);
  133. _tableData.clear();
  134. cocos2d::Size size = _ndScrollArea->getContentSize();
  135. auto delayIdx = 0;
  136. cocos2d::Vec2 offset(size.width, 0);
  137. float dur = 0.4;
  138. int height = 0;
  139. // 加入一个表头
  140. {
  141. Node* nd = Node::create();
  142. _tableData.insertCell(index++, nd);
  143. int h = size.height*0.08;
  144. _allSizes.push_back(cocos2d::Size(size.width, h));
  145. height += h;
  146. }
  147. // 开始构建
  148. // 获取礼包信息
  149. IAPConf::getInstance()->getAllGoods(_goodsInfo);
  150. // 获取版位信息
  151. int bigPackCount,smallPackCount; // 需要显示的礼包
  152. auto iapCtlShop = iapshop::IAPCtlShop::createWith();
  153. auto userBuyType = iapshop::IAPRunTimeData::getInstance()->getUserBuyType();
  154. int leval = iapshop::IAPRunTimeData::getInstance()->getDeviceLevel(); //获取设备等级
  155. size_t placementCount = iapCtlShop->getPlacementCount(); // 获取活动礼包数量
  156. switch(leval){
  157. case 1:
  158. // 低等级
  159. bigPackCount = 2;
  160. smallPackCount = 1;
  161. break;
  162. case 2:
  163. // 中等级
  164. break;
  165. case 3:
  166. if(placementCount >= 2){
  167. bigPackCount = 3;
  168. smallPackCount = 0;
  169. }else{
  170. bigPackCount = 2;
  171. smallPackCount = 2;
  172. }
  173. // 高等级
  174. break;
  175. default:
  176. break;
  177. }
  178. // 展示活动礼包
  179. if(_placements.size() != 0){
  180. for(const auto& placement : _placements){
  181. bool isShow = false;
  182. if(bShowAll){
  183. isShow = true;
  184. }else{
  185. if(bigPackCount > 0){
  186. isShow = true;
  187. bigPackCount--;
  188. }
  189. }
  190. if(isShow){
  191. // 展示活动版位
  192. bool bNeedAnim = height <= size.height;
  193. Node* nd = Node::create();
  194. nd->setAnchorPoint(Vec2(0.5,0.5));
  195. nd->setContentSize(cocos2d::Size(584,250));
  196. nd->setCascadeOpacityEnabled(true);
  197. nd->setCascadeColorEnabled(true);
  198. auto si = createPlacementUI(placement.second);
  199. auto sz = cocos2d::Size(584,280);
  200. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  201. nd->addChild(si);
  202. si->setPosition(bNeedAnim ? pos+offset : pos);
  203. _placementItems.push_back(nd);
  204. _tableData.insertCell(index++, nd);
  205. _allSizes.push_back(sz);
  206. height += sz.height;
  207. if (bNeedAnim) {
  208. // 加入动画
  209. auto d = DelayTime::create(delayIdx*dur/8.0);
  210. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  211. si->runAction(Sequence::create(d, m, NULL));
  212. delayIdx ++;
  213. }
  214. }
  215. }
  216. }
  217. // 根据用户类型进行礼包排序
  218. switch (userBuyType) {
  219. case iapshop::UserBuyType::NoShopping:
  220. sortGoods(true);
  221. break;
  222. case iapshop::UserBuyType::LittleShopping:
  223. sortGoods(true);
  224. break;
  225. case iapshop::UserBuyType::NormalShopping:
  226. sortGoods(true);
  227. break;
  228. case iapshop::UserBuyType::LotShopping:
  229. sortGoods(false);
  230. break;
  231. default:
  232. break;
  233. }
  234. // 判断是否展示全部
  235. if(!bShowAll){
  236. // 不展示全部,过滤掉不合格的礼包
  237. filterGoods(requirement);
  238. }
  239. // 判断是否为正常消费
  240. if(userBuyType == iapshop::UserBuyType::NormalShopping && !bShowAll){
  241. // (当前已按 大礼包 > 小礼包,金额小 > 金额大 的优先级排序)
  242. // 获取购买过的最大金额
  243. float maxn = iapshop::IAPRunTimeData::getInstance()->getUserBuyMaxAmount();
  244. // 构建大礼包
  245. if(bigPackCount == 2){
  246. // 查找购买过的最高金额更高一级对应的常规礼包
  247. int nowAmount = INT_MAX;
  248. int nowIndex = -1;
  249. for(int i = 0; i < _goodsInfo.size(); i++){
  250. if(_goodsInfo[i].type != "panel")continue;
  251. if(_goodsInfo[i].getCostNumber() <= maxn)continue;
  252. if(nowAmount > _goodsInfo[i].getCostNumber()){
  253. nowAmount = _goodsInfo[i].getCostNumber();
  254. nowIndex = i;
  255. }
  256. }
  257. if(nowIndex != -1){
  258. bool bNeedAnim = height <= size.height;
  259. Node* nd = Node::create();
  260. nd->setCascadeOpacityEnabled(true);
  261. nd->setCascadeColorEnabled(true);
  262. auto si = IAPCtlShopItem::create(_goodsInfo[nowIndex], _placementId);
  263. auto sz = si->getSize();
  264. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  265. nd->addChild(si);
  266. si->setPosition(bNeedAnim ? pos+offset : pos);
  267. _goodsItems.push_back(si);
  268. _tableData.insertCell(index++, nd);
  269. _allSizes.push_back(sz);
  270. height += sz.height;
  271. if (bNeedAnim) {
  272. // 加入动画
  273. auto d = DelayTime::create(delayIdx*dur/8.0);
  274. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  275. si->runAction(Sequence::create(d, m, NULL));
  276. delayIdx ++;
  277. }
  278. }
  279. bigPackCount--;
  280. }
  281. if(bigPackCount == 1){
  282. // 查找购买过最高金额所对应的常规礼包
  283. int nowAmount = INT_MIN;
  284. int nowIndex = -1;
  285. for(int i = 0; i < _goodsInfo.size(); i++){
  286. if(_goodsInfo[i].type != "panel")continue;
  287. if(_goodsInfo[i].getCostNumber() > maxn)continue;
  288. if(nowAmount <= _goodsInfo[i].getCostNumber()){
  289. nowAmount = _goodsInfo[i].getCostNumber();
  290. nowIndex = i;
  291. }
  292. }
  293. if(nowIndex != -1){
  294. bool bNeedAnim = height <= size.height;
  295. Node* nd = Node::create();
  296. nd->setCascadeOpacityEnabled(true);
  297. nd->setCascadeColorEnabled(true);
  298. auto si = IAPCtlShopItem::create(_goodsInfo[nowIndex], _placementId);
  299. auto sz = si->getSize();
  300. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  301. nd->addChild(si);
  302. si->setPosition(bNeedAnim ? pos+offset : pos);
  303. _goodsItems.push_back(si);
  304. _tableData.insertCell(index++, nd);
  305. _allSizes.push_back(sz);
  306. height += sz.height;
  307. if (bNeedAnim) {
  308. // 加入动画
  309. auto d = DelayTime::create(delayIdx*dur/8.0);
  310. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  311. si->runAction(Sequence::create(d, m, NULL));
  312. delayIdx ++;
  313. }
  314. }
  315. bigPackCount--;
  316. }
  317. // 构建小礼包
  318. if(smallPackCount == 2){
  319. // 查找购买过的最高金额更高一级对应的金币礼包
  320. int nowAmount = INT_MAX;
  321. int nowIndex = -1;
  322. for(int i = 0; i < _goodsInfo.size(); i++){
  323. if(_goodsInfo[i].type != "bar")continue;
  324. if(_goodsInfo[i].getCostNumber() <= maxn)continue;
  325. if(nowAmount > _goodsInfo[i].getCostNumber()){
  326. nowAmount = _goodsInfo[i].getCostNumber();
  327. nowIndex = i;
  328. }
  329. }
  330. if(nowIndex != -1){
  331. bool bNeedAnim = height <= size.height;
  332. Node* nd = Node::create();
  333. nd->setCascadeOpacityEnabled(true);
  334. nd->setCascadeColorEnabled(true);
  335. auto si = IAPCtlShopItem::create(_goodsInfo[nowIndex], _placementId);
  336. auto sz = si->getSize();
  337. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  338. nd->addChild(si);
  339. si->setPosition(bNeedAnim ? pos+offset : pos);
  340. _goodsItems.push_back(si);
  341. _tableData.insertCell(index++, nd);
  342. _allSizes.push_back(sz);
  343. height += sz.height;
  344. if (bNeedAnim) {
  345. // 加入动画
  346. auto d = DelayTime::create(delayIdx*dur/8.0);
  347. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  348. si->runAction(Sequence::create(d, m, NULL));
  349. delayIdx ++;
  350. }
  351. }
  352. smallPackCount--;
  353. }
  354. if(smallPackCount == 1){
  355. // 查找购买过最高金额所对应的金币礼包
  356. int nowAmount = INT_MIN;
  357. int nowIndex = -1;
  358. for(int i = 0; i < _goodsInfo.size(); i++){
  359. if(_goodsInfo[i].type != "bar")continue;
  360. if(_goodsInfo[i].getCostNumber() > maxn)continue;
  361. if(nowAmount <= _goodsInfo[i].getCostNumber()){
  362. nowAmount = _goodsInfo[i].getCostNumber();
  363. nowIndex = i;
  364. }
  365. }
  366. if(nowIndex != -1){
  367. bool bNeedAnim = height <= size.height;
  368. Node* nd = Node::create();
  369. nd->setCascadeOpacityEnabled(true);
  370. nd->setCascadeColorEnabled(true);
  371. auto si = IAPCtlShopItem::create(_goodsInfo[nowIndex], _placementId);
  372. auto sz = si->getSize();
  373. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  374. nd->addChild(si);
  375. si->setPosition(bNeedAnim ? pos+offset : pos);
  376. _goodsItems.push_back(si);
  377. _tableData.insertCell(index++, nd);
  378. _allSizes.push_back(sz);
  379. height += sz.height;
  380. if (bNeedAnim) {
  381. // 加入动画
  382. auto d = DelayTime::create(delayIdx*dur/8.0);
  383. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  384. si->runAction(Sequence::create(d, m, NULL));
  385. delayIdx ++;
  386. }
  387. }
  388. smallPackCount--;
  389. }
  390. }else{
  391. // 判断是否还有版位
  392. if(bigPackCount != 0 || smallPackCount != 0 || bShowAll){
  393. // 显示常规商品
  394. for (const auto& gi : _goodsInfo) {
  395. // 判断是否显示
  396. bool isShow = false;
  397. if (bShowAll) {
  398. isShow = true;
  399. }else{
  400. if(gi.type == "panel" && bigPackCount > 0){
  401. isShow = true;
  402. bigPackCount--;
  403. }
  404. if(gi.type == "bar" && smallPackCount > 0){
  405. isShow = true;
  406. smallPackCount--;
  407. }
  408. }
  409. // 商品显示
  410. if (isShow) {
  411. bool bNeedAnim = height <= size.height;
  412. Node* nd = Node::create();
  413. nd->setCascadeOpacityEnabled(true);
  414. nd->setCascadeColorEnabled(true);
  415. auto si = IAPCtlShopItem::create(gi, _placementId);
  416. auto sz = si->getSize();
  417. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  418. nd->addChild(si);
  419. si->setPosition(bNeedAnim ? pos+offset : pos);
  420. _goodsItems.push_back(si);
  421. _tableData.insertCell(index++, nd);
  422. _allSizes.push_back(sz);
  423. height += sz.height;
  424. if (bNeedAnim) {
  425. // 加入动画
  426. auto d = DelayTime::create(delayIdx*dur/8.0);
  427. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  428. si->runAction(Sequence::create(d, m, NULL));
  429. delayIdx ++;
  430. }
  431. }
  432. }
  433. }
  434. }
  435. // 添加展示所有按钮
  436. if (!bShowAll) {
  437. // 加入show All btn, 这个是一定会有动画的
  438. auto sz = cocos2d::Size(584, 130);
  439. Node* nd = Node::create();
  440. nd->setCascadeOpacityEnabled(true);
  441. nd->setCascadeColorEnabled(true);
  442. _btnShowAll = redutils::RUReboltLayer::createReboltLayer("shop_more_btn.redream");
  443. nd->addChild(_btnShowAll);
  444. _btnShowAll->setPosition(Vec2(size.width/2.0, sz.height/2.0) + offset);
  445. _tableData.insertCell(index++, nd);
  446. _btnShowAll->registerOnNotify([this](const redutils::ReboltNotifyData& data){
  447. if (data.notify == "点击") {
  448. auto rm = RemoveSelf::create();
  449. auto cf = CallFunc::create([=](){
  450. _btnShowAll = NULL;
  451. _tableData.clear();
  452. _goodsItems.clear();
  453. _placementItems.clear();
  454. for(const auto& placement : _placements){
  455. _indicators[placement.first].clear();
  456. }
  457. _allSizes.clear();
  458. iapshop::ShopRequirement req;
  459. req.coinsMin = 0;
  460. constructShopItem(true, req);
  461. _tableView->reloadData(true);
  462. });
  463. _btnShowAll->runAction(Sequence::create(rm, cf, NULL));
  464. }
  465. });
  466. redutils::iterateNode(nd, [](Node* nd){
  467. nd->setCascadeOpacityEnabled(true);
  468. nd->setCascadeColorEnabled(true);
  469. });
  470. _btnShowAll->runBehaviacWhitFunName("初始化");
  471. _allSizes.push_back(sz);
  472. // 加入动画
  473. auto d = DelayTime::create(delayIdx*dur/8.0);
  474. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  475. _btnShowAll->runAction(Sequence::create(d, m, NULL));
  476. delayIdx ++;
  477. } else {
  478. // 底部添加一个额外节点(一个是底部的广告,还有就是美观一些)
  479. _tableData.insertCell(index++, Node::create());
  480. _allSizes.push_back(cocos2d::Size(584, 150));
  481. }
  482. _tableData._numberOfCellsInTableView = [=](cocos2d::extension::TableViewSmooth*)->ssize_t{
  483. return _allSizes.size();
  484. };
  485. _tableData._tableCellSizeForIndex = [=](cocos2d::extension::TableViewSmooth*, ssize_t idx)->Size{
  486. if (idx < _allSizes.size()) {
  487. return _allSizes[idx];
  488. } else {
  489. return Size(0,0);
  490. }
  491. };
  492. // 防止拉动的时候才创建
  493. _layer->scheduleOnce([=](float){
  494. for (int i=0; i<_allSizes.size(); i++) {
  495. _tableView->updateCellAtIndex(i);
  496. }
  497. }, 0.05, "SCH_Update_Cells");
  498. }
  499. Node* IAPCtlShopUI::createPlacementUI(const iapshop::IAPPlacement& placement){
  500. Node* node = Node::create();
  501. IAPCardView::sDotCfg cfg;
  502. cfg.hightSp = "内购版位_通用_图标_滑动点_已选中.png";
  503. cfg.normalSp = "内购版位_通用_图标_滑动点_未选中.png";
  504. cfg.sepWidth = 30.0f;
  505. cfg.yStart = 0;
  506. cocos2d::Size sz = cocos2d::Size(584, 250);
  507. IAPCardView* cardView = IAPCardView::create(sz, cfg);
  508. // 遍历 placement 中的卡片,依次创建并添加到 PageView 中
  509. for (int i = 0; i < placement.cards.size(); i++) {
  510. cardView->addCard(placement.cards[i]->create());
  511. }
  512. // 将 PageView 添加到父节点 node 中
  513. node->addChild(cardView);
  514. return node;
  515. }
  516. void IAPCtlShopUI::filterGoods(iapshop::ShopRequirement &requirement){
  517. std::map<int, bool> m;
  518. int cnt = 0;
  519. for(const auto& goodInfo : _goodsInfo){
  520. if(goodInfo.getCoinNumber() >= requirement.coinsMin){
  521. m[cnt] = true;
  522. }
  523. cnt++;
  524. }
  525. std::vector<GoodsInfo> newGoodsInfo;
  526. // 添加符合条件的礼包
  527. for(int i = 0;i < _goodsInfo.size(); i++){
  528. if(m[i]){
  529. newGoodsInfo.push_back(_goodsInfo[i]);
  530. }
  531. }
  532. // 添加不符合条件的礼包(不清楚是不是需要显示,暂放到列表末尾)
  533. // for(int i = 0;i < _goodsInfo.size(); i++){
  534. // if(!m[i]){
  535. // newGoodsInfo.push_back(_goodsInfo[i]);
  536. // }
  537. // }
  538. _goodsInfo = newGoodsInfo;
  539. }
  540. void IAPCtlShopUI::sortGoods(bool flag){
  541. sort(_goodsInfo.begin(), _goodsInfo.end(), [flag](GoodsInfo a, GoodsInfo b){
  542. if(a.getTypeValue() != b.getTypeValue())return a.getTypeValue() > b.getTypeValue();
  543. if(flag) return a.getCostNumber() < b.getCostNumber();
  544. else return a.getCostNumber() > b.getCostNumber();
  545. });
  546. }
  547. void IAPCtlShopUI::quit() {
  548. if (_layer) {
  549. _layer->runBehaviacWhitFunName("退出");
  550. }
  551. }