cb/assets/shop/script/shop.ts
YZ\249929363 006bd001fc 更新
2025-07-17 20:22:06 +08:00

518 lines
23 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Utils from "../../Script/module/Pay/Utils";
import List from "../../Script/module/RankList/List";
import NumberToImage from "../../Script/NumberToImage";
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;
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;
onLoad() {
this.btn_Touch = true;
// 检测微信小游戏切到后台
if (cc.sys.platform === cc.sys.WECHAT_GAME) {
// 定义监听函数
this.onShowListener = () => {
this.onShow();
};
//@ts-ignore
wx.onShow(this.onShowListener);
}
}
start() {
this.btn_Touch = true;
this.openShop();
this.setHealthInfo();
}
init() {
this.btn_Touch = true;
}
//打开商店界面
openShop() {
Utils.outTradeNo = null;
// 商品数据数组
const products = [
{ product_id: "gold_1", name: "金币包1", price: 600, coin: 1200, title: "3x2六档金币" },
{ product_id: "gold_2", name: "金币包2", price: 3600, coin: 8000, title: "" },
{ product_id: "gold_3", name: "金币包3", price: 6800, coin: 16000, title: "" },
{ product_id: "gold_4", name: "金币包4", price: 12800, coin: 32000, title: "" },
{ product_id: "gold_5", name: "金币包5", price: 32800, coin: 100000, title: "" },
{ product_id: "gold_6", name: "金币包6", price: 64800, coin: 240000, title: "" },
];
for (let i = 1; i <= 6 && 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);
}
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() {
// 移除 wx.onShow 监听器
if (cc.sys.platform === cc.sys.WECHAT_GAME && this.onShowListener) {
//@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();
}
onShow() {
if (cc.sys.platform === cc.sys.WECHAT_GAME) {
console.log("从后台进入前台订单号:", cc.fx.GameConfig.GM_INFO.iosOutTradeNo);
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();
Utils.getIosPayInfo(iosOutTradeNo,
(data) => {
console.log("获得轮训结果:", data);
if (data.code == 1) {
console.log("购买成功");
const dataSuccess = {
outTradeNo: iosOutTradeNo,
price: this.iosPrice,
payment_name: this.iosProductId,
payment_num: this.iosCount,
type: "ios",
}
cc.fx.GameTool.shushu_Track("payment", dataSuccess);
let name = "购买金币道具:" + this.iosProductId;
MiniGameSdk.API.yinli_Pay(this.iosPrice, iosOutTradeNo, name)
Utils.setPayInfo(
(res) => {
this.closeLoad();
//console.log("设置轮训结果:", res);
if (res.code === 1) {
console.log("_________正式发货");
MiniGameSdk.API.showToast("充值成功");
cc.fx.GameTool.shopBuy(this.iosProductId);
//console.log("充值成功获得金币");
}
else {
MiniGameSdk.API.showToast("网络异常,充值奖励将在登录后再次发放");
const dataFail4 = {
outTradeNo: iosOutTradeNo,
price: this.iosPrice,
payment_name: this.iosProductId,
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,
price: this.iosPrice,
payment_name: this.iosProductId,
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,
price: this.iosPrice,
payment_name: this.iosProductId,
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;
})
}
}
}
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() {
if (cc.fx.GameConfig.GM_INFO.hp >= 5) {
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;
this.startTimeCutDown();
}
}
}
startTimeCutDown() {
this.scheduleCallback = 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();
})
}
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")) {
this.Stamina.getChildByName("time").getComponent(cc.Label).string = timeTemp;
}
}
}.bind(this);
this.schedule(this.scheduleCallback, 1);
}
// 停止倒计时
stopTimeCutDown() {
if (this.scheduleCallback) {
this.unschedule(this.scheduleCallback);
}
}
//点击充值购买
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;
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_1":
price = 1800;
break;
case "unlimited_health_bundle_2":
price = 6600;
break;
case "unlimited_health_bundle_3":
price = 10800;
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();
let iosPayInfo = {
price: price,
payment_name: productId,
payment_count: 1,
}
this.iosPrice = price;
this.iosProductId = productId;
this.iosCount = 1;
Utils.GoKEFu(iosPayInfo, (res) => {
this.closeLoad();
});
}
else {
console.log("上品ID", productId);
MiniGameSdk.API.showToast(productId);
cc.fx.GameTool.shopBuy(productId);
const data = {
outTradeNo: Utils.outTradeNo,
price: price,
payment_name: productId,
payment_num: 1,
type: systemType,
}
cc.fx.GameTool.shushu_Track("init_order", data);
this.openLoad();
//console.log("7.14_____________________", "调用充值接口");
// Utils.buyProp(id, count, price, (res) => {
// //console.log("获得充值结果", res);
// if (res == null) {
// MiniGameSdk.API.showToast("充值失败");
// this.btn_Touch = true;
// const dataFail = {
// outTradeNo: Utils.outTradeNo,
// price: 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,
// price: 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) => {
// //console.log("7.14_______________充值成功,准备轮训");
// //console.log("获得轮训结果:", data);
// this.closeLoad();
// if (data.data.pay_state == 1) {
// this.btn_Touch = true;
// MiniGameSdk.API.showToast("取消充值");
// const dataFail2 = {
// outTradeNo: Utils.outTradeNo,
// price: 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,
// price: price,
// payment_name: productId,
// payment_num: 1,
// type: systemType,
// }
// cc.fx.GameTool.shushu_Track("payment", dataSuccess);
// let name = "购买金币道具:" + productId;
// 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);
// //console.log("充值成功获得金币");
// }
// else {
// MiniGameSdk.API.showToast("网络异常,充值奖励将在登录后再次发放");
// const dataFail4 = {
// outTradeNo: Utils.outTradeNo,
// price: 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();
// }
// }, null)
// }
// else {
// NumberToImage.numberToImageNodes(cc.fx.GameConfig.GM_INFO.coin, 30, 15, "coin_", this.coin, true);
// const dataFail3 = {
// outTradeNo: Utils.outTradeNo,
// price: 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();
// }
// }
// })
// }
// });
}
}
// update (dt) {}
}