204 lines
7.0 KiB
TypeScript
204 lines
7.0 KiB
TypeScript
|
||
import List from "./List";
|
||
const { ccclass, property } = cc._decorator;
|
||
|
||
@ccclass
|
||
export default class NewClass extends cc.Component {
|
||
@property(cc.Node)
|
||
content: cc.Node = null;
|
||
@property(cc.Prefab)
|
||
itemPrefab: cc.Prefab = null;
|
||
private rankList: any;
|
||
private Player: cc.Node;
|
||
private listData: any;
|
||
private selfData: any;
|
||
private rankNumber: number;
|
||
private rankTotal: number;
|
||
private selfNode: cc.Node;
|
||
score: any;
|
||
allInfoList: any[];
|
||
//content: any;
|
||
|
||
|
||
onLoad() {
|
||
if (typeof wx === 'undefined') {
|
||
return;
|
||
}
|
||
|
||
wx.onMessage(data => {
|
||
console.log('子域接收到消息:', data);
|
||
if (data.message) {
|
||
console.log('成功接入开放域');
|
||
//如果收到的消息是分数
|
||
if (typeof (data.message) == 'number') {
|
||
//上传分数
|
||
console.log('收到的分数', data.message);
|
||
this.score = data.message;
|
||
this.compareOldNewScore();
|
||
this.allInfoList = [];
|
||
this.getPlayerInfo();
|
||
}
|
||
//如果收到的是要清空域的消息
|
||
else if (data.message == 'clear') {
|
||
//清空排行榜
|
||
this.content.removeAllChildren();
|
||
} else if (data.message == 'preload') {
|
||
console.log('子域收到预加载消息');
|
||
// 预加载排行榜item
|
||
if (this.itemPrefab) {
|
||
// 这里可以根据需要进行更复杂的预加载,例如加载图片等
|
||
console.log('预加载排行榜itemPrefab成功');
|
||
} else {
|
||
console.error('itemPrefab 未赋值');
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
// 更新:请读者在主域中比较分数,并调用wx.setUserCloudStorage这个API来更新云托管分数(该API可以在主域中使用),否则玩家只有在点击了排行榜按钮后才会将分数存入云托管。
|
||
// 逻辑:将每局分数与存储在本地的最高分进行比较,如果超过历史最高分数则同时更新本地和云托管数据。不需要再将分数传到子域。
|
||
compareOldNewScore() {
|
||
// 将传过来的新分数和之前玩的分数进行比较
|
||
wx.getUserCloudStorage({
|
||
keyList: ['score'],
|
||
success: (res) => {
|
||
if (res.KVDataList.length) {
|
||
let KVData = res.KVDataList[0];
|
||
let storedScore = Number(KVData['value']);
|
||
if (this.score > storedScore) {
|
||
// 如果新分数大于存储分数,则将新分数存入云托管
|
||
let newKVData = { key: 'score', value: String(this.score) }
|
||
this.setNewCloudScore(newKVData);
|
||
}
|
||
}
|
||
else {
|
||
// 如果第一次玩,那么直接将传过来的分数设置到云托管
|
||
let newKVData = { key: 'score', value: String(this.score) }
|
||
this.setNewCloudScore(newKVData);
|
||
}
|
||
},
|
||
|
||
fail: (res) => {
|
||
console.log(res);
|
||
}
|
||
});
|
||
}
|
||
|
||
setNewCloudScore(newKVData) {
|
||
// 设置新云托管分数(第一次游戏时,也调用该方法设置云托管分数)
|
||
wx.setUserCloudStorage({
|
||
KVDataList: [newKVData],
|
||
success: (res) => {
|
||
console.log('更新玩家分数成功!');
|
||
},
|
||
fail: (res) => {
|
||
console.log(res);
|
||
}
|
||
});
|
||
}
|
||
|
||
getPlayerInfo() {
|
||
// 获取当前玩家信息
|
||
// 用于读者Demo测试,实际项目中获取排行榜只需要调用getFriendInfo方法
|
||
wx.getUserInfo({
|
||
openIdList: ['selfOpenId'],
|
||
lang: 'zh_CN',
|
||
success: (res) => {
|
||
let userInfo = res.data[0];
|
||
|
||
// 获取玩家微信名和头像url
|
||
let nickName = userInfo.nickName;
|
||
let avatarUrl = userInfo.avatarUrl;
|
||
|
||
// 生成多个当前玩家的信息(分数不同)
|
||
for (let i = 0; i < 40; i++) {
|
||
// 加入到数组中
|
||
this.allInfoList.push({
|
||
nickName: nickName,
|
||
avatarUrl: avatarUrl,
|
||
score: Math.round(Math.random() * 100)
|
||
});
|
||
}
|
||
|
||
// 开始排名
|
||
this.makeRanks();
|
||
},
|
||
|
||
fail: (res) => {
|
||
console.log(res);
|
||
}
|
||
});
|
||
}
|
||
|
||
getFriendInfo() {
|
||
// 获取同城好友信息(包括自身)
|
||
wx.getFriendCloudStorage({
|
||
keyList: ['score'],
|
||
success: (res) => {
|
||
for (let i = 0; i < res.data.length; i++) {
|
||
// 获取玩家微信名,头像url和分数
|
||
let nickName = res.data[i].nickname;
|
||
let avatarUrl = res.data[i].avatarUrl;
|
||
let score = 0;
|
||
if (res.data[i].KVDataList.length)
|
||
score = res.data[i].KVDataList[0]['value'];
|
||
|
||
// 加入到数组中
|
||
this.allInfoList.push({
|
||
nickName: nickName,
|
||
avatarUrl: avatarUrl,
|
||
score: score
|
||
});
|
||
}
|
||
|
||
// 开始排名
|
||
this.makeRanks();
|
||
},
|
||
|
||
fail: (res) => {
|
||
console.log(res);
|
||
}
|
||
});
|
||
}
|
||
makeRanks() {
|
||
// 首先将allInfoList内部元素进行排序,根据分数来降序排列
|
||
this.allInfoList.sort((a, b) => {
|
||
return b['score'] - a['score'];
|
||
});
|
||
|
||
// 根据各个玩家的分数制作排名
|
||
for (let i = 0; i < this.allInfoList.length; i++) {
|
||
let nickName = this.allInfoList[i]['nickName'];
|
||
let avatarUrl = this.allInfoList[i]['avatarUrl'];
|
||
let score = this.allInfoList[i]['score'];
|
||
this.createItem(i + 1, nickName, avatarUrl, score);
|
||
}
|
||
}
|
||
|
||
createItem(rank, nickName, avatarUrl, score) {
|
||
// 生成item
|
||
let item = cc.instantiate(this.itemPrefab);
|
||
|
||
// 排名
|
||
item.children[0].getComponent(cc.Label).string = String(rank);
|
||
// 微信名
|
||
item.children[4].getComponent(cc.Label).string = nickName;
|
||
// 分数
|
||
item.children[5].getComponent(cc.Label).string = score;
|
||
// 头像
|
||
cc.loader.load({ url: avatarUrl, type: 'png' }, (err, texture) => {
|
||
if (err) console.error(err);
|
||
item.children[1].getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
|
||
});
|
||
|
||
// 添加到content中
|
||
this.content.addChild(item);
|
||
}
|
||
start() {
|
||
|
||
}
|
||
|
||
// update (dt) {}
|
||
}
|