IAPCtlShopUI.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. //
  2. // IAPCtlShopUI.cpp
  3. // TileManor
  4. //
  5. // Created by 徐炼新 on 2024/1/16.
  6. //
  7. #include "IAPCtlShopUI.hpp"
  8. #include "IAPCtlShopItem.hpp"
  9. #include "RUUtils.h"
  10. #include "RUPlatform.h"
  11. IAPCtlShopUI* IAPCtlShopUI::_instance = nullptr;
  12. IAPCtlShopUI* IAPCtlShopUI::getInstance() {
  13. if (_instance == nullptr) {
  14. _instance = new IAPCtlShopUI();
  15. _instance->autorelease();
  16. _instance->retain();
  17. }
  18. return _instance;
  19. }
  20. IAPCtlShopUI::IAPCtlShopUI() {
  21. }
  22. IAPCtlShopUI::~IAPCtlShopUI() {
  23. }
  24. bool IAPCtlShopUI::isShowing() {
  25. return _bUIShowing;
  26. }
  27. void IAPCtlShopUI::clear() {
  28. _goodsInfo.clear();
  29. for (auto& gi : _goodsItems) {
  30. gi->release();
  31. }
  32. _goodsItems.clear();
  33. _allSizes.clear();
  34. _cb = nullptr;
  35. }
  36. bool IAPCtlShopUI::create(Node* pNode, IAPConf* cfg, int placementId) {
  37. redutils::Platform::getInstance()->reportLog("open iap");
  38. _cfg = cfg;
  39. _bUIShowing = true;
  40. _placementId = placementId;
  41. clear();
  42. _layer = redutils::RUReboltLayer::createReboltLayer("shop_interface.redream");
  43. pNode->addChild(_layer, 3);
  44. _layer->registerOnNotify([this](const redutils::ReboltNotifyData& data){
  45. _onNotifyDevelopment(data);
  46. });
  47. _layer->runBehaviacWhitFunName("初始化");
  48. // _igCoin->doOwnInit();
  49. if (_goodsInfo.size() == 0) {
  50. IAPConf::getInstance()->getAllGoods(_goodsInfo);
  51. }
  52. // 构建 list 区域
  53. constructShopItem(false);
  54. cocos2d::Size size = _ndScrollArea->getContentSize();
  55. _tableView = redutils::RUTableView::create(&_tableData, cocos2d::Size(size.width, size.height));
  56. _tableView->setCascadeOpacityEnabled(true);
  57. _tableView->setCascadeColorEnabled(true);
  58. _tableView->setDirection(ScrollViewSmooth::Direction::VERTICAL);
  59. _tableView->setVerticalFillOrder(TableViewSmooth::VerticalFillOrder::TOP_DOWN, false);
  60. _tableView->setDelegate(&_tableData);
  61. _tableView->setBounceable(true);
  62. // _tableView->setOutSightClean(false);
  63. _ndScrollArea->addChild(_tableView);
  64. return true;
  65. }
  66. void IAPCtlShopUI::_onNotifyDevelopment(const redutils::ReboltNotifyData& data) {
  67. if (data.notify == "绑定显示区域") {
  68. _ndScrollArea = data.outNode;
  69. } else if (data.notify == "绑定coin节点") {
  70. // _igCoin = new MapIGCoin(data.reboltRedManager);
  71. } else if (data.notify == "退出") {
  72. auto rm = RemoveSelf::create();
  73. auto cf = CallFunc::create([=]() {
  74. _layer->removeFromParent();
  75. _layer = nullptr;
  76. _bUIShowing = false;
  77. redutils::Platform::getInstance()->reportLog("iap closed");
  78. });
  79. _layer->runAction(Sequence::create(rm, cf, NULL));
  80. if (_cb) {
  81. _cb();
  82. }
  83. _cb = nullptr;
  84. }
  85. }
  86. void IAPCtlShopUI::constructShopItem(bool bShowAll) {
  87. int index = 0;
  88. _tableData.setCascadeOpacity(true);
  89. _tableData.clear();
  90. cocos2d::Size size = _ndScrollArea->getContentSize();
  91. auto delayIdx = 0;
  92. cocos2d::Vec2 offset(size.width, 0);
  93. float dur = 0.4;
  94. int height = 0;
  95. // 加入一个表头
  96. {
  97. Node* nd = Node::create();
  98. _tableData.insertCell(index++, nd);
  99. int h = size.height*0.08;
  100. _allSizes.push_back(cocos2d::Size(size.width, h));
  101. height += h;
  102. }
  103. // 当前有效的区域
  104. for (const auto& gi : _goodsInfo) {
  105. if (bShowAll || gi.always) {
  106. bool bNeedAnim = height <= size.height;
  107. Node* nd = Node::create();
  108. nd->setCascadeOpacityEnabled(true);
  109. nd->setCascadeColorEnabled(true);
  110. auto si = IAPCtlShopItem::create(gi, _placementId);
  111. auto sz = si->getSize();
  112. cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
  113. nd->addChild(si);
  114. si->setPosition(bNeedAnim ? pos+offset : pos);
  115. _goodsItems.push_back(si);
  116. _tableData.insertCell(index++, nd);
  117. _allSizes.push_back(sz);
  118. height += sz.height;
  119. if (bNeedAnim) {
  120. // 加入动画
  121. auto d = DelayTime::create(delayIdx*dur/8.0);
  122. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  123. si->runAction(Sequence::create(d, m, NULL));
  124. delayIdx ++;
  125. }
  126. }
  127. }
  128. if (!bShowAll) {
  129. // 加入show All btn, 这个是一定会有动画的
  130. auto sz = cocos2d::Size(584, 130);
  131. Node* nd = Node::create();
  132. nd->setCascadeOpacityEnabled(true);
  133. nd->setCascadeColorEnabled(true);
  134. _btnShowAll = redutils::RUReboltLayer::createReboltLayer("shop_more_btn.redream");
  135. nd->addChild(_btnShowAll);
  136. _btnShowAll->setPosition(Vec2(size.width/2.0, sz.height/2.0) + offset);
  137. _tableData.insertCell(index++, nd);
  138. _btnShowAll->registerOnNotify([this](const redutils::ReboltNotifyData& data){
  139. if (data.notify == "点击") {
  140. auto rm = RemoveSelf::create();
  141. auto cf = CallFunc::create([=](){
  142. _btnShowAll = NULL;
  143. _tableData.clear();
  144. _goodsItems.clear();
  145. _allSizes.clear();
  146. constructShopItem(true);
  147. _tableView->reloadData(true);
  148. });
  149. _btnShowAll->runAction(Sequence::create(rm, cf, NULL));
  150. }
  151. });
  152. redutils::iterateNode(nd, [](Node* nd){
  153. nd->setCascadeOpacityEnabled(true);
  154. nd->setCascadeColorEnabled(true);
  155. });
  156. _btnShowAll->runBehaviacWhitFunName("初始化");
  157. _allSizes.push_back(sz);
  158. // 加入动画
  159. auto d = DelayTime::create(delayIdx*dur/8.0);
  160. auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
  161. _btnShowAll->runAction(Sequence::create(d, m, NULL));
  162. delayIdx ++;
  163. } else {
  164. // 底部添加一个额外节点(一个是底部的广告,还有就是美观一些)
  165. _tableData.insertCell(index++, Node::create());
  166. _allSizes.push_back(cocos2d::Size(584, 150));
  167. }
  168. _tableData._numberOfCellsInTableView = [=](cocos2d::extension::TableViewSmooth*)->ssize_t{
  169. return _allSizes.size();
  170. };
  171. _tableData._tableCellSizeForIndex = [=](cocos2d::extension::TableViewSmooth*, ssize_t idx)->Size{
  172. if (idx < _allSizes.size()) {
  173. return _allSizes[idx];
  174. } else {
  175. return Size(0,0);
  176. }
  177. };
  178. // 防止拉动的时候才创建
  179. _layer->scheduleOnce([=](float){
  180. for (int i=0; i<_allSizes.size(); i++) {
  181. _tableView->updateCellAtIndex(i);
  182. }
  183. }, 0.05, "SCH_Update_Cells");
  184. }
  185. void IAPCtlShopUI::quit() {
  186. if (_layer) {
  187. _layer->runBehaviacWhitFunName("退出");
  188. }
  189. }