cb/assets/shop/script/shop.ts
YZ\249929363 7fa2297b81 修复BUG
2025-08-07 17:53:25 +08:00

735 lines
29 KiB
TypeScript

import JiaZai from "../../Script/JiaZai";
import MapConroler from "../../Script/Map";
import Utils from "../../Script/module/Pay/Utils";
import List from "../../Script/module/RankList/List";
import NumberToImage from "../../Script/NumberToImage";
import SceneManager from "../../Script/SceneManager";
import { MiniGameSdk } from "../../Script/Sdk/MiniGameSdk";
const { ccclass, property } = cc._decorator;
@ccclass
export default class NewClass extends cc.Component {
//商店界面
@property(cc.Node)
shop: cc.Node = null;
//商品列表
@property(cc.Node)
itemList: cc.Node = null;
//金币数量
@property(cc.Node)
coin: cc.Node = null;
//体力信息
@property(cc.Node)
Stamina: cc.Node = null;
//月卡信息
@property(cc.Node)
monthCardTime: cc.Node = null;
btn_Touch: boolean = true;
private onShowListener: () => void;
private scheduleCallback: Function = null;
private currentCoin: number = 0;
private coinAnimTime: number = 0;
private coinAnimDuration: number = 1.5; // 1.5秒
private coinStart: number = 0;
private coinEnd: number = 0;
private coinAnimating: boolean = false;
//飞金币动画
@property(cc.Node)
coinAnim: cc.Node = null;
private buy: boolean = false;
private iosPrice: number = 0;
private iosProductId: string = "";
private iosCount: number = 1;
scheduleCallback3: any;
scheduleCallback2: Function;
reward: boolean = false;
private monthCard: boolean = false;
onLoad() {
this.btn_Touch = true;
this.monthCard = false;
// 检测微信小游戏切到后台
}
start() {
this.btn_Touch = true;
this.openShop();
this.init();
}
init() {
let flag = cc.fx.GameTool.getSetScreenResolutionFlag();
if (flag) {
this.node.getChildByName("itemcontent").getChildByName("view").height = 1500;
}
this.onShowListener = null;
if (cc.sys.platform === cc.sys.WECHAT_GAME) {
// 定义监听函数
this.onShowListener = () => {
console.log("回到前台");
this.onShow();
};
//@ts-ignore
wx.onShow(this.onShowListener);
}
this.btn_Touch = true;
var timeTemp = cc.fx.GameTool.getTimeMargin(cc.fx.GameConfig.GM_INFO.min_Time);
// 同步显示
// if (this.Stamina && this.Stamina.getChildByName("time")) {
// this.Stamina.getChildByName("time").getComponent(cc.Label).string = timeTemp;
// }
this.stopTimeCutDown();
this.stopPowerTime();
this.updatePower();
this.setHealthInfo(true);
this.updateIcon();
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.coin, 30, 15, "coin_", this.coin, true);
}
//打开商店界面
openShop() {
Utils.outTradeNo = null;
// 商品数据数组
const products = [
{ product_id: "gold_1", price: 600, coin: 1200, title: "3x2六档金币" },
{ product_id: "gold_1", price: 600, coin: 1200, title: "3x2六档金币" },
{ product_id: "gold_2", price: 3600, coin: 8000, title: "" },
{ product_id: "gold_3", price: 6800, coin: 16000, title: "" },
{ product_id: "gold_4", price: 12800, coin: 32000, title: "" },
{ product_id: "gold_5", price: 32800, coin: 100000, title: "" },
{ product_id: "gold_6", price: 64800, coin: 240000, title: "" },
];
for (let i = 2; i <= 7 && i < this.itemList.children.length; i++) {
const spriteComp = this.itemList.children[i].children[0].getComponent(cc.Sprite);
const price = this.itemList.children[i].children[1];
const title = this.itemList.children[i].children[2];
const product = products[i - 1];
if (spriteComp && product) {
// TODO: 根据 product_id 或 name 设置 spriteComp.spriteFrame
}
if (price && product) {
NumberToImage.numberToImageNodes(product.price / 100, 35, 20, "cost_", price, false)
}
if (title && product) {
NumberToImage.numberToImageNodes(product.coin, 40, 25, "scoin_", title, true)
}
}
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.coin, 30, 15, "coin_", this.coin, true);
this.updateIcon();
}
startCoinAnim(target: number) {
if (this.coinAnimating && this.coinEnd === target) return;
this.coinStart = this.currentCoin;
this.coinEnd = target;
this.coinAnimTime = 0;
this.coinAnimating = true;
}
//优化
protected update(dt: number): void {
if (this.coin && this.coinAnimating) {
this.coinAnimTime += dt;
let t = this.coinAnimTime / this.coinAnimDuration;
if (t >= 1) {
this.currentCoin = this.coinEnd;
this.coinAnimating = false;
NumberToImage.numberToImageNodes(this.currentCoin, 30, 15, "coin_", this.coin, true);
} else {
this.currentCoin = Math.floor(this.coinStart + (this.coinEnd - this.coinStart) * t);
NumberToImage.numberToImageNodes(this.currentCoin, 30, 15, "coin_", this.coin, true);
}
}
}
playCoinAnim(target?: number) {
this.coinAnim.active = true;
this.coinAnim.getComponent(sp.Skeleton).setAnimation(0, "feijinbi", false);
// 监听动画完成事件
this.coinAnim.getComponent(sp.Skeleton).setCompleteListener(() => {
// 动画播放完成后销毁节点
this.coinAnim.active = false;
});
this.startCoinAnim(5000);
}
//关闭商店界面
closeShop(data, currentCoin) {
// 移除 wx.onShow 监听器
if (cc.sys.platform === cc.sys.WECHAT_GAME && this.onShowListener) {
console.log("!!!!!!!!!!移除onshow");
console.log(currentCoin);
//@ts-ignore
wx.offShow(this.onShowListener);
}
Utils.outTradeNo = null;
//销毁预制体
if (this.node.parent.getComponent("JiaZai")) {
this.node.parent.getComponent("JiaZai").closeShop();
}
else if (this.node.parent.getComponent("SceneManager")) {
this.node.parent.getComponent("SceneManager").closeShop();
}
// this.shop.destroy();
if (this.reward) {
this.reward = false;
const winCOIN = cc.find("Canvas"); // 假设 Canvas 节点
if (winCOIN) {
const wincoin1 = winCOIN.getComponent(JiaZai);
if (wincoin1) {
if (wincoin1) {
wincoin1.onGames();
wincoin1.rewarded();
}
}
}
}
}
onShow() {
console.log("从后台进入前台 onShow");
//如果月卡打开就return
if (this.monthCard) {
return;
}
const systemInfo = wx.getSystemInfoSync();
if (systemInfo.platform === 'ios') {
if (cc.sys.platform === cc.sys.WECHAT_GAME) {
console.log("从后台进入前台订单号:", cc.fx.GameConfig.GM_INFO.iosOutTradeNo);
this.closeLoad();
if (cc.fx.GameConfig.GM_INFO.iosOutTradeNo != null && cc.fx.GameConfig.GM_INFO.iosOutTradeNo != "") {
console.log("有苹果订单号,开始轮训");
const iosOutTradeNo = cc.fx.GameConfig.GM_INFO.iosOutTradeNo;
cc.fx.GameConfig.GM_INFO.iosOutTradeNo = "";
this.openLoad();
this.btn_Touch = true;
Utils.getIosPayInfo(iosOutTradeNo,
(data) => {
console.log("获得轮训结果:", data);
const iosID = data.data?.payment_name || this.iosProductId;
let iosAmount = data.data?.goodsPrice || this.iosPrice;
iosAmount = parseInt(iosAmount);
if (data.code == 1) {
console.log("购买成功");
console.log("商品id:", iosID);
const dataSuccess = {
outTradeNo: iosOutTradeNo,
pay_amount: iosAmount,
payment_name: iosID,
payment_num: this.iosCount,
type: "ios",
}
cc.fx.GameTool.shushu_Track("payment", dataSuccess);
let name = "购买金币道具:" + iosID;
let version = cc.fx.GameTool.getWechatGameVersion();
if (version == "正式版") {
MiniGameSdk.API.yinli_Pay(iosAmount, iosOutTradeNo, name)
}
Utils.setPayInfo(
(res) => {
this.closeLoad();
//console.log("设置轮训结果:", res);
if (res.code === 1) {
console.log("_________正式发货", iosID);
MiniGameSdk.API.showToast("充值成功");
cc.fx.GameTool.shopBuy(iosID, false);
if (iosID == "unlimited_health_bundle_10" ||
iosID == "unlimited_health_bundle_20" ||
iosID == "unlimited_health_bundle_30"
) {
this.updatePower();
}
//console.log("充值成功获得金币");
}
else {
MiniGameSdk.API.showToast("网络异常,充值奖励将在登录后再次发放");
const dataFail4 = {
outTradeNo: iosOutTradeNo,
pay_amount: iosAmount,
payment_name: iosID,
payment_num: this.iosCount,
type: "ios",
fail_reason: "成功付款,但是发货时请求服务器失败,充值成功未发货",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail4);
}
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.coin, 30, 15, "coin_", this.coin, true);
if (this.node.parent.getComponent("JiaZai"))
this.node.parent.getComponent("JiaZai").updateCoin();
else if (this.node.parent.getComponent("SceneManager")) {
this.node.parent.getComponent("SceneManager").updateCoin();
}
}, iosOutTradeNo)
}
else if (data.code == 0) {
console.log("用户自己取消充值");
MiniGameSdk.API.showToast("充值失败");
this.closeLoad();
this.btn_Touch = true;
const dataFail = {
outTradeNo: iosOutTradeNo,
pay_amount: iosAmount,
payment_name: iosID,
payment_num: this.iosCount,
type: "ios",
fail_reason: "用户取消充值",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail);
}
else if (data.code == 2) {
this.closeLoad();
console.log("轮训超时");
MiniGameSdk.API.showToast("订单已关闭");
const dataFail = {
outTradeNo: iosOutTradeNo,
pay_amount: iosAmount,
payment_name: iosID,
payment_num: this.iosCount,
type: "ios",
fail_reason: "用户充值后,轮训结果超时",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail);
}
this.btn_Touch = true;
cc.fx.GameConfig.GM_INFO.iosOutTradeNo = null;
})
}
else {
this.closeLoad();
}
}
}
}
openLoad() {
this.node.getChildByName("Loading").active = true;
this.node.getChildByName("Loading").getChildByName("load").stopAllActions();
this.node.getChildByName("Loading").getChildByName("load").runAction(cc.rotateTo(2, 1080).repeatForever());
}
closeLoad() {
this.node.getChildByName("Loading").active = false;
}
setHealthInfo(type) {
if (cc.fx.GameConfig.GM_INFO.hp >= cc.fx.GameConfig.GM_INFO.hp_Max) {
this.Stamina.getChildByName("man").active = true;
this.Stamina.getChildByName("health").active = true;
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.hp, 25, 15, "hp_", this.Stamina.getChildByName("health"), false);
this.Stamina.getChildByName("time").active = false;
}
else {
this.Stamina.getChildByName("man").active = false;
this.Stamina.getChildByName("health").active = true;
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.hp, 25, 15, "hp_", this.Stamina.getChildByName("health"), false);
this.Stamina.getChildByName("time").active = true;
if (cc.fx.GameConfig.GM_INFO.min_Time != 0) {
let time = cc.fx.GameTool.getTimeMargin(cc.fx.GameConfig.GM_INFO.min_Time);
this.Stamina.getChildByName("time").getComponent(cc.Label).string = time;
let power = cc.fx.GameTool.getUserPowerTime();
if (!power) this.Stamina.getChildByName("time").opacity = 255;
else this.Stamina.getChildByName("time").opacity = 0;
this.stopTimeCutDown();
this.startTimeCutDown();
}
}
}
startTimeCutDown() {
this.stopTimeCutDown();
if (this.scheduleCallback3) {
this.unschedule(this.scheduleCallback3);
}
this.scheduleCallback3 = function () {
if (this.pause) return;
if (cc.fx.GameConfig.GM_INFO.min_Time <= 0) {
this.stopTimeCutDown();
var timeTemp = cc.fx.GameTool.getTimeMargin(cc.fx.GameConfig.GM_INFO.min_Time);
// 同步显示
if (this.Stamina && this.Stamina.getChildByName("time")) {
this.Stamina.getChildByName("time").getComponent(cc.Label).string = timeTemp;
}
MiniGameSdk.API.showToast("恢复一点滴点体力");
cc.fx.GameTool.setUserHealth(1, (data) => {
cc.fx.GameTool.getHealth(null);
this.setHealthInfo(true);
}, true)
}
else {
if (this.node.parent.getComponent("JiaZai")) {
}
else cc.fx.GameConfig.GM_INFO.min_Time -= 1;
var timeTemp = cc.fx.GameTool.getTimeMargin(cc.fx.GameConfig.GM_INFO.min_Time);
// 同步显示
if (this.Stamina && this.Stamina.getChildByName("time")) {
let power = cc.fx.GameTool.getUserPowerTime();
if (!power) this.Stamina.getChildByName("time").opacity = 255;
else this.Stamina.getChildByName("time").opacity = 0;
this.Stamina.getChildByName("time").getComponent(cc.Label).string = timeTemp;
}
}
}.bind(this);
this.schedule(this.scheduleCallback3, 1);
}
// 停止倒计时
stopTimeCutDown() {
if (this.scheduleCallback3) {
this.unschedule(this.scheduleCallback3);
this.scheduleCallback3 = null;
}
}
//点击充值购买
buyProduct(event, customData) {
if (!this.btn_Touch) {
return;
}
this.btn_Touch = false;
const productId = customData;
let id = "10011";
let price = 100;
let count = 1;
id = productId;
console.log("购买商品id:", productId);
switch (productId) {
case "gold_1":
price = 600;
break;
case "gold_2":
price = 3600;
break;
case "gold_3":
price = 6800;
break;
case "gold_4":
price = 12800;
break;
case "gold_5":
price = 32800;
break;
case "gold_6":
price = 64800;
break;
case "unlimited_health_bundle_10":
price = 1000;
break;
case "unlimited_health_bundle_20":
price = 2000;
break;
case "unlimited_health_bundle_30":
price = 3000;
break;
case "month_Card":
price = 3000;
break;
}
//console.log("获得商品id:", id, count, price);
// 判断设备系统
let systemType = "Android";
try {
//@ts-ignore
const systemInfo = wx.getSystemInfoSync();
if (systemInfo.platform === 'ios') {
systemType = "ios";
}
} catch (e) {
console.error('获取系统信息失败', e);
}
// Utils.GoKEFu();
if (systemType == "ios") {
// MiniGameSdk.API.showToast("IOS系统暂不支持支付");
// this.btn_Touch = true;
this.openLoad();
this.btn_Touch = true;
let iosPayInfo = {
price: price,
payment_name: productId,
payment_count: 1,
}
this.iosPrice = price;
this.iosProductId = productId;
this.iosCount = 1;
console.log("准备跳客服回话:");
console.log(this.iosProductId);
Utils.GoKEFu(iosPayInfo, (res) => {
this.closeLoad();
});
}
else {
// MiniGameSdk.API.showToast("充值成功");
// cc.fx.GameTool.shopBuy(productId, false);
// setTimeout(() => {
// if (productId == "unlimited_health_bundle_10" ||
// productId == "unlimited_health_bundle_20" ||
// productId == "unlimited_health_bundle_30"
// ) {
// console.log("触发————————updatePower");
// this.updatePower();
// }
// }, 500);
this.openLoad();
this.btn_Touch = true;
//console.log("7.14_____________________", "调用充值接口");
Utils.buyProp(id, count, price, systemType, productId, (res) => {
//console.log("获得充值结果", res);
if (res == null) {
MiniGameSdk.API.showToast("充值失败");
this.btn_Touch = true;
const dataFail = {
outTradeNo: Utils.outTradeNo,
pay_amount: price,
payment_name: productId,
payment_num: 1,
type: systemType,
fail_reason: "网络异常,没有拉起支付",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail);
this.closeLoad();
return;
}
else if (res.err) {
MiniGameSdk.API.showToast("充值失败");
//console.log(res);
this.btn_Touch = true;
let name = "支付拉起失败";
if (res.errCode == -2) {
name = "用户取消充值";
}
const dataFail = {
outTradeNo: Utils.outTradeNo,
pay_amount: price,
payment_name: productId,
payment_num: 1,
type: systemType,
fail_reason: name,
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail);
this.closeLoad();
return;
}
else {
Utils.getPayInfo((data) => {
// MiniGameSdk.API.showToast("充值成功");
console.log("7.28_______________充值成功,准备轮训", data);
//console.log("获得轮训结果:", data);
this.closeLoad();
if (data.data.pay_state == 1) {
this.btn_Touch = true;
MiniGameSdk.API.showToast("取消充值");
const dataFail2 = {
outTradeNo: Utils.outTradeNo,
pay_amount: price,
payment_name: productId,
payment_num: 1,
type: systemType,
fail_reason: "用户取消支付",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail2);
}
else if (data.data.pay_state == 2) {
this.btn_Touch = true;
const dataSuccess = {
outTradeNo: Utils.outTradeNo,
pay_amount: price,
payment_name: productId,
payment_num: 1,
type: systemType,
}
cc.fx.GameTool.shushu_Track("payment", dataSuccess);
let name = "购买金币道具:" + productId;
let version = cc.fx.GameTool.getWechatGameVersion();
if (version == "正式版") {
MiniGameSdk.API.yinli_Pay(price, Utils.outTradeNo, name);
}
console.log("7.14_______________充值成功,轮训成功,准备发货");
Utils.setPayInfo(
(res) => {
console.log("设置轮训结果:", res);
if (res.code === 1) {
console.log("7.14_________正式发货");
MiniGameSdk.API.showToast("充值成功");
cc.fx.GameTool.shopBuy(productId, false);
if (productId == "unlimited_health_bundle_10" ||
productId == "unlimited_health_bundle_20" ||
productId == "unlimited_health_bundle_30"
) {
this.updatePower();
}
//console.log("充值成功获得金币");
}
else {
MiniGameSdk.API.showToast("网络异常,充值奖励将在登录后再次发放");
const dataFail4 = {
outTradeNo: Utils.outTradeNo,
pay_amount: price,
payment_name: productId,
payment_num: 1,
type: systemType,
fail_reason: "成功付款,但是发货时请求服务器失败,充值成功未发货",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail4);
}
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.coin, 30, 15, "coin_", this.coin, true);
if (this.node.parent.getComponent("JiaZai"))
this.node.parent.getComponent("JiaZai").updateCoin();
else if (this.node.parent.getComponent("SceneManager")) {
this.node.parent.getComponent("SceneManager").updateCoin();
}
}, Utils.outTradeNo)
}
else {
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.coin, 30, 15, "coin_", this.coin, true);
const dataFail3 = {
outTradeNo: Utils.outTradeNo,
pay_amount: price,
payment_name: productId,
payment_num: 1,
type: systemType,
fail_reason: "拉起支付后,付款时网络异常付款失败",
}
cc.fx.GameTool.shushu_Track("payment_fail", dataFail3);
this.btn_Touch = true;
if (this.node.parent.getComponent("JiaZai"))
this.node.parent.getComponent("JiaZai").updateCoin();
else if (this.node.parent.getComponent("SceneManager")) {
this.node.parent.getComponent("SceneManager").updateCoin();
}
}
})
}
});
}
}
//无限体力刷新功能
updatePower() {
console.log("无限体力时间戳:", cc.fx.GameConfig.GM_INFO.userPowerTime);
const winCOIN = cc.find("Canvas"); // 假设 Canvas 节点
if (winCOIN) {
const wincoin = winCOIN.getComponent(SceneManager);
if (wincoin) {
MapConroler._instance.setPropNum();
console.log("局内");
};
}
if (cc.fx.GameConfig.GM_INFO.userPowerTime != 0) {
let nowTime = Math.floor(Date.now() / 1000);
if (cc.fx.GameConfig.GM_INFO.userPowerTime > nowTime) {
this.stopPowerTime();
this.startPowerTime();
console.log("还有无限体力时间_____________", (cc.fx.GameConfig.GM_INFO.userPowerTime - nowTime));
this.Stamina.getChildByName("skyLine").active = true;
this.Stamina.getChildByName("time").opacity = 0;
this.Stamina.getChildByName("man").active = false;
}
else {
this.Stamina.getChildByName("skyLine").active = false;
console.log("无限体力时间已过期");
this.setHealthInfo(true);
}
}
else {
this.Stamina.getChildByName("skyLine").active = false;
this.setHealthInfo(true);
console.log("没有无限体力时间");
}
}
startPowerTime() {
this.stopPowerTime();
this.scheduleCallback2 = function () {
let nowTime = Math.floor(Date.now() / 1000);
if (cc.fx.GameConfig.GM_INFO.userPowerTime < nowTime) {
this.Stamina.getChildByName("skyLine").active = false;
this.stopPowerTime();
this.setHealthInfo(true);
return;
}
else {
this.Stamina.getChildByName("skyLine").active = true;
this.Stamina.getChildByName("time").opacity = 0;
this.Stamina.getChildByName("man").active = false;
}
let time = cc.fx.GameConfig.GM_INFO.userPowerTime - nowTime;
if (time <= 0) {
time = 0;
this.Stamina.getChildByName("skyLine").active = false;
this.stopPowerTime();
this.setHealthInfo(true);
var timeTemp = cc.fx.GameTool.getTimeMargin2(time);
// 同步显示
if (this.Stamina && this.Stamina.getChildByName("skyLine").getChildByName("skyTime")) {
this.Stamina.getChildByName("skyLine").getChildByName("skyTime").getComponent(cc.Label).string = timeTemp;
}
}
else {
var timeTemp = cc.fx.GameTool.getTimeMargin2(time);
// 同步显示
if (this.Stamina && this.Stamina.getChildByName("skyLine").getChildByName("skyTime")) {
this.Stamina.getChildByName("skyLine").getChildByName("skyTime").getComponent(cc.Label).string = timeTemp;
}
}
}.bind(this);
this.schedule(this.scheduleCallback2, 1);
}
stopPowerTime() {
cc.fx.GameTool.getUserPowerTime();
if (this.scheduleCallback2) {
this.unschedule(this.scheduleCallback2);
this.scheduleCallback2 = null;
}
}
openmonthCard() {
const winCOIN = cc.find("Canvas"); // 假设 Canvas 节点
if (winCOIN) {
const wincoin = winCOIN.getComponent(SceneManager);
if (wincoin) {
wincoin.openMonthlyCard();
console.log("局内")
};
const wincoin1 = winCOIN.getComponent(JiaZai);
if (wincoin1) {
if (wincoin1) {
wincoin1.openMonthlyCard();
this.reward = true;
console.log("局外")
}
}
}
this.monthCard = true;
this.updateIcon()
}
//更新图标
updateIcon() {
if (cc.fx.GameConfig.GM_INFO.hp_Max == 7) {
this.monthCardTime.active = true;
} else {
this.monthCardTime.active = false;
}
NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.monthTime, 35, 15, "button_", this.monthCardTime.children[1], true);
}
// update (dt) {}
}