|
@@ -10,6 +10,10 @@
|
|
|
#include "RUUtils.h"
|
|
|
#include "RUPlatform.h"
|
|
|
|
|
|
+#include "IAPCtlShop.hpp"
|
|
|
+#include "IAPUserData.hpp"
|
|
|
+#include <regex>
|
|
|
+
|
|
|
IAPCtlShopUI* IAPCtlShopUI::_instance = nullptr;
|
|
|
|
|
|
|
|
@@ -98,7 +102,8 @@ bool IAPCtlShopUI::create(Node* pNode, IAPConf* cfg, iap::ShopRequirement& requi
|
|
|
if (_goodsInfo.size() == 0) {
|
|
|
IAPConf::getInstance()->getAllGoods(_goodsInfo);
|
|
|
}
|
|
|
- sortGoods(requirement);
|
|
|
+ // 过滤掉不符合的金币
|
|
|
+ filterGoods(requirement);
|
|
|
|
|
|
// 构建 list 区域
|
|
|
constructShopItem(false);
|
|
@@ -158,9 +163,71 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
height += h;
|
|
|
}
|
|
|
|
|
|
+ // 重新获取
|
|
|
+ if(bShowAll)IAPConf::getInstance()->getAllGoods(_goodsInfo);
|
|
|
+ // 根据用户类型进行礼包排序
|
|
|
+ switch (iap::IAPUserData::getInstance()->getUserBuyType()) {
|
|
|
+ case iap::UserBuyType::NoShopping:
|
|
|
+ sortGoods(true);
|
|
|
+ break;
|
|
|
+ case iap::UserBuyType::LittleShopping:
|
|
|
+ sortGoods(true);
|
|
|
+ break;
|
|
|
+ case iap::UserBuyType::NormalShopping:
|
|
|
+ sortGoods(true);
|
|
|
+ break;
|
|
|
+ case iap::UserBuyType::LotShopping:
|
|
|
+ sortGoods(false);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
// 当前有效的区域
|
|
|
+ int bigPackCount,SmallPackCount; // 需要显示的礼包
|
|
|
+ auto iapCtlShop = iap::IAPCtlShop::createWith();
|
|
|
+ int leval = iapCtlShop->getDeviceLevel();
|
|
|
+ size_t placementCount = iapCtlShop->getPlacementCount();
|
|
|
+ switch(leval){
|
|
|
+ case 1:
|
|
|
+ // 低等级
|
|
|
+ bigPackCount = 2;
|
|
|
+ SmallPackCount = 1;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ // 中等级
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ if(placementCount >= 2){
|
|
|
+ bigPackCount = 3;
|
|
|
+ SmallPackCount = 0;
|
|
|
+ }else{
|
|
|
+ bigPackCount = 2;
|
|
|
+ SmallPackCount = 2;
|
|
|
+ }
|
|
|
+ // 高等级
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 显示商品
|
|
|
for (const auto& gi : _goodsInfo) {
|
|
|
- if (bShowAll || gi.always) {
|
|
|
+ // 判断是否显示
|
|
|
+ bool isShow = false;
|
|
|
+ if (bShowAll) {
|
|
|
+ isShow = true;
|
|
|
+ }else{
|
|
|
+ if(gi.type == "panel" && bigPackCount > 0){
|
|
|
+ isShow = true;
|
|
|
+ bigPackCount--;
|
|
|
+ }
|
|
|
+ if(gi.type == "bar" && SmallPackCount > 0){
|
|
|
+ isShow = true;
|
|
|
+ SmallPackCount--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 商品显示
|
|
|
+ if (isShow) {
|
|
|
bool bNeedAnim = height <= size.height;
|
|
|
Node* nd = Node::create();
|
|
|
nd->setCascadeOpacityEnabled(true);
|
|
@@ -184,7 +251,7 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ // 添加展示所有按钮
|
|
|
if (!bShowAll) {
|
|
|
// 加入show All btn, 这个是一定会有动画的
|
|
|
auto sz = cocos2d::Size(584, 130);
|
|
@@ -246,7 +313,7 @@ void IAPCtlShopUI::constructShopItem(bool bShowAll) {
|
|
|
}, 0.05, "SCH_Update_Cells");
|
|
|
}
|
|
|
|
|
|
-void IAPCtlShopUI::sortGoods(iap::ShopRequirement &requirement){
|
|
|
+void IAPCtlShopUI::filterGoods(iap::ShopRequirement &requirement){
|
|
|
std::map<int, bool> m;
|
|
|
int cnt = 0;
|
|
|
for(const auto& goodsInfo : _goodsInfo){
|
|
@@ -276,14 +343,47 @@ void IAPCtlShopUI::sortGoods(iap::ShopRequirement &requirement){
|
|
|
}
|
|
|
}
|
|
|
// 添加不符合条件的礼包(不清楚是不是需要显示,暂放到列表末尾)
|
|
|
- for(int i = 0;i < _goodsInfo.size(); i++){
|
|
|
- if(!m[i]){
|
|
|
- newGoodsInfo.push_back(_goodsInfo[i]);
|
|
|
- }
|
|
|
- }
|
|
|
+// for(int i = 0;i < _goodsInfo.size(); i++){
|
|
|
+// if(!m[i]){
|
|
|
+// newGoodsInfo.push_back(_goodsInfo[i]);
|
|
|
+// }
|
|
|
+// }
|
|
|
_goodsInfo = newGoodsInfo;
|
|
|
}
|
|
|
|
|
|
+void IAPCtlShopUI::sortGoods(bool flag){
|
|
|
+
|
|
|
+ sort(_goodsInfo.begin(), _goodsInfo.end(), [flag](GoodsInfo a, GoodsInfo b){
|
|
|
+ if(a.type != b.type){
|
|
|
+ if(a.type == "panel"){
|
|
|
+ return true;
|
|
|
+ }else if(b.type == "panel"){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ float val_a,val_b;
|
|
|
+
|
|
|
+ std::regex re(R"(\d+(\.\d{1,2})?)"); // 匹配整数或最多两位小数的数字
|
|
|
+ std::smatch match;
|
|
|
+
|
|
|
+ if (std::regex_search(a.cost, match, re)) {
|
|
|
+ val_a = stof(match[0]); // 提取价格
|
|
|
+ } else {
|
|
|
+ log("IAPUserData::getUserBuyType : 转换失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (std::regex_search(b.cost, match, re)) {
|
|
|
+ val_b = stof(match[0]); // 提取价格
|
|
|
+ } else {
|
|
|
+ log("IAPUserData::getUserBuyType : 转换失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(flag) return val_a < val_b;
|
|
|
+ else return val_a > val_b;
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
void IAPCtlShopUI::quit() {
|
|
|
if (_layer) {
|
|
|
_layer->runBehaviacWhitFunName("退出");
|