1790 lines
68 KiB
TypeScript
1790 lines
68 KiB
TypeScript
|
||
import JiaZai from "../../JiaZai";
|
||
import MapConroler from "../../Map";
|
||
import Freeze from "../../prop/Freeze";
|
||
import SceneManager from "../../SceneManager";
|
||
import { MiniGameSdk } from "../../Sdk/MiniGameSdk";
|
||
import Utils from "../Pay/Utils";
|
||
//@ts-ignore
|
||
//最大工具类 各种公共方法,以及处理上传,获取后端接口数据
|
||
var GameTool = {
|
||
_startTime: 0,
|
||
_endTime: 0,
|
||
_totalTime: 0,
|
||
|
||
//获取userId
|
||
Authentication() {
|
||
let name = "user_" + cc.fx.GameConfig.GM_INFO.gameId;
|
||
var data = JSON.parse(localStorage.getItem(name));
|
||
if (data == "undifend" || data == null || data == "") {
|
||
var urlNow = window.location.href;
|
||
if (!this.containsTrain(urlNow)) {
|
||
let url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" + location.href;
|
||
window.location.href = url;
|
||
}
|
||
}
|
||
else {
|
||
cc.fx.StorageMessage.setStorage(name, data);
|
||
cc.fx.GameConfig.GM_INFO.userId = parseInt(data.userId);
|
||
}
|
||
},
|
||
|
||
containsTrain(str) {
|
||
return /from=train/i.test(str);
|
||
},
|
||
|
||
//埋点上传
|
||
setGameData() {
|
||
//GAME_DATA 初始化 每次清零
|
||
cc.fx.GameConfig.GAME_DATA = [];
|
||
cc.fx.GameConfig.GAME_DATA.push(cc.fx.GameConfig.CLICK_DATA);
|
||
cc.fx.GameConfig.CLICK_init();
|
||
let data = cc.fx.GameConfig.GAME_DATA;
|
||
let matchId = this.getMatchId();
|
||
let postData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"scode": cc.fx.GameConfig.GM_INFO.scode,
|
||
"matchId": matchId,
|
||
"data": data
|
||
};
|
||
|
||
// //console.log("上传数据:",postData);
|
||
// cc.fx.HttpUtil.uploadUserLogData(postData,function(){})
|
||
},
|
||
//上传排行榜 type为1
|
||
setRank(data) {
|
||
//GAME_DATA 初始化 每次清零
|
||
let postData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"type": 1,
|
||
"score": data.score,
|
||
"accuracy": data.date,
|
||
"success": cc.fx.GameConfig.GM_INFO.success
|
||
};
|
||
// cc.fx.HttpUtil.rankData(1,function(){},postData);
|
||
},
|
||
//获取排行榜 type为2
|
||
getRank(data, callback) {
|
||
let rankLength = data.length;
|
||
let postData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"page": 1,
|
||
"pageSize": rankLength
|
||
};
|
||
//回调进getRankData
|
||
// cc.fx.HttpUtil.rankData(2,data =>{callback(data)},postData);
|
||
},
|
||
//获取matchId 用于上传每次点击数据里面记录id方便查询
|
||
getMatchId() {
|
||
let matchId = cc.sys.localStorage.getItem("matchId");
|
||
let tempId = matchId;
|
||
if (matchId == "undifend" || matchId == null) {
|
||
matchId = this.setMatchId();
|
||
}
|
||
else {
|
||
if (this.containsNanana(matchId) == true) {
|
||
matchId = this.setMatchId();
|
||
}
|
||
else {
|
||
let char = parseInt(tempId.substring(10, tempId.length));
|
||
if (cc.fx.GameConfig.GM_INFO.level == 1) {
|
||
char += 1;
|
||
matchId = tempId.slice(0, 10) + char + "";
|
||
if (this.containsNanana(matchId)) matchId = this.setMatchId();
|
||
cc.fx.GameConfig.GM_INFO.matchId = matchId;
|
||
cc.sys.localStorage.setItem("matchId", matchId);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (this.containsNanana(matchId) == true) {
|
||
matchId = this.setMatchId();
|
||
}
|
||
return matchId;
|
||
},
|
||
//检测matchId 如果有缓存以前的nanana数据清除
|
||
containsNanana(str) {
|
||
return /na/i.test(str);
|
||
},
|
||
//重新设置MatchId
|
||
setMatchId() {
|
||
// 定义包含可用字符的字符集
|
||
const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||
// 创建一个数组以保存随机字符
|
||
const uuidArray = [];
|
||
// 循环10次 生成10位的UUID
|
||
for (let i = 0; i < 10; i++) {
|
||
// 生成随机索引,范围是字符集的长度
|
||
const randomIndex = Math.floor(Math.random() * characters.length);
|
||
// 从字符集中获取随机字符
|
||
const randomChar = characters.charAt(randomIndex);
|
||
// 将字符添加到数组中
|
||
uuidArray.push(randomChar);
|
||
}
|
||
let data = uuidArray.join('') + 1 + "";
|
||
cc.sys.localStorage.setItem("matchNumber", 1);
|
||
cc.sys.localStorage.setItem("matchId", data);
|
||
cc.fx.GameConfig.GM_INFO.matchId = data;
|
||
return data;
|
||
},
|
||
//截取名字
|
||
subName(name, length) {
|
||
if (name.length > length) {
|
||
name = name.substring(0, 5) + "..."
|
||
}
|
||
return name;
|
||
},
|
||
//设置头像
|
||
setPic(node, pic) {
|
||
node.active = false;
|
||
let url = pic;
|
||
setTimeout(() => {
|
||
fetch(url)
|
||
.then(response => {
|
||
return response.headers.get('Content-Length');
|
||
})
|
||
.then(errNo => {
|
||
if (errNo == "5093") {
|
||
node.active = true;
|
||
}
|
||
})
|
||
.catch(error => {
|
||
// console.error('Error fetching X-Info:', error);
|
||
});
|
||
}, 100);
|
||
cc.assetManager.loadRemote(url, { ext: '.png' }, (err, texture: cc.Texture2D) => {
|
||
if (texture) {
|
||
node.active = true;
|
||
node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
|
||
}
|
||
else {
|
||
// //console.log(err,texture)
|
||
}
|
||
})
|
||
},
|
||
//第一个参数把目标带进来处理,第二个参数为名字长度,不同场景不同需求
|
||
//名字4短,小排行,名字6长,大排行
|
||
getRankData(data, target, nameLength) {
|
||
target.listData = data.data.rank;
|
||
// target.selfData = data.data.info;
|
||
let rankData = [];
|
||
let self = false;
|
||
//cc.fx.GameTool.setPic(target.selfNode.getChildByName("pic").getChildByName("icon"), target.selfData.pic);
|
||
for (let i = 0; i <= target.listData.length - 1; i++) {
|
||
rankData.push({ rank: (i + 1), name: target.listData[i].nickName, total: target.listData[i].score, time: null, pic: target.listData[i].pic });
|
||
if (cc.fx.GameConfig.GM_INFO.userId == target.listData[i].userId) {
|
||
self = true;
|
||
target.rankNumber = i;
|
||
target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = (i + 1) + "";
|
||
}
|
||
if (i == (target.listData.length - 1) && self == false) {
|
||
target.rankNumber = i;
|
||
target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = "99+";
|
||
}
|
||
}
|
||
// target.selfData.nickName = cc.fx.GameTool.subName(target.selfData.nickName, nameLength);
|
||
// target.selfNode.getChildByName("nameLab").getComponent(cc.Label).string = target.selfData.nickName;
|
||
// target.selfNode.getChildByName("totalLab").getComponent(cc.Label).string = target.selfData.score;
|
||
//let timeTemp = cc.fx.GameTool.getTimeShenNong(target.selfData.totleTimes);
|
||
// target.selfNode.getChildByName("timeLab").getComponent(cc.Label).string = timeTemp + "";
|
||
switch (target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string) {
|
||
case "1":
|
||
target.selfNode.getChildByName("rank").getChildByName("one").active = true;
|
||
break;
|
||
case "2":
|
||
target.selfNode.getChildByName("rank").getChildByName("two").active = true;
|
||
break;
|
||
case "3":
|
||
target.selfNode.getChildByName("rank").getChildByName("three").active = true;
|
||
break;
|
||
}
|
||
// 大排行
|
||
if (nameLength == 6) {
|
||
// target.rankList.setData(rankData);
|
||
// target.selfNode.opacity = 255;
|
||
// if (target.selfData.totalSunCount == 0) target.selfNode.opacity = 0;
|
||
}
|
||
},
|
||
|
||
getSeedRandom: function (min, max) {//包含min 不包含max
|
||
// //console.log("随机数:",cc.fx.GameConfig.GM_INFO.currSeed);
|
||
max = max || 1;
|
||
min = min || 0;
|
||
cc.fx.GameConfig.GM_INFO.currSeed = (cc.fx.GameConfig.GM_INFO.currSeed * 9301 + 49297) % 233280;
|
||
let rnd = cc.fx.GameConfig.GM_INFO.currSeed / 233280.0;
|
||
let tmp = min + rnd * (max - min);
|
||
return parseInt(tmp);
|
||
},
|
||
//获取关卡配置的那个关卡数
|
||
getCustom(type) {
|
||
let custom = cc.fx.StorageMessage.getStorage(cc.fx.storageType.storageTypeCustom);
|
||
if (custom == "undifend" || custom == null || custom == "") {
|
||
this.setCustom();
|
||
}
|
||
else {
|
||
cc.fx.GameConfig.GM_INFO_SET("custom", custom[0]);
|
||
if (custom[0] != 0 || type == true) {
|
||
custom.shift();
|
||
if (custom.length == 0) {
|
||
this.setCustom();
|
||
}
|
||
else cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, custom);
|
||
}
|
||
}
|
||
},
|
||
//本地没有存储到配置,或者配置用完,重新创建配置
|
||
setCustom() {
|
||
let arrayLength = cc.fx.GameConfig.LEVEL_INFO.length;
|
||
let arrayList = [];
|
||
for (let i = 1; i < arrayLength; i++) {
|
||
arrayList.push(i);
|
||
}
|
||
arrayList.sort(() => Math.random() - 0.5);
|
||
arrayList.unshift(0)
|
||
cc.fx.GameConfig.GM_INFO_SET("custom", arrayList[0]);
|
||
cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, arrayList);
|
||
},
|
||
|
||
|
||
getSetScreenResolutionFlag: function () {
|
||
let size = cc.winSize;
|
||
let width = size.width;
|
||
let height = size.height;
|
||
if ((height / width) > (16.2 / 9)) return false;
|
||
return true;
|
||
},
|
||
//判断全面屏适配
|
||
setFit: function (canvas) {
|
||
let flag = cc.fx.GameTool.getSetScreenResolutionFlag();
|
||
if (flag) {
|
||
// //console.log("不是全面屏");
|
||
} else {
|
||
// //console.log("是全面屏");
|
||
}
|
||
return flag;
|
||
},
|
||
//获取游戏信息
|
||
getGameInfo: function (node) {
|
||
var jg = false;
|
||
return jg;
|
||
},
|
||
//设置游戏信息
|
||
setGameInfo: function (pd) {
|
||
|
||
},
|
||
|
||
//打字机效果
|
||
typingAni(label, text, cb, target) {
|
||
var self = target;
|
||
var html = '';
|
||
var arr = text.split('');
|
||
var len = arr.length;
|
||
var step = 0;
|
||
self.func = () => {
|
||
html += arr[step];
|
||
label.string = html;
|
||
if (++step == len) {
|
||
self.unschedule(self.func);
|
||
cb && cb();
|
||
}
|
||
}
|
||
self.schedule(self.func, 0.1, cc.macro.REPEAT_FOREVER, 0)
|
||
},
|
||
|
||
//输入秒,返回需要展示时间格式
|
||
getTimeMargin: (second) => {
|
||
let total = 0;
|
||
total = second;
|
||
let hour = 0;
|
||
hour = parseInt((total / 3600) + "");//计算整数小时数
|
||
let afterHour = total - hour * 60 * 60;//取得算出小时数后剩余的秒数
|
||
let min = parseInt((afterHour / 60) + "");//计算整数分
|
||
let m = "" + min;
|
||
if (min < 10) m = "0" + min;
|
||
let afterMin = total - hour * 60 * 60 - min * 60;//取得算出分后剩余的秒数
|
||
let miao = afterMin + "";
|
||
if (afterMin < 10) miao = "0" + afterMin;
|
||
return m + ':' + miao
|
||
},
|
||
|
||
//输入秒,返回需要展示时间格式
|
||
getTimeMargin2: (second) => {
|
||
// 计算总秒数
|
||
let total = Math.floor(second);
|
||
// 计算小时数
|
||
const hours = Math.floor(total / 3600);
|
||
total %= 3600;
|
||
// 计算分钟数
|
||
const minutes = Math.floor(total / 60);
|
||
// 计算剩余秒数
|
||
const seconds = total % 60;
|
||
|
||
// 将小时、分钟和秒转换为两位数的字符串
|
||
const hh = String(hours).padStart(2, '0');
|
||
const mm = String(minutes).padStart(2, '0');
|
||
const ss = String(seconds).padStart(2, '0');
|
||
|
||
// 若小时数大于 0,返回包含小时的完整格式,否则只返回分和秒
|
||
return hours > 0 ? `${hh}:${mm}:${ss}` : `${mm}:${ss}`;
|
||
},
|
||
|
||
//输入秒,返回需要展示时间格式
|
||
getTimeShenNong: (second) => {
|
||
second = parseInt(second / 1000 + "");
|
||
let total = 0;
|
||
total = second;
|
||
let min = 0;
|
||
if (total > 60) {
|
||
min = parseInt((total / 60) + "");//计算整数分
|
||
}
|
||
let m = min + "'";
|
||
|
||
let afterMin = total - min * 60;//取得算出分后剩余的秒数
|
||
let miao = afterMin + "''";
|
||
return m + miao
|
||
},
|
||
|
||
//打乱数组
|
||
shuffleArray: function (array) {
|
||
for (let i = array.length - 1; i > 0; i--) {
|
||
const j = Math.floor(Math.random() * (i + 1));
|
||
[array[i], array[j]] = [array[j], array[i]];
|
||
}
|
||
return array;
|
||
},
|
||
|
||
|
||
//增加关卡数
|
||
addLevel(time1, time2) {
|
||
cc.fx.GameConfig.GM_INFO.level += 1;
|
||
cc.fx.GameTool.maxLevel()
|
||
MiniGameSdk.API.setNewCloudlevel();
|
||
const timestamp = Date.now();
|
||
let levelInfo = {
|
||
level: cc.fx.GameConfig.GM_INFO.level,
|
||
timestamp: timestamp,
|
||
}
|
||
//console.log("55555存储关卡数据:", time1, time2);
|
||
|
||
cc.fx.StorageMessage.setStorage("level", levelInfo);
|
||
let is_frenzy = false;
|
||
if (MapConroler._instance) {
|
||
is_frenzy = MapConroler._instance.is_frenzy;
|
||
}
|
||
if (time1 != null && time2 != null) {
|
||
let data = {
|
||
time: time1,
|
||
add_Time: time2,
|
||
is_frenzy: is_frenzy,
|
||
result: "success"
|
||
}
|
||
cc.fx.GameTool.shushu_Track("finish_stage", data);
|
||
let data2 = {
|
||
is_frenzy: is_frenzy,
|
||
count: cc.fx.GameConfig.GM_INFO.winStreak
|
||
}
|
||
cc.fx.GameTool.shushu_Track("hammer_frenzy", data2);
|
||
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
|
||
}
|
||
|
||
cc.fx.GameTool.setUserLevel((data) => {
|
||
// //console.log("存储结果:",data);
|
||
// //console.log("上传",data);
|
||
})
|
||
},
|
||
|
||
//关卡上限
|
||
maxLevel() {
|
||
let jg = false;
|
||
if (cc.fx.GameConfig.GM_INFO.level > 649) {
|
||
cc.fx.GameConfig.GM_INFO.level = 650;
|
||
jg = true;
|
||
}
|
||
return jg;
|
||
},
|
||
|
||
//改变金币信息
|
||
changeCoin(coin) {
|
||
//console.log("changeCoin", coin);
|
||
if (coin == undefined) return;
|
||
if (coin < 0 && cc.fx.GameConfig.GM_INFO.coin < -coin) {
|
||
// //console.log("金币不足",cc.fx.GameConfig.GM_INFO.coin,-coin);
|
||
return;
|
||
}
|
||
cc.fx.GameConfig.GM_INFO.coin += coin;
|
||
if (coin > 0) {
|
||
// let data = "获得" + (coin) + "金币";
|
||
// MiniGameSdk.API.showToast(data);
|
||
}
|
||
else {
|
||
let data = "消耗" + (-coin) + "金币";
|
||
MiniGameSdk.API.showToast(data);
|
||
}
|
||
if (cc.fx.GameConfig.GM_INFO.coin < 0) {
|
||
cc.fx.GameConfig.GM_INFO.coin = 0;
|
||
}
|
||
// //console.log("改变的金币:",coin);
|
||
// //console.log("自身金币信息:",cc.fx.GameConfig.GM_INFO.coin);
|
||
const timestamp = Date.now();
|
||
let coinInfo = {
|
||
coin: cc.fx.GameConfig.GM_INFO.coin,
|
||
timestamp: timestamp,
|
||
}
|
||
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
|
||
cc.fx.StorageMessage.setStorage("coin", coinInfo);
|
||
// //console.log("存储金币数据:",cc.fx.GameConfig.GM_INFO.coin,coinInfo);
|
||
cc.fx.GameTool.setUserCoin((data) => {
|
||
// //console.log("上传",data);
|
||
})
|
||
},
|
||
//@ts-ignore
|
||
//获取用户金币数量
|
||
getUserCoin(callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
//laf云函数
|
||
Utils.getUserCoin((data) => {
|
||
if (data) {
|
||
if (callback) callback(data);
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
//改变用户金币
|
||
setUserCoin(callback) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
if (cc.fx.GameConfig.GM_INFO.coin <= 0 || cc.fx.GameConfig.GM_INFO.coin == undefined) {
|
||
cc.fx.GameConfig.GM_INFO.coin = 0;
|
||
}
|
||
//laf云函数
|
||
Utils.setUserCoin((data) => {
|
||
console.log("上传laf云函数用户金币:", data);
|
||
})
|
||
}
|
||
},
|
||
|
||
|
||
//获取用户关卡数
|
||
getUserLevel(callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
//laf云函数
|
||
Utils.getUserLevel((data) => {
|
||
if (data) {
|
||
if (callback) callback(data);
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
//进游戏处理 体力值情况
|
||
getHealth(callback: Function) {
|
||
let health = cc.fx.StorageMessage.getStorage("health");
|
||
const timestamp = Date.now();
|
||
cc.fx.GameConfig.GM_INFO.hp = cc.fx.GameConfig.GM_INFO.hp_Max;
|
||
//没有存储过体力值
|
||
if (health == null || health == undefined || health == "") {
|
||
//console.log("没存储过体力值,初进");
|
||
cc.fx.GameConfig.GM_INFO.hp = cc.fx.GameConfig.GM_INFO.hp_Max;
|
||
cc.fx.GameTool.getUserHealth((res) => {
|
||
//console.log("体力接口返回结果", data);
|
||
if (res.code == 1) {
|
||
cc.fx.GameConfig.GM_INFO.hp = res.data.healthAmount;
|
||
cc.fx.GameConfig.GM_INFO.min_Time = res.data.timestamp;
|
||
let healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": res.data.timestamp
|
||
}
|
||
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
|
||
cc.fx.StorageMessage.setStorage("health", healthInfo);
|
||
}
|
||
else {
|
||
cc.fx.GameTool.setUserHealth(0, () => {
|
||
});
|
||
}
|
||
if (callback) callback();
|
||
})
|
||
}
|
||
else {
|
||
//console.log("有存储过体力值:", health);
|
||
cc.fx.GameConfig.GM_INFO.hp = health.health;
|
||
//console.log("体力值读取完毕", cc.fx.GameConfig.GM_INFO.hp);
|
||
if (health.health < 0) {
|
||
//console.log("体力值异常,归零");
|
||
cc.fx.GameConfig.GM_INFO.hp = 0;
|
||
cc.fx.GameConfig.GM_INFO.min_Time = 0;
|
||
cc.fx.GameTool.setUserHealth(0, () => {
|
||
if (callback) callback();
|
||
});
|
||
}
|
||
else if (health.health < cc.fx.GameConfig.GM_INFO.hp_Max) {
|
||
// 30分钟的毫秒数
|
||
const thirtyMinutes = 30 * 60 * 1000;
|
||
const elapsedTime = timestamp - health.timestamp;
|
||
// 计算恢复的体力值
|
||
const recoveredHealth = Math.min(cc.fx.GameConfig.GM_INFO.hp_Max - health.health, Math.floor(elapsedTime / thirtyMinutes));
|
||
if (recoveredHealth > 0) {
|
||
health.health += recoveredHealth;
|
||
// 更新 health.timestamp
|
||
health.timestamp += recoveredHealth * thirtyMinutes;
|
||
cc.fx.GameTool.setUserHealth(recoveredHealth, () => {
|
||
if (callback) callback();
|
||
}, true);
|
||
// MiniGameSdk.API.showToast("恢复1点体力值");
|
||
//console.log(`体力值恢复 ${recoveredHealth} 点,当前体力值: ${cc.fx.GameConfig.GM_INFO.hp}`);
|
||
// 如果体力增加后仍未满,更新计时
|
||
if (cc.fx.GameConfig.GM_INFO.hp < cc.fx.GameConfig.GM_INFO.hp_Max) {
|
||
const remainingTime = Math.ceil((thirtyMinutes - ((timestamp - health.timestamp) % thirtyMinutes)) / 1000);
|
||
cc.fx.GameConfig.GM_INFO.min_Time = remainingTime;
|
||
// 更新本地存储的体力信息
|
||
let healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": health.timestamp
|
||
}
|
||
cc.fx.StorageMessage.setStorage("health", healthInfo);
|
||
}
|
||
} else {
|
||
// 计算距离下一次恢复的剩余时间
|
||
const remainingTime = Math.ceil((thirtyMinutes - (elapsedTime % thirtyMinutes)) / 1000);
|
||
//console.log(`体力值未满,待恢复,距离下一次恢复还剩 ${remainingTime} 秒`);
|
||
cc.fx.GameConfig.GM_INFO.min_Time = remainingTime;
|
||
if (callback) callback();
|
||
}
|
||
}
|
||
else {
|
||
//console.log("体力值已满");
|
||
if (callback) callback();
|
||
}
|
||
}
|
||
},
|
||
|
||
//获取用户体力值
|
||
getUserHealth(callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
console.log("即将进入体力获取接口");
|
||
//laf云函数
|
||
Utils.getUserHealth((res) => {
|
||
if (res.code == 1) {
|
||
if (callback) callback(res);
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
//设置用户体力值 有可能加,有可能定时器减
|
||
setUserHealth(health, callback, update) {
|
||
if (health > 0) {
|
||
if (cc.fx.GameConfig.GM_INFO.hp < cc.fx.GameConfig.GM_INFO.hp_Max) {
|
||
cc.fx.GameConfig.GM_INFO.hp += health;
|
||
if (cc.fx.GameConfig.GM_INFO.hp > cc.fx.GameConfig.GM_INFO.hp_Max) {
|
||
cc.fx.GameConfig.GM_INFO.hp = cc.fx.GameConfig.GM_INFO.hp_Max;
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
cc.fx.GameConfig.GM_INFO.hp += health;
|
||
if (cc.fx.GameConfig.GM_INFO.hp < 0)
|
||
cc.fx.GameConfig.GM_INFO.hp = 0;
|
||
}
|
||
|
||
// else MiniGameSdk.API.showToast("体力值恢复");
|
||
const timestamp = Date.now();
|
||
let healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": timestamp
|
||
}
|
||
|
||
//如果消耗之前不是满体力,说明已经在恢复期,并不用修改时间
|
||
if (health < 0 && cc.fx.GameConfig.GM_INFO.hp != cc.fx.GameConfig.GM_INFO.hp_Max - 1) {
|
||
let oldTime = cc.fx.StorageMessage.getStorage("health").timestamp;
|
||
healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": oldTime
|
||
}
|
||
}
|
||
// 体力为满的,health没变化,则刷新体力时间为0
|
||
else if (cc.fx.GameConfig.GM_INFO.hp == cc.fx.GameConfig.GM_INFO.hp_Max && health == 0) {
|
||
healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": 0
|
||
}
|
||
}
|
||
|
||
// 增加体力,且增加后体力未满
|
||
else if (health > 0 && cc.fx.GameConfig.GM_INFO.hp != cc.fx.GameConfig.GM_INFO.hp_Max) {
|
||
let oldTime = cc.fx.StorageMessage.getStorage("health").timestamp;
|
||
if (update) {
|
||
oldTime = timestamp;
|
||
}
|
||
healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": oldTime
|
||
}
|
||
}
|
||
else {
|
||
healthInfo = {
|
||
"health": cc.fx.GameConfig.GM_INFO.hp,
|
||
"timestamp": timestamp
|
||
}
|
||
}
|
||
|
||
cc.fx.StorageMessage.setStorage("health", healthInfo);
|
||
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
//laf云函数
|
||
Utils.setUserHealth(healthInfo.timestamp, (data) => {
|
||
if (callback) {
|
||
callback(data);
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
//购买行为
|
||
buyReview(coin, callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
// //console.log("实际即将消耗金币:",coin);
|
||
// this.changeCoin(coin);
|
||
callback();
|
||
}
|
||
},
|
||
|
||
//更改用户道具数
|
||
buyProp(propid, callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
|
||
let num = 3;
|
||
let cost = 600;
|
||
|
||
if (propid == 2003) {
|
||
cost = 900;
|
||
num = 3;
|
||
}
|
||
else if (propid == 2002) {
|
||
num = 1;
|
||
}
|
||
//console.log("_____________新版本", num);
|
||
cc.fx.GameTool.changeCoin(-cost);
|
||
const dataTemp = {
|
||
change_reason: "商城购买道具消耗",
|
||
id: (1001 + ""),
|
||
num: -cost
|
||
}
|
||
cc.fx.GameTool.shushu_Track("resource_cost", dataTemp);
|
||
|
||
let _id = "";
|
||
let propNumber = 0;
|
||
if (propid == 2001) {
|
||
_id = "freeze_in_game";
|
||
cc.fx.GameConfig.GM_INFO.freezeAmount += num;
|
||
propNumber = cc.fx.GameConfig.GM_INFO.freezeAmount;
|
||
}
|
||
else if (propid == 2002) {
|
||
_id = "hammer_in_game";
|
||
cc.fx.GameConfig.GM_INFO.hammerAmount += num;
|
||
propNumber = cc.fx.GameConfig.GM_INFO.hammerAmount;
|
||
}
|
||
else if (propid == 2003) {
|
||
_id = "wand_in_game";
|
||
cc.fx.GameConfig.GM_INFO.magicAmount += num;
|
||
propNumber = cc.fx.GameConfig.GM_INFO.magicAmount;
|
||
}
|
||
|
||
//console.log("购买道具:", num);
|
||
cc.fx.GameTool.setUserProp(propid, propNumber, (data) => {
|
||
})
|
||
|
||
const data = {
|
||
change_reason: "game",
|
||
id: propid,
|
||
num: num,
|
||
compensate: false
|
||
}
|
||
cc.fx.GameTool.shushu_Track("resource_get", data);
|
||
|
||
const buyData = {
|
||
item_id: _id,
|
||
item_num: num,
|
||
item_price: cost,
|
||
cost_type: "gold"
|
||
}
|
||
//console.log("____________即将上传Shop_buy", buyData);
|
||
cc.fx.GameTool.shushu_Track("shop_buy", buyData);
|
||
|
||
callback();
|
||
}
|
||
},
|
||
|
||
|
||
//改变用户关卡
|
||
setUserLevel(callback) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
//laf云函数
|
||
Utils.setUserLevel((data) => {
|
||
})
|
||
}
|
||
},
|
||
|
||
//获取用户关卡数
|
||
getUserProp(callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
//laf云函数
|
||
Utils.getUserProp((data) => {
|
||
if (callback) {
|
||
callback(data);
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
//改变用户道具
|
||
setUserProp(propid, amount, callback) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
let newPropData = null;
|
||
if (propid == 0) {
|
||
newPropData = {
|
||
freeze: cc.fx.GameConfig.GM_INFO.freezeAmount,
|
||
hammer: cc.fx.GameConfig.GM_INFO.hammerAmount,
|
||
magic_wand: cc.fx.GameConfig.GM_INFO.magicAmount,
|
||
}
|
||
}
|
||
else if (propid == 2001) {
|
||
newPropData = amount;
|
||
}
|
||
else if (propid == 2002) {
|
||
newPropData = amount;
|
||
}
|
||
else if (propid == 2003) {
|
||
newPropData = amount;
|
||
}
|
||
|
||
Utils.setUserProp(propid, newPropData, (data) => {
|
||
})
|
||
}
|
||
},
|
||
|
||
// 检查是否有足够的硬币
|
||
consumeCoins(requiredCoins: number, propName: string, amount: number, callback) {
|
||
|
||
|
||
},
|
||
|
||
// 设置用户信息
|
||
setUserInfo(register, callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
const time = cc.fx.GameTool.formatDate(new Date());
|
||
let userInfo = {}
|
||
console.log("源数据:", cc.fx.GameConfig.GM_INFO.useravatarIcon, cc.fx.GameConfig.GM_INFO.useravaterkuang);
|
||
let useravatar = cc.fx.GameConfig.GM_INFO.useravatarIcon;
|
||
console.log(cc.fx.GameTool.getCharAtPosition(useravatar, 5));
|
||
if (useravatar.length < 10) {
|
||
useravatar = cc.fx.GameTool.getCharAtPosition(useravatar, 5);
|
||
}
|
||
let useravaterkuang = cc.fx.GameConfig.GM_INFO.useravaterkuang;
|
||
useravaterkuang = (parseInt(cc.fx.GameTool.getCharAtPosition(useravaterkuang, 6)) - 1) + "";
|
||
console.log("处理后的数据", useravatar, useravaterkuang);
|
||
if (register == true) {
|
||
userInfo = {
|
||
// 这里填写要存储的用户数据
|
||
username: cc.fx.GameConfig.GM_INFO.username, //用户名称
|
||
useravatar: useravatar, //用户头像
|
||
useravatarIcon: useravaterkuang, //用户头像框
|
||
register_time: time
|
||
}
|
||
}
|
||
else if (register == false) {
|
||
userInfo = {
|
||
// 这里填写要存储的用户数据
|
||
username: cc.fx.GameConfig.GM_INFO.username, //用户名称
|
||
useravatar: useravatar, //用户头像
|
||
useravatarIcon: useravaterkuang, //用户头像框
|
||
}
|
||
}
|
||
else {
|
||
userInfo = {
|
||
// 这里填写要存储的用户数据
|
||
username: cc.fx.GameConfig.GM_INFO.username, //用户名称
|
||
useravatar: useravatar, //用户头像
|
||
useravatarIcon: useravaterkuang, //用户头像框
|
||
}
|
||
}
|
||
console.log("上传头像昵称22222", userInfo);
|
||
Utils.setUserData(userInfo, (data) => {
|
||
})
|
||
}
|
||
},
|
||
|
||
//商城购买
|
||
shopBuy(productId, compensate) {
|
||
let coin = 0;
|
||
let price = 0;
|
||
let getCoin = 0;
|
||
|
||
var rewardData = null;
|
||
//console.log(productId);
|
||
//console.log("发放奖励", productId);
|
||
switch (productId) {
|
||
case "gold_1":
|
||
cc.fx.GameTool.changeCoin(1200);
|
||
coin = 1200;
|
||
price = 600;
|
||
// MiniGameSdk.API.showToast("充值成功,获得1200金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "gold_2":
|
||
cc.fx.GameTool.changeCoin(8000);
|
||
coin = 8000;
|
||
price = 3600;
|
||
// MiniGameSdk.API.showToast("充值成功,获得8000金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "gold_3":
|
||
cc.fx.GameTool.changeCoin(16000);
|
||
coin = 16000;
|
||
price = 6800;
|
||
// MiniGameSdk.API.showToast("充值成功,获得16000金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "gold_4":
|
||
cc.fx.GameTool.changeCoin(32000);
|
||
coin = 32000;
|
||
price = 12800;
|
||
// MiniGameSdk.API.showToast("充值成功,获得32000金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "gold_5":
|
||
cc.fx.GameTool.changeCoin(100000);
|
||
coin = 100000;
|
||
price = 32800;
|
||
// MiniGameSdk.API.showToast("充值成功,获得100000金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "gold_6":
|
||
cc.fx.GameTool.changeCoin(240000);
|
||
coin = 240000;
|
||
price = 64800;
|
||
// MiniGameSdk.API.showToast("充值成功,获得240000金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "unlimited_health_bundle_10":
|
||
cc.fx.GameTool.changeCoin(2500);
|
||
coin = 2500;
|
||
price = 1000;
|
||
this.setUserPowerTime(3600);
|
||
// MiniGameSdk.API.showToast("获得无限体力小组合包");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
{ type: "infinite_health", count: 3600 },
|
||
]
|
||
break;
|
||
case "unlimited_health_bundle_20":
|
||
cc.fx.GameTool.changeCoin(5000);
|
||
coin = 5000;
|
||
price = 2000;
|
||
let propData = {
|
||
"freeze": 2,
|
||
"hammer": 2,
|
||
"magic_wand": 2,
|
||
"price": price
|
||
}
|
||
this.getShopProp(propData, compensate);
|
||
this.setUserPowerTime(7200);
|
||
// MiniGameSdk.API.showToast("获得无限体力大组合包");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
{ type: "freeze", count: 2 },
|
||
{ type: "hammer", count: 2 },
|
||
{ type: "magic", count: 2 },
|
||
{ type: "infinite_health", count: 7200 },
|
||
]
|
||
break;
|
||
case "unlimited_health_bundle_30":
|
||
cc.fx.GameTool.changeCoin(7500);
|
||
coin = 7500;
|
||
price = 3000;
|
||
let propData2 = {
|
||
"freeze": 5,
|
||
"hammer": 5,
|
||
"magic_wand": 5,
|
||
"price": price
|
||
}
|
||
this.getShopProp(propData2, compensate);
|
||
this.setUserPowerTime(14400);
|
||
// MiniGameSdk.API.showToast("获得无限体力超组合包");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
{ type: "freeze", count: 5 },
|
||
{ type: "hammer", count: 5 },
|
||
{ type: "magic", count: 5 },
|
||
{ type: "infinite_health", count: 14400 },
|
||
]
|
||
break;
|
||
case "month_Card":
|
||
cc.fx.GameTool.changeCoin(6000);
|
||
coin = 6000;
|
||
price = 3000;
|
||
// MiniGameSdk.API.showToast("充值成功,获得240000金币");
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
]
|
||
break;
|
||
case "reborn_Gift":
|
||
cc.fx.GameTool.changeCoin(1000);
|
||
coin = 1000;
|
||
price = 600;
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
{ type: "freeze", count: 1 },
|
||
{ type: "hammer", count: 1 },
|
||
{ type: "magic", count: 1 },
|
||
]
|
||
let propData3 = {
|
||
"freeze": 1,
|
||
"hammer": 1,
|
||
"magic_wand": 1,
|
||
"price": price
|
||
}
|
||
this.getShopProp(propData3, compensate);
|
||
break;
|
||
case "starter_pack":
|
||
cc.fx.GameTool.changeCoin(3000);
|
||
coin = 3000;
|
||
price = 300;
|
||
let propData4 = {
|
||
"freeze": 5,
|
||
"hammer": 5,
|
||
"magic_wand": 5,
|
||
"price": price
|
||
}
|
||
this.getShopProp(propData4, compensate);
|
||
rewardData = [
|
||
{ type: "coin", count: coin },
|
||
{ type: "freeze", count: 5 },
|
||
{ type: "hammer", count: 5 },
|
||
{ type: "magic", count: 5 }
|
||
]
|
||
break;
|
||
}
|
||
|
||
|
||
if (MapConroler._instance != null) {
|
||
//console.log("應該下發獎勵:", rewardData);
|
||
MapConroler._instance.SceneManager.openRewardWindow(rewardData);
|
||
}
|
||
|
||
else {
|
||
const canvasTemp = cc.find("Canvas"); // 假设 Canvas 节点
|
||
if (canvasTemp) {
|
||
const JiaZai = canvasTemp.getComponent("JiaZai");
|
||
if (JiaZai) {
|
||
JiaZai.openRewardWindow(rewardData);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
const dataTemp = {
|
||
change_reason: "shop",
|
||
id: "1001",
|
||
num: coin,
|
||
compensate: compensate
|
||
}
|
||
cc.fx.GameTool.shushu_Track("resource_get", dataTemp);
|
||
|
||
const buyData = {
|
||
item_id: productId,
|
||
item_num: coin,
|
||
item_price: price,
|
||
cost_type: "cash",
|
||
compensate: compensate
|
||
}
|
||
cc.fx.GameTool.shushu_Track("shop_buy", buyData);
|
||
MiniGameSdk.API.shushu_SetSuperProperties(null, true);
|
||
},
|
||
|
||
getPassCheckPorp(porpId, num, compensate) {
|
||
console.log("getPassCheckPorp道具:", typeof porpId, "數量:", typeof num)
|
||
let propNumber = 0;
|
||
switch (porpId) {
|
||
case 1001:
|
||
cc.fx.GameTool.changeCoin(num);
|
||
break;
|
||
case 2001:
|
||
// cc.fx.GameConfig.GM_INFO.freezeAmount += propNumber;
|
||
cc.fx.GameConfig.GM_INFO.freezeAmount += num;
|
||
propNumber = cc.fx.GameConfig.GM_INFO.freezeAmount;
|
||
cc.fx.GameTool.setUserProp(porpId, propNumber, (data) => {
|
||
})
|
||
break;
|
||
case 2002:
|
||
cc.fx.GameConfig.GM_INFO.hammerAmount += num;
|
||
propNumber = cc.fx.GameConfig.GM_INFO.hammerAmount;
|
||
cc.fx.GameTool.setUserProp(porpId, propNumber, (data) => {
|
||
})
|
||
break;
|
||
case 2003:
|
||
cc.fx.GameConfig.GM_INFO.magicAmount += num;
|
||
propNumber = cc.fx.GameConfig.GM_INFO.magicAmount;
|
||
cc.fx.GameTool.setUserProp(porpId, propNumber, (data) => {
|
||
})
|
||
break;
|
||
case 3001:
|
||
console.log("getPassCheckPorp道具1:", porpId)
|
||
this.setUserPowerTime(900);
|
||
break;
|
||
case 3002:
|
||
this.setUserPowerTime(1800);
|
||
break;
|
||
case 3003:
|
||
this.setUserPowerTime(3600);
|
||
break;
|
||
|
||
}
|
||
const dataTemp = {
|
||
change_reason: "battlepass",
|
||
id: porpId,
|
||
num: num,
|
||
compensate: compensate
|
||
}
|
||
console.log("通行证发放奖励", porpId, num)
|
||
cc.fx.GameTool.shushu_Track("resource_get", dataTemp);
|
||
},
|
||
|
||
formatDate(date: Date): string {
|
||
const year = date.getFullYear();
|
||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||
const day = String(date.getDate()).padStart(2, '0');
|
||
const hours = String(date.getHours()).padStart(2, '0');
|
||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||
const seconds = String(date.getSeconds()).padStart(2, '0');
|
||
const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
|
||
|
||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
||
},
|
||
|
||
//获取时间戳
|
||
getTime() {
|
||
const timestamp = (new Date().getTime())
|
||
return timestamp;
|
||
},
|
||
pushLister: function () {
|
||
|
||
},
|
||
removeAllLister: function () {
|
||
|
||
},
|
||
//上报数据
|
||
shushu_Track: function (name, data) {
|
||
let eventData = {}
|
||
switch (name) {
|
||
case "login":
|
||
eventData = {
|
||
register_time: data.register_time,
|
||
}
|
||
break;
|
||
case "register":
|
||
eventData = {
|
||
register_time: data.register_time,
|
||
}
|
||
break;
|
||
case "enter_stage":
|
||
eventData = {
|
||
stage_id: (cc.fx.GameConfig.GM_INFO.level + 1),
|
||
is_frenzy: data.is_frenzy,
|
||
}
|
||
if (cc.fx.GameConfig.GM_INFO.otherLevel > 0) {
|
||
eventData = {
|
||
stage_id: cc.fx.GameConfig.GM_INFO.otherLevel,
|
||
}
|
||
}
|
||
break;
|
||
case "finish_stage":
|
||
eventData = {
|
||
stage_id: (cc.fx.GameConfig.GM_INFO.level + 1),
|
||
stage_duration: data.time,
|
||
added_time: data.add_Time,
|
||
is_frenzy: data.is_frenzy,
|
||
result: data.result
|
||
}
|
||
if (cc.fx.GameConfig.GM_INFO.otherLevel > 0) {
|
||
eventData = {
|
||
stage_id: cc.fx.GameConfig.GM_INFO.otherLevel,
|
||
stage_duration: data.time,
|
||
added_time: data.add_Time,
|
||
result: data.result
|
||
}
|
||
}
|
||
break;
|
||
case "resource_get":
|
||
eventData = {
|
||
change_reason: data.change_reason, //获得来源
|
||
change_num: data.num, //获得数量
|
||
resource_id: data.id, //道具id
|
||
compensate: data.compensate || false, //是否是补发
|
||
}
|
||
break;
|
||
case "resource_cost":
|
||
eventData = {
|
||
change_reason: data.change_reason, //获得来源
|
||
change_num: data.num, //获得数量
|
||
resource_id: data.id //道具id
|
||
}
|
||
break;
|
||
case "shop_buy":
|
||
eventData = {
|
||
item_id: data.item_id,
|
||
item_num: data.item_num,
|
||
item_price: data.item_price,
|
||
cost_type: data.cost_type,
|
||
}
|
||
break;
|
||
case "init_order": //发起充值时
|
||
eventData = {
|
||
order_id: data.outTradeNo,
|
||
pay_amount: data.price,
|
||
payment_name: data.payment_name,
|
||
payment_num: data.payment_num,
|
||
payment_type: data.type,
|
||
}
|
||
break;
|
||
case "payment": //发起充值时
|
||
eventData = {
|
||
order_id: data.outTradeNo,
|
||
pay_amount: data.pay_amount,
|
||
payment_name: data.payment_name,
|
||
payment_num: data.payment_num,
|
||
payment_type: data.type,
|
||
}
|
||
break;
|
||
case "payment_fail": //发起充值时
|
||
eventData = {
|
||
order_id: data.outTradeNo,
|
||
pay_amount: data.pay_amount,
|
||
payment_name: data.payment_name,
|
||
payment_num: data.payment_num,
|
||
payment_type: data.type,
|
||
fail_reason: data.fail_reason,
|
||
}
|
||
break;
|
||
case "stage_help": //帮助通关时
|
||
eventData = {
|
||
identity: data.identity, //发起者为helped 帮助者为helper
|
||
helpedId: data.helpedId, //被帮助者uid
|
||
level: data.level, //被帮助关卡等级
|
||
success: data.success || null, //被帮助关卡是否成功
|
||
}
|
||
break;
|
||
case "hammer_frenzy":
|
||
eventData = {
|
||
is_frenzy: data.is_frenzy,
|
||
count: data.count
|
||
}
|
||
break;
|
||
case "daily_task":
|
||
eventData = {
|
||
task_id: data.id,
|
||
task_status: data.status
|
||
}
|
||
break;
|
||
case "interface_exposure":
|
||
eventData = {
|
||
interface_id: data.interface_id, // 界面名称
|
||
reason: data.reason, // 事件名称
|
||
is_first_exposure: "", // 是否首次曝光
|
||
entry_point: data.entry_point, // 按钮名称
|
||
}
|
||
break;
|
||
}
|
||
if (name == "stage_help") {
|
||
console.log("准备上报完成", data);
|
||
console.log(eventData);
|
||
// MiniGameSdk.API.showToast("准备上报完成游戏");
|
||
}
|
||
if (name == "finish_stage") {
|
||
if (data.result)
|
||
MiniGameSdk.API.yinli_FinishiStage();
|
||
}
|
||
// MiniGameSdk.API.shushu_Track(name,eventData);
|
||
MiniGameSdk.API.shushu_Track(name, eventData);
|
||
},
|
||
|
||
//获取微信小游戏版本号
|
||
getWechatGameVersion: function () {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
//@ts-ignore
|
||
const accountInfo = wx.getAccountInfoSync();
|
||
const miniProgram = accountInfo.miniProgram;
|
||
switch (miniProgram.envVersion) {
|
||
case 'develop':
|
||
return '开发版';
|
||
case 'trial':
|
||
return '体验版';
|
||
case 'release':
|
||
return '正式版';
|
||
default:
|
||
return '未知版本';
|
||
}
|
||
}
|
||
},
|
||
|
||
//微信小游戏根据openId将用户分组,有可能会两分,三分,六分
|
||
setWechatGameGroup: function (type: 2 | 3 | 6) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
if (cc.fx.GameConfig.GM_INFO.userId) {
|
||
let groupNumber = cc.fx.GameConfig.GM_INFO.userId % type;
|
||
return groupNumber;
|
||
}
|
||
}
|
||
else return 1;
|
||
},
|
||
|
||
|
||
|
||
|
||
//购买行为,获得道具
|
||
getShopProp(propData, compensate) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
const num = propData.freeze;
|
||
//console.log("_________道具增加的数量为:", num);
|
||
cc.fx.GameConfig.GM_INFO.freezeAmount += propData.freeze;
|
||
cc.fx.GameConfig.GM_INFO.hammerAmount += propData.hammer;
|
||
cc.fx.GameConfig.GM_INFO.magicAmount += propData.magic_wand;
|
||
cc.fx.GameTool.setUserProp(0, num, (data) => {
|
||
})
|
||
|
||
const data1 = {
|
||
change_reason: "shop",
|
||
id: 2001,
|
||
num: propData.freeze,
|
||
compensate: compensate
|
||
}
|
||
cc.fx.GameTool.shushu_Track("resource_get", data1);
|
||
const data2 = {
|
||
change_reason: "shop",
|
||
id: 2002,
|
||
num: propData.hammer,
|
||
compensate: compensate
|
||
}
|
||
cc.fx.GameTool.shushu_Track("resource_get", data2);
|
||
const data3 = {
|
||
change_reason: "shop",
|
||
id: 2003,
|
||
num: propData.magic_wand,
|
||
compensate: compensate
|
||
}
|
||
cc.fx.GameTool.shushu_Track("resource_get", data3);
|
||
const buyData1 = {
|
||
item_id: "freeze_in_game",
|
||
item_num: propData.freeze,
|
||
item_price: propData.price,
|
||
cost_type: "cash"
|
||
}
|
||
|
||
cc.fx.GameTool.shushu_Track("shop_buy", buyData1);
|
||
const buyData2 = {
|
||
item_id: "hammer_in_game",
|
||
item_num: propData.hammer,
|
||
item_price: propData.price,
|
||
cost_type: "cash"
|
||
}
|
||
|
||
cc.fx.GameTool.shushu_Track("shop_buy", buyData2);
|
||
const buyData3 = {
|
||
item_id: "wand_in_game",
|
||
item_num: propData.magic_wand,
|
||
item_price: propData.price,
|
||
cost_type: "cash"
|
||
}
|
||
cc.fx.GameTool.shushu_Track("shop_buy", buyData3);
|
||
}
|
||
},
|
||
|
||
|
||
//购买无限体力
|
||
setUserPowerTime(time) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
let nowTime = Math.floor(Date.now() / 1000);
|
||
let powerTime = cc.fx.StorageMessage.getStorage("userPowerTime");
|
||
if (powerTime == "undifend" || powerTime == null || powerTime == "" || powerTime == 0) {
|
||
powerTime = Math.floor(Date.now() / 1000) + time;
|
||
} else {
|
||
if (nowTime >= powerTime) {
|
||
powerTime = nowTime + time;
|
||
}
|
||
else {
|
||
powerTime = powerTime + time;
|
||
}
|
||
}
|
||
cc.fx.GameConfig.GM_INFO.userPowerTime = powerTime;
|
||
cc.fx.StorageMessage.setStorage("userPowerTime", powerTime);
|
||
Utils.setUserPowerTime(powerTime, (data) => {
|
||
//console.log("购买无限体力同步:", data);
|
||
})
|
||
}
|
||
},
|
||
//判断是否有无限体力//返回true有,false没有
|
||
getUserPowerTime() {
|
||
if (cc.fx.GameConfig.GM_INFO.userPowerTime > 0) {
|
||
let nowTime = Math.floor(Date.now() / 1000);
|
||
if (nowTime >= cc.fx.GameConfig.GM_INFO.userPowerTime) {
|
||
cc.fx.GameConfig.GM_INFO.userPowerTime = 0;
|
||
cc.fx.StorageMessage.setStorage("userPowerTime", 0);
|
||
Utils.setUserPowerTime(0, (data) => {
|
||
//console.log("购买无限体力同步:", data);
|
||
})
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
},
|
||
|
||
//判断月卡过期
|
||
checkExpiration() {
|
||
let dateStr = cc.fx.StorageMessage.getStorage("mCardDate");
|
||
//如果过期返回 true ,没过期返回 false
|
||
if (dateStr) {
|
||
//将字符串转换为时间戳
|
||
let dateTime = new Date(dateStr).getTime();
|
||
//当前时间转换为时间戳
|
||
let currentTime = new Date().getTime();
|
||
// console.log("月卡过期时间", dateTime, "当前时间", currentTime,);
|
||
if (dateTime > currentTime) {
|
||
cc.fx.GameConfig.GM_INFO.hp_Max = 7;
|
||
cc.fx.GameConfig.GM_INFO.doubleCoin = 2;
|
||
return true;
|
||
} else {
|
||
cc.fx.GameConfig.GM_INFO.hp_Max = 5;
|
||
cc.fx.GameConfig.GM_INFO.doubleCoin = 1;
|
||
return false;
|
||
}
|
||
|
||
} else {
|
||
cc.fx.GameConfig.GM_INFO.hp_Max = 5;
|
||
cc.fx.GameConfig.GM_INFO.doubleCoin = 1;
|
||
cc.fx.StorageMessage.setStorage("mCardDate", 0);
|
||
return false;
|
||
|
||
}
|
||
},
|
||
|
||
checkStarter_pack() {
|
||
let dateStr = cc.fx.StorageMessage.getStorage("starter_pack");
|
||
},
|
||
|
||
//获取月卡有效期距离今天的天数
|
||
getMonthlyCardValidityDays(): Promise<{ days: number, time: number }> {
|
||
console.log("________________2");
|
||
return new Promise((resolve, reject) => {
|
||
Utils.getMonthlyCard((data) => {
|
||
console.log("月卡返回时间:", data);
|
||
if (data) {
|
||
if (data.code === 1) {
|
||
const validityTime = data.data.monthCardTime; // 后端返回的到期时间戳(毫秒)
|
||
const today = new Date();
|
||
today.setHours(0, 0, 0, 0);
|
||
const todayMidnight = today.getTime();
|
||
const expiryDate = new Date(validityTime);
|
||
expiryDate.setHours(0, 0, 0, 0);
|
||
const expiryMidnight = expiryDate.getTime();
|
||
const diffMs = expiryMidnight - todayMidnight;
|
||
const days = Math.floor(diffMs / 86400000);
|
||
const remainingDays = Math.max(0, days);
|
||
cc.fx.GameConfig.GM_INFO.monthTime = remainingDays;
|
||
let obj = {
|
||
days: remainingDays,
|
||
time: validityTime,
|
||
}
|
||
resolve(obj);
|
||
|
||
} else {
|
||
// resolve(0); // 或 reject(data) 根据需要
|
||
}
|
||
}
|
||
else {
|
||
// resolve(0); // 或 reject(data) 根据需要
|
||
}
|
||
});
|
||
});
|
||
},
|
||
|
||
// 设置用户信息
|
||
setUserAvatar(callback: Function) {
|
||
//@ts-ignore
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
let useravatar = cc.fx.GameConfig.GM_INFO.useravatarIcon;
|
||
if (useravatar.length < 10) {
|
||
useravatar = cc.fx.GameTool.getCharAtPosition(useravatar, 5);
|
||
}
|
||
let useravaterkuang = cc.fx.GameConfig.GM_INFO.useravaterkuang;
|
||
console.log(cc.fx.GameTool.getCharAtPosition(useravaterkuang, 6));
|
||
useravaterkuang = (parseInt(cc.fx.GameTool.getCharAtPosition(useravaterkuang, 6)) - 1) + "";
|
||
let userInfo = {
|
||
// 这里填写要存储的用户数据
|
||
username: cc.fx.GameConfig.GM_INFO.username, //用户名称
|
||
useravatar: useravatar, //用户头像
|
||
useravatarIcon: useravaterkuang, //用户头像框
|
||
}
|
||
console.log("上传头像昵称", userInfo);
|
||
Utils.setUserData(userInfo, (data) => {
|
||
})
|
||
}
|
||
},
|
||
|
||
getUserAvatar(callBack: Function) {
|
||
//@ts-ignore
|
||
if (typeof wx === 'undefined') {
|
||
// this.showRanks(); // 非微信环境直接显示
|
||
return;
|
||
}
|
||
console.log('______________点击获取用户信息');
|
||
let user_Info = cc.fx.StorageMessage.getStorage("user_Info");
|
||
if (cc.fx.GameConfig.GM_INFO.wxUserInfo == true) {
|
||
console.log("________授权过用户头像昵称");
|
||
if (user_Info != null && user_Info != undefined && user_Info != "") {
|
||
cc.fx.GameConfig.GM_INFO.useravatar = user_Info.useravatar; // 用户头像 URL
|
||
cc.fx.GameConfig.GM_INFO.username = user_Info.username; // 用户昵称
|
||
console.log("缓存有用户头像昵称,直接用");
|
||
setTimeout(() => {
|
||
if (callBack) callBack(false);
|
||
}, 200);
|
||
} else {
|
||
console.log("缓存没有用户头像昵称,重新获取");
|
||
//@ts-ignore
|
||
wx.getUserInfo({
|
||
success: (res) => {
|
||
const userInfo = res.userInfo;
|
||
cc.fx.GameConfig.GM_INFO.useravatar = userInfo.avatarUrl; // 用户头像 URL
|
||
cc.fx.GameConfig.GM_INFO.username = userInfo.nickName; // 用户昵称
|
||
const user_Info = {
|
||
username: cc.fx.GameConfig.GM_INFO.username,
|
||
useravatar: cc.fx.GameConfig.GM_INFO.useravatar,
|
||
}
|
||
console.log('用户已授权', res.userInfo);
|
||
cc.fx.StorageMessage.setStorage('user_Info', user_Info);
|
||
cc.fx.GameTool.setUserInfo(false, (data) => {
|
||
console.log("设置用户信息成功__________", data);
|
||
});
|
||
setTimeout(() => {
|
||
if (callBack) callBack(false);
|
||
}, 200);
|
||
},
|
||
fail: (err) => {
|
||
console.error('获取用户信息失败', err);
|
||
if (callBack) callBack(false);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
else {
|
||
console.log("________没有授权过用户头像昵称");
|
||
MiniGameSdk.API.getWechatUserInfoAuth(callBack);
|
||
}
|
||
|
||
},
|
||
|
||
|
||
getDailyQuestsInfo(callBack: Function) {
|
||
Utils.getDailyQuestInfo((data) => {
|
||
if (callBack) callBack(data);
|
||
})
|
||
},
|
||
|
||
setDailyQuestInfo(callBack: Function) {
|
||
Utils.setDailyQuestInfo((data) => {
|
||
if (callBack) callBack(data);
|
||
})
|
||
},
|
||
|
||
setWinStreak(type) {
|
||
if (type == "sucess") {
|
||
if (cc.fx.GameConfig.GM_INFO.winStreak < 10) {
|
||
cc.fx.GameConfig.GM_INFO.winStreak += 1;
|
||
if (cc.fx.GameConfig.GM_INFO.winStreak == 10) {
|
||
cc.fx.GameConfig.GM_INFO.winStreakFirst = true;
|
||
}
|
||
cc.fx.StorageMessage.setStorage("winStreak", cc.fx.GameConfig.GM_INFO.winStreak);
|
||
Utils.setWinStreak((data) => {
|
||
})
|
||
}
|
||
} else if (type == "fail") {
|
||
if (cc.fx.GameConfig.GM_INFO.winStreak == 10) {
|
||
cc.fx.GameConfig.GM_INFO.winStreak = 0;
|
||
cc.fx.StorageMessage.setStorage("winStreak", cc.fx.GameConfig.GM_INFO.winStreak);
|
||
Utils.setWinStreak((data) => {
|
||
|
||
})
|
||
}
|
||
}
|
||
},
|
||
|
||
//判断本地缓存关卡等级是否大于服务器存储
|
||
//返回true本地缓存大于服务器存储,false本地缓存小于等于服务器存储
|
||
// compareLevel() {
|
||
// if (cc.fx.GameConfig.GM_INFO.level < cc.fx.StorageMessage.getStorage("level")) {
|
||
|
||
// }
|
||
// }
|
||
|
||
// 取出字符串中指定位置的字符
|
||
getCharAtPosition(str: string, position: number): string | null {
|
||
if (position >= 0 && position < str.length) {
|
||
return str[position];
|
||
}
|
||
return null;
|
||
},
|
||
|
||
onShowVideo(callback: Function, videoData: any) {
|
||
console.log("调用广告");
|
||
if ((typeof wx !== 'undefined' && wx !== null) || (typeof tt !== 'undefined' && tt !== null)) {
|
||
let scene = null;
|
||
if (videoData.current_page == "HomeScene") {
|
||
const jiazaiNode = cc.find("Canvas"); // 假设 JiaZai 挂在 Canvas 节点
|
||
if (jiazaiNode) {
|
||
scene = jiazaiNode.getComponent(JiaZai);
|
||
if (scene) {
|
||
scene.openLoad();
|
||
}
|
||
}
|
||
}
|
||
else if (videoData.current_page == "GameScene") {
|
||
const canvasTemp = cc.find("Canvas"); // 假设 Canvas 节点
|
||
if (canvasTemp) {
|
||
scene = canvasTemp.getComponent("SceneManager");
|
||
if (scene) {
|
||
scene.openLoad();
|
||
}
|
||
}
|
||
}
|
||
let requestData = {
|
||
ad_type: "激励视频", //广告类型
|
||
ad_placement_name: videoData.ad_placement_name, //内部广告位名称 1001 双倍金币
|
||
ad_placement_id: "adunit-aa9a28e1631bf16f", //内部广告位ID
|
||
current_page: videoData.current_page, //所在页面
|
||
}
|
||
cc.fx.GameTool.shushu_Track("ad_request", requestData);
|
||
cc.fx.GameConfig.GM_INFO.videoTime = Math.floor(Date.now() / 1000);
|
||
// 添加超时处理
|
||
const timeoutId = setTimeout(() => {
|
||
if (scene) scene.closeLoad();
|
||
MiniGameSdk.API.showToast('广告加载超时,请稍后再试');
|
||
// 调用回调并传入错误状态
|
||
callback(false);
|
||
}, 6000); // 6秒超时
|
||
cc.fx.GameTool.waitForAdPreload().then(() => {
|
||
MiniGameSdk.AdvertManager.instance.showVideo('adunit-aa9a28e1631bf16f', videoData, (res: MiniGameSdk.EAdVideoResult, count: number) => {
|
||
if (timeoutId) clearTimeout(timeoutId);
|
||
console.log('用户看的视频广告个数是:', count);
|
||
console.log('用户观看视频广告结果:', res);
|
||
if (scene) scene.closeLoad();
|
||
let duration = Math.floor(Date.now() / 1000) - cc.fx.GameConfig.GM_INFO.videoTime;
|
||
if (duration <= 0) duration = 0;
|
||
let data = {
|
||
ad_type: "激励视频", //广告类型
|
||
ad_placement_name: videoData.ad_placement_name, //内部广告位名称 //2000复活 道具 2001 2002 2003
|
||
ad_placement_id: "adunit-aa9a28e1631bf16f", //内部广告位ID
|
||
current_page: videoData.current_page, //所在页面
|
||
ad_duration: duration, //广告展示时长
|
||
ad_play_duration: 30, //广告播放时长
|
||
is_complete_play: false //是否完整播放
|
||
}
|
||
switch (res) {
|
||
case MiniGameSdk.EAdVideoResult.ACCEPT:
|
||
data.is_complete_play = true;
|
||
MiniGameSdk.API.showToast('用户看完广告,可以奖励');
|
||
cc.fx.GameTool.shushu_Track("ad_close", data);
|
||
callback(true, "ad");
|
||
// cc.fx.GameTool.preloadRewardedVideoAd(true);
|
||
break;
|
||
case MiniGameSdk.EAdVideoResult.REJECT:
|
||
data.is_complete_play = false;
|
||
MiniGameSdk.API.showToast('广告中断,未获得奖励');
|
||
cc.fx.GameTool.shushu_Track("ad_close", data);
|
||
callback(false);
|
||
// cc.fx.GameTool.preloadRewardedVideoAd(true);
|
||
break;
|
||
case MiniGameSdk.EAdVideoResult.ERROR:
|
||
MiniGameSdk.API.showToast('广告加载失败,请稍后再试');
|
||
callback(false);
|
||
// cc.fx.GameTool.preloadRewardedVideoAd(true);
|
||
|
||
break;
|
||
default:
|
||
// 其他情况,不作处理
|
||
break;
|
||
}
|
||
});
|
||
})
|
||
}
|
||
},
|
||
|
||
// 预加载激励视频广告
|
||
|
||
preloadRewardedVideoAd(force: boolean = false): Promise<boolean> {
|
||
console.log("开始预加载激励视频广告, force:", force);
|
||
|
||
// 如果不是强制重新加载,检查是否已经有预加载正在进行或已完成
|
||
if (!force && this._lastPreloadTime) {
|
||
const now = Date.now();
|
||
// 如果距离上次预加载不到5分钟,不重复预加载
|
||
if (now - this._lastPreloadTime < 5 * 60 * 1000) {
|
||
console.log("广告预加载间隔时间不足,跳过本次预加载");
|
||
return Promise.resolve(true);
|
||
}
|
||
}
|
||
|
||
this._lastPreloadTime = Date.now();
|
||
|
||
return new Promise((resolve) => {
|
||
// 使用 setTimeout 确保在场景加载完成后再预加载广告
|
||
setTimeout(() => {
|
||
try {
|
||
// 预加载激励视频广告
|
||
const preloadPromise = MiniGameSdk.AdvertManager.instance.preloadVideo('adunit-aa9a28e1631bf16f');
|
||
|
||
// 添加超时处理,避免预加载Promise永远处于pending状态
|
||
const preloadTimeout = setTimeout(() => {
|
||
console.log('预加载激励视频广告超时');
|
||
resolve(true);
|
||
}, 5000);// 5秒预加载超时
|
||
|
||
preloadPromise
|
||
.then(() => {
|
||
clearTimeout(preloadTimeout);
|
||
console.log('激励视频广告预加载成功');
|
||
resolve(true);
|
||
})
|
||
.catch((error) => {
|
||
clearTimeout(preloadTimeout);
|
||
console.error('预加载激励视频广告失败:', error);
|
||
resolve(true);
|
||
});
|
||
|
||
console.log('激励视频广告预加载已启动');
|
||
} catch (error) {
|
||
console.error('预加载激励视频广告失败:', error);
|
||
resolve(true);
|
||
}
|
||
}, 1000); // 延迟1秒预加载,确保场景加载完成
|
||
});
|
||
},
|
||
|
||
//等待广告预加载完成
|
||
waitForAdPreload(): Promise<void> {
|
||
console.log("等待广告预加载完成...");
|
||
return new Promise((resolve) => {
|
||
const waitTimeout = setTimeout(() => {
|
||
console.log("等待广告预加载超时,继续执行");
|
||
resolve();
|
||
}, 5000); // 5秒等待超时
|
||
|
||
MiniGameSdk.AdvertManager.instance.isPreloadReady()
|
||
.then(() => {
|
||
clearTimeout(waitTimeout);
|
||
console.log("广告预加载已完成");
|
||
resolve();
|
||
})
|
||
.catch(() => {
|
||
clearTimeout(waitTimeout);
|
||
console.log("广告预加载出错,继续执行");
|
||
resolve();
|
||
});
|
||
});
|
||
},
|
||
|
||
// 适配
|
||
adaptation: function () {
|
||
// 获取屏幕尺寸
|
||
const screenSize = cc.winSize;
|
||
const screenWidth = screenSize.width;
|
||
const screenHeight = screenSize.height;
|
||
|
||
// 设计分辨率
|
||
const designWidth = 640;
|
||
const designHeight = 960;
|
||
|
||
// 计算屏幕和设计比例
|
||
const screenRatio = screenWidth / screenHeight;
|
||
const designRatio = designWidth / designHeight;
|
||
|
||
// console.log("屏幕尺寸:" + screenWidth + "x" + screenHeight + " 比例:" + screenRatio + " 设计比例:" + designRatio);
|
||
if (screenRatio > designRatio) {
|
||
// 平板设备使用0.7倍缩放
|
||
return 0.7;
|
||
} else {
|
||
// 其他设备使用正常1倍缩放
|
||
return 1;
|
||
}
|
||
},
|
||
setGray(node: cc.Node, gray = true): void {
|
||
const grayMat = cc.Material.getBuiltinMaterial('2d-gray-sprite');
|
||
const normalMat = cc.Material.getBuiltinMaterial('2d-sprite');
|
||
const mat = gray ? grayMat : normalMat;
|
||
|
||
// 处理当前节点的 Sprite 组件
|
||
const sprite = node.getComponent(cc.Sprite);
|
||
if (sprite) {
|
||
sprite.setMaterial(0, mat);
|
||
}
|
||
|
||
// 处理当前节点的 Label 组件
|
||
const label = node.getComponent(cc.Label);
|
||
if (label) {
|
||
label.setMaterial(0, mat);
|
||
}
|
||
|
||
// 递归处理子节点
|
||
node.children.forEach(child => this.setGray(child, gray));
|
||
},
|
||
|
||
requestSubscribe() {
|
||
if (cc.sys.platform === cc.sys.WECHAT_GAME) {
|
||
if (typeof wx === 'undefined') return;
|
||
wx.requestSubscribeMessage({
|
||
tmplIds: ['BIsiZH6pcs4T9FLp0IAZ8d07zS0ELi7vX5RX8P38gN0'],
|
||
success: (res) => {
|
||
if (res['BIsiZH6pcs4T9FLp0IAZ8d07zS0ELi7vX5RX8P38gN0'] === 'accept') {
|
||
cc.log('订阅成功');
|
||
// 可以在这里调用你的服务端接口,记录用户订阅
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
cc.error('订阅失败:', err);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
};
|
||
export { GameTool }; |