要制作排行榜,我们需要使用一个数组totalGroup来存储玩伴的数据。totalGroup中玩伴数据的格式如下:
1 const totalGroup=[2 {3 key: 1,//用户排名4姓名:'小明'//用户昵称5 url: avatarUrl,//用户头像地址6 img:image,//用户头像,生成图片7 scroes: 95//用户评分8},9 10 { 11k key:2,12姓名:'小华'13url:头像URL,14img: image,15Scroes: 9016},17//.18]游戏结束后,玩家的分数会上传到用户的主机数据中,totalGroup会根据用户玩友的主机数据进行更新,排行榜会根据totalGroup中的数据进行渲染。
游戏各阶段实现的功能总结如下:
1.当游戏初始化时
更新totalGroup根据玩友的数据;
2.当游戏结束时
将玩家分数上传到用户管理的数据。
3.当玩家打开排行榜时
根据玩友数据更新totalGroup,然后根据totalGroup渲染排行榜;
本文不详细解释排行榜的渲染,主要分析以下两个问题:
1.将玩家分数上传到用户托管数据。
2.根据和你一起玩的朋友的数据更新totalGroup。
1.将玩家分数上传到托管数据的用户
由于游戏逻辑是在主域中编写的,所以需要在主域中将比分等数据转移到开放数据域中(主域和开放数据域的概念请参考官方文档,此处不赘述)。这些界面如下所示:
1 //在主域中写2函数集score(score){ 3 var opendata context=newwxGameOpenDataContext();4 5 var info={ 6 command:'setScore '7 score:score,8 timeStamp:new Date()。getTime()9 };10 11 opendata context . postmessage(info);12}这里的时间戳属性是打分的时间时间戳,为了实现只给本周一起玩的朋友排名的功能。然后接收并处理根数据字段中的信息:
1 //在根数据字段中写入2wx . on message((data)={ 3if(data . command==' setscore '){ 4 setscore(data));//Process score 5 } else if(data.com mand==' Preload '){ 6//预加载资源并更新totalGroup根据游戏初始化时一起玩的朋友的数据,计算出游戏的游戏时间;7 } else if(data.com mand==' open '){ 8//更新totalGroup,根据一起玩的朋友的数据渲染排行榜;9 }10 });在setStore中,首先判断该分数是否是本周的最高分,如果是,则将该分数上传到用户管理的数据中:
1//Write 2 function setscore(data){ 3 var score=data . score;4 var timestamp=data.timeStamp5/* 7判断totalGroup中是否有当前用户。如果没有当前用户,更新分数。如果有,判断分数是否大于分数。如果是,退出,否则更新分数。8 */9 for(var I=0;i=分数){14返回;15 }16 }17 18 //更新用户托管数据19返回新的承诺((resolve,reject)={ 20w x . setusercloudstorage({ 21kv datalist:[{ 22 key:' score '23 value: JSON.stringify(score),24 },{25 key: 'timestamp '26 value:JSON . stringify(timestamp),27 },],28 29 success:function(RES){ 30 resolve();1},32}) 33}) 34}获取userData,游戏初始化时执行。
1 //写入2wx . get userinfo({ 3 open id list:[' self OpenID '],4Lang:' '5 success:function(RES){ 6 user data=RES . data;7 },8})第二,根据一起玩的朋友的数据更新totalGroup。
totalGroup为了实现只对本周选手的成绩进行排名的功能,只存储本周选手的数据;
一函数updateTotalGroup (){ 2 3 //按分数大小进行排序的排序函数四函数比较(obj1,obj 2){ 5 var score 1=parse int(obj 1。scroes);6 var score 2=parse int(obj 2。scroes);7 if(得分1得分2){ 8 return-1;9 } else { 10 return 1;11 } 12 } 13 14宽。getfriendcloudstorage({ 15 key list:[' score '' timestamp'],16 success: function (res) {17 //先清空total group 18总组。拼接(0,总组。长度);19 var数据=res.data20 21 for(设I=0;我数据长度;I){ 22 if(data[I]。kvdatalist。长度2){ 23继续;24 }25 //获取得分的时间戳并判断是否是本周,如果是则将数据存入总组26变量时间戳=数据[I].KVDataList[1].价值;27 if(isCurrentWeek(timestamp)){ 28 var obj={ 29 key:I,30 openid:data[i].openid,31 name: data[i].昵称,32 url: data[i].avatarUrl,33 img: null,34 scroes: data[i].KVDataList[0]。值35 } 36总组。push(obj);37 }38 }39 //排序及设置头像40 totalGroup.sort(比较);41为(设I=0;I total group . length I){ 42 const img=wx。创建图像();43 img.src=totalGroup[i].网址;44 totalGroup[i].img=img45 totalGroup[i].key=I 1;46 } 47 //渲染排行榜48 renderRank(totalGroup)//实现过程省略49 50 })51 }通过时间戳判断分数是否是本周更新:
一函数isCurrentWeek(timestamp){ 2 if(timestamp==undefined){ 3返回false4 } 5 var date=新日期(),6 day=日期。getday()==0 7:Date。getdate(),7小时=date.getHours(),8分钟=date.getMinutes(),9秒=date.getSeconds(),10 timefromSunday=(day*24*3600小时*3600分钟*60秒)*1000,//星期日凌晨0点到此时的毫秒数11时间=日期。gettime()-从周日开始的时间;//1970年一月一人至上周日凌晨的毫秒数;12 13返回parseInt(时间戳)时间//若时间戳大于周日,则时间戳标志的事件发生在本周;14 }三、显示排行榜
在开方数据中渲染完排行榜后,在主域中可通过下面接口获取在开方数据域中创建的画布;
const opendata context=wx。getopendata上下文();const sharedCanvas=opendata上下文。画布;