|
@@ -7,12 +7,16 @@
|
|
|
|
|
|
#include "IAPCtlShop.hpp"
|
|
|
|
|
|
+#include "ui/UIPageView.h"
|
|
|
+
|
|
|
#include "RUUtils.h"
|
|
|
#include "RUPlatform.h"
|
|
|
|
|
|
#include "IAPConf.hpp"
|
|
|
#include "IAPCtlShopUI.hpp"
|
|
|
#include "IAPCtlShopItem.hpp"
|
|
|
+#include "IAPDefine.hpp"
|
|
|
+#include "IAPTestCard.hpp"
|
|
|
#include <regex>
|
|
|
|
|
|
IAPCtlShopUI* IAPCtlShopUI::_instance = nullptr;
|
|
@@ -44,6 +48,10 @@ void IAPCtlShopUI::clear() {
|
|
|
gi->release();
|
|
|
}
|
|
|
_goodsItems.clear();
|
|
|
+ _placementItems.clear();
|
|
|
+ for(const auto& placement : _placements){
|
|
|
+ _indicators[placement.first].clear();
|
|
|
+ }
|
|
|
_allSizes.clear();
|
|
|
_cb = nullptr;
|
|
|
}
|
|
@@ -86,20 +94,107 @@ bool IAPCtlShopUI::create(Node* pNode, IAPConf* cfg, iap::ShopRequirement& requi
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+// (暂未完成)
|
|
|
+void IAPCtlShopUI::showPlacementsInNode(cocos2d::Node *pNode, const vector<std::string> &plIds){
|
|
|
+ clear();
|
|
|
+ redutils::Platform::getInstance()->reportLog("open iap");
|
|
|
+
|
|
|
+ int index = 0;
|
|
|
+ _tableData.setCascadeOpacity(true);
|
|
|
+ _tableData.clear();
|
|
|
+ cocos2d::Size size = _ndScrollArea->getContentSize();
|
|
|
+ auto delayIdx = 0;
|
|
|
+ cocos2d::Vec2 offset(size.width, 0);
|
|
|
+ float dur = 0.4;
|
|
|
+ int height = 0;
|
|
|
+
|
|
|
+ for(int i = 0; i < plIds.size(); i++){
|
|
|
+ if(_placements.count(plIds[i]) == 0)continue;
|
|
|
+ // 展示活动版位
|
|
|
+ bool bNeedAnim = height <= size.height;
|
|
|
+ Node* nd = Node::create();
|
|
|
+ nd->setAnchorPoint(Vec2(0.5,0.5));
|
|
|
+ nd->setContentSize(cocos2d::Size(584,250));
|
|
|
+ nd->setCascadeOpacityEnabled(true);
|
|
|
+ nd->setCascadeColorEnabled(true);
|
|
|
+
|
|
|
+ auto si = createPlacementUI(_placements[plIds[i]]);
|
|
|
+ auto sz = cocos2d::Size(584,280);
|
|
|
+ cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
|
|
|
+ nd->addChild(si);
|
|
|
+ si->setPosition(bNeedAnim ? pos+offset : pos);
|
|
|
+ _placementItems.push_back(nd);
|
|
|
+ _tableData.insertCell(index++, nd);
|
|
|
+ _allSizes.push_back(sz);
|
|
|
+ height += sz.height;
|
|
|
+
|
|
|
+ if (bNeedAnim) {
|
|
|
+ // 加入动画
|
|
|
+ auto d = DelayTime::create(delayIdx*dur/8.0);
|
|
|
+ auto m = EaseBackOut::create(MoveBy::create(dur, cocos2d::Vec2(-offset.x, offset.y)));
|
|
|
+ si->runAction(Sequence::create(d, m, NULL));
|
|
|
+ delayIdx ++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _tableData._numberOfCellsInTableView = [=](cocos2d::extension::TableViewSmooth*)->ssize_t{
|
|
|
+ return _allSizes.size();
|
|
|
+ };
|
|
|
+ _tableData._tableCellSizeForIndex = [=](cocos2d::extension::TableViewSmooth*, ssize_t idx)->Size{
|
|
|
+ if (idx < _allSizes.size()) {
|
|
|
+ return _allSizes[idx];
|
|
|
+ } else {
|
|
|
+ return Size(0,0);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 防止拉动的时候才创建
|
|
|
+ _layer->scheduleOnce([=](float){
|
|
|
+ for (int i=0; i<_allSizes.size(); i++) {
|
|
|
+ _tableView->updateCellAtIndex(i);
|
|
|
+ }
|
|
|
+ }, 0.05, "SCH_Update_Cells");
|
|
|
+
|
|
|
+
|
|
|
+ _tableView = redutils::RUTableView::create(&_tableData, cocos2d::Size(size.width, size.height));
|
|
|
+ _tableView->setCascadeOpacityEnabled(true);
|
|
|
+ _tableView->setCascadeColorEnabled(true);
|
|
|
+ _tableView->setDirection(ScrollViewSmooth::Direction::VERTICAL);
|
|
|
+ _tableView->setVerticalFillOrder(TableViewSmooth::VerticalFillOrder::TOP_DOWN, false);
|
|
|
+ _tableView->setDelegate(&_tableData);
|
|
|
+ _tableView->setBounceable(true);
|
|
|
+// _tableView->setOutSightClean(false);
|
|
|
+ _ndScrollArea->addChild(_tableView);
|
|
|
+}
|
|
|
+
|
|
|
bool IAPCtlShopUI::addAPlacement(const iap::IAPPlacement &plInfo){
|
|
|
// 如果该活动ID存在,则添加失败
|
|
|
if(_placements.count(plInfo.id) != 0)return false;
|
|
|
|
|
|
_placements[plInfo.id] = plInfo;
|
|
|
+
|
|
|
+ std::vector<DrawNode*> drawNode;
|
|
|
+ _indicators[plInfo.id] = drawNode;
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
void IAPCtlShopUI::removePlacement(const std::string &id){
|
|
|
_placements.erase(id);
|
|
|
+
|
|
|
+ _indicators.erase(id);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+bool IAPCtlShopUI::addCardToPlacement(const std::string &id, iap::IAPCard *card){
|
|
|
+ if(_placements.count(id) == 0)return false;
|
|
|
+ _placements[id].cards.push_back(card);
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
void IAPCtlShopUI::clearPlacement(){
|
|
|
_placements.clear();
|
|
|
+ _indicators.clear();
|
|
|
}
|
|
|
|
|
|
size_t IAPCtlShopUI::getPlacementCount(){
|
|
@@ -193,25 +288,34 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- // 展示活动商品
|
|
|
+ // 展示活动版位
|
|
|
if(_placements.size() != 0){
|
|
|
- // 展示活动
|
|
|
+ // 展示活动版位中的活动
|
|
|
for(const auto& placement : _placements){
|
|
|
- if(bigPackCount <= 0)break;
|
|
|
-
|
|
|
- bool bNeedAnim = height <= size.height;
|
|
|
- Node* nd = Node::create();
|
|
|
- nd->setCascadeOpacityEnabled(true);
|
|
|
- nd->setCascadeColorEnabled(true);
|
|
|
-
|
|
|
- // 创建活动卡片
|
|
|
- auto cards = placement.second.cards;
|
|
|
- for(const auto& card : cards){
|
|
|
- auto si = card->create();
|
|
|
+ bool isShow = false;
|
|
|
+ if(bShowAll){
|
|
|
+ isShow = true;
|
|
|
+ }else{
|
|
|
+ if(bigPackCount > 0){
|
|
|
+ isShow = true;
|
|
|
+ bigPackCount--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(isShow){
|
|
|
+ // 展示活动版位
|
|
|
+ bool bNeedAnim = height <= size.height;
|
|
|
+ Node* nd = Node::create();
|
|
|
+ nd->setAnchorPoint(Vec2(0.5,0.5));
|
|
|
+ nd->setContentSize(cocos2d::Size(584,250));
|
|
|
+ nd->setCascadeOpacityEnabled(true);
|
|
|
+ nd->setCascadeColorEnabled(true);
|
|
|
+
|
|
|
+ auto si = createPlacementUI(placement.second);
|
|
|
auto sz = cocos2d::Size(584,280);
|
|
|
cocos2d::Vec2 pos(size.width/2.0, sz.height/2.0);
|
|
|
nd->addChild(si);
|
|
|
si->setPosition(bNeedAnim ? pos+offset : pos);
|
|
|
+ _placementItems.push_back(nd);
|
|
|
_tableData.insertCell(index++, nd);
|
|
|
_allSizes.push_back(sz);
|
|
|
height += sz.height;
|
|
@@ -223,9 +327,9 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
si->runAction(Sequence::create(d, m, NULL));
|
|
|
delayIdx ++;
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- bigPackCount--;
|
|
|
}
|
|
|
}
|
|
|
// 判断是否还有版位
|
|
@@ -291,6 +395,10 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
_btnShowAll = NULL;
|
|
|
_tableData.clear();
|
|
|
_goodsItems.clear();
|
|
|
+ _placementItems.clear();
|
|
|
+ for(const auto& placement : _placements){
|
|
|
+ _indicators[placement.first].clear();
|
|
|
+ }
|
|
|
_allSizes.clear();
|
|
|
constructShopItem(true);
|
|
|
_tableView->reloadData(true);
|
|
@@ -335,6 +443,77 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
}, 0.05, "SCH_Update_Cells");
|
|
|
}
|
|
|
|
|
|
+Node* IAPCtlShopUI::createPlacementUI(const iap::IAPPlacement& placement){
|
|
|
+ Node* node = Node::create();
|
|
|
+
|
|
|
+ // 创建 PageView 用于分页滑动卡片
|
|
|
+ auto pageView = ui::PageView::create();
|
|
|
+ pageView->setContentSize(cocos2d::Size(584, 250));
|
|
|
+
|
|
|
+ // 创建指示点的父节点
|
|
|
+ auto indicatorNode = Node::create();
|
|
|
+ float spacing = 20.0f; // 每个指示点之间的间距
|
|
|
+
|
|
|
+ // 遍历 placement 中的卡片,依次创建并添加到 PageView 中
|
|
|
+ for (int i = 0; i < placement.cards.size(); i++) {
|
|
|
+ // 创建每张卡片的布局容器(PageView 只能添加 Layout 类型的子节点)
|
|
|
+ auto layout = ui::Layout::create();
|
|
|
+ layout->setContentSize(cocos2d::Size(584, 250));
|
|
|
+
|
|
|
+ auto card = placement.cards[i]->create(); // 假设 card 有 create 方法
|
|
|
+
|
|
|
+ // 设置卡片的居中位置
|
|
|
+ card->setPosition(Vec2(layout->getContentSize().width / 2, layout->getContentSize().height / 2));
|
|
|
+ layout->addChild(card);
|
|
|
+
|
|
|
+ // 将布局容器添加到 PageView 中
|
|
|
+ pageView->addPage(layout);
|
|
|
+
|
|
|
+ // 创建指示点
|
|
|
+ auto indicator = DrawNode::create();
|
|
|
+ Vec2 center(i * spacing, 0); // 水平排列指示点
|
|
|
+ _indicators[placement.id].push_back(indicator);
|
|
|
+
|
|
|
+ // 画白色圆点
|
|
|
+ indicator->drawDot(center, 5, Color4F(1, 1, 1, 1)); // 白色指示点
|
|
|
+ indicatorNode->addChild(indicator);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置 PageView 的分页切换效果(滑动自动切换)
|
|
|
+ pageView->setUsingCustomScrollThreshold(true); // 启用自定义滑动阈值
|
|
|
+ pageView->setCustomScrollThreshold(50); // 设置触发翻页的滑动距离阈值
|
|
|
+ pageView->setAutoScrollStopEpsilon(0.05f); // 提高自动滚动停止的精度
|
|
|
+
|
|
|
+ // 设置指示点的位置,居中显示在卡片下方
|
|
|
+ float indicatorNodeWidth = (placement.cards.size() - 1) * spacing;
|
|
|
+ indicatorNode->setPosition(Vec2(pageView->getContentSize().width / 2 - indicatorNodeWidth / 2, 0)); // 调整y轴位置
|
|
|
+ node->addChild(indicatorNode); // 将指示点容器添加到主节点中
|
|
|
+
|
|
|
+ // 添加回调函数监听页面变化
|
|
|
+ pageView->addEventListener([=](Ref* sender, ui::PageView::EventType type) {
|
|
|
+ if (type == ui::PageView::EventType::TURNING) {
|
|
|
+ log("滑动");
|
|
|
+ auto pageView = dynamic_cast<ui::PageView*>(sender);
|
|
|
+ int currentPageIndex = pageView->getCurrentPageIndex();
|
|
|
+
|
|
|
+ // 更新指示点颜色,当前页的指示点变为红色,其他保持白色
|
|
|
+ for (int i = 0; i < _indicators[placement.id].size(); i++) {
|
|
|
+ _indicators[placement.id][i]->clear(); // 清除之前的绘制
|
|
|
+ Color4F color = (i == currentPageIndex) ? Color4F(1, 0, 0, 1) : Color4F(1, 1, 1, 1); // 红色或白色
|
|
|
+ _indicators[placement.id][i]->drawDot(Vec2(i * 20, 0), 5, color); // 更新指示点颜色
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 默认将第一页的指示点设为红色
|
|
|
+ _indicators[placement.id][0]->drawDot(Vec2(0, 0), 5, Color4F(1, 0, 0, 1)); // 当前页红点
|
|
|
+
|
|
|
+ // 将 PageView 添加到父节点 node 中
|
|
|
+ node->addChild(pageView);
|
|
|
+
|
|
|
+ return node;
|
|
|
+}
|
|
|
+
|
|
|
void IAPCtlShopUI::filterGoods(iap::ShopRequirement &requirement){
|
|
|
std::map<int, bool> m;
|
|
|
int cnt = 0;
|