IAPCtlShopUI.cpp 24 KB

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