当前位置:   article > 正文

微信好友排行榜 最简教程 二_u3d 微信小游戏 子域 排行榜

u3d 微信小游戏 子域 排行榜

基本操作了解请看

微信好友排行榜 最简教程 一

在准备了知识点之后,下面来把知识点应用到具体的工程中去。

一、建立主工程 FriendsRank

如下图,我简单的建立一个helloword工程,并且修改场景,使得场景中只有一个(rank_sp)  sprite作为子域描绘的地方。

二、建立子域工程

    那么怎么引入子域工程呢?子域工程仅需要一个index.js 的文件即可。我先在主工程的根目录FriendsRank下建文件夹build-templates,再在build-templates下建wechatgame,再在wechatgame下建sub,然后把index.js放到sub目录下,因此获得这一一个路径FriendsRank\build-templates\wechatgame\sub\index.js。

    build-templates 是构建的时候 会拷贝对应类型工程的文件到build下进行构建的,例如为当前是微信小游戏所以目录是wechatgame,还有webgame之类的。

三、主工程使用子域工程

      整理好第二步后点击 “项目构建发布” 如下图,开放数据域代码目录 直接填写“sub” 即可,因为我们子域工程就是sub了。

四、开始编写主域代码 rankview.js

  功能比较简单,主要都在注释里说明。

  有几点比较重要 的就是

        1、 子域canvas 大小需要在主域设置才有效。

         2、关于updat刷新 画布,不需要随时刷。

        3、主域是可以调用wx.setUserCloudStorage接口设置玩家数据的。

  1. //因为子域跟主域代码不能互相引用,因此定义一个表,分别复制到两边当成一个来使用。
  2. let Consts = {
  3. OpenDataKeys: {
  4. LevelKey: "reachlevel",
  5. },
  6. DomainAction: {
  7. ShowFriendLevel: "ShowFriendLevel", //展示好友排行榜
  8. },
  9. }
  10. cc.Class({
  11. extends: cc.Component,
  12. properties: {
  13. mRankSprite: cc.Sprite, //这个是绑定rank_sp 的sprite,待会就在他身上把排行榜画上去。
  14. },
  15. onLoad () {
  16. this.mTxt = new cc.Texture2D();
  17. //获取子域画布
  18. var openDataContext = wx.getOpenDataContext();
  19. this.mOpenCanvas = openDataContext.canvas;
  20. //标记,用来判断什么时候 能刷新this.mRankSprite.spriteFrame,一般来说排行榜不滑动的情况下刷一下就行
  21. this.mNeedUpdataCanvas = false
  22. },
  23. start () {
  24. },
  25. update (dt) {
  26. if (this.mNeedUpdataCanvas == true ){
  27. //刷新this.mRankSprite.spriteFrame 和子域canvas
  28. this.mTxt.initWithElement(this.mOpenCanvas);
  29. this.mTxt.handleLoadedTexture();
  30. this.mRankSprite.spriteFrame = new cc.SpriteFrame(this.mTxt);
  31. }
  32. },
  33. //展示好友排行榜
  34. showFriendsRank(){
  35. if (this.mOpenCanvas) {
  36. //先主动刷新一下widget大小,获得才是mRankSprite的真实大小,我这里对mRankSprite使用了widget ui组件适配屏幕变化的,如果你是固定大小则不需要刷新widget。
  37. let widget = this.mRankSprite.getComponent(cc.Widget)
  38. widget.updateAlignment();
  39. //子域画布大小只能在 主域 这边 设置,我建议是先设置为mRankSprite的大小
  40. this.mOpenCanvas.width = this.mRankSprite.node.width;
  41. this.mOpenCanvas.height = this.mRankSprite.node.height;
  42. //发送消息给子域通知他展示排行榜
  43. wx.postMessage({ action: Consts.DomainAction.ShowFriendLevel, message: 'showFriendLevelRank' });
  44. this.mNeedUpdataCanvas = true;
  45. }
  46. },
  47. //点击 按钮展示排行榜
  48. onBtnFriendsRank(){
  49. this.showFriendsRank();
  50. },
  51. //点击按钮 模拟给我存10分
  52. onBtnSaveMyLv(){
  53. wx.setUserCloudStorage({
  54. KVDataList:[{key:Consts.OpenDataKeys.LevelKey, value: "10" }],
  55. success: res => {
  56. console.log("wx.setUserCloudStorage success", res);
  57. },
  58. fail: res => {
  59. console.log("wx.setUserCloudStorage fail", res);
  60. },
  61. })
  62. },
  63. });

五、编写子域代码 index.js

子域 代码编写主要请求回来的数据结构,不熟悉接口的多看文档。其他没什么注意的了。

  1. //因为子域跟主域代码不能互相引用,因此定义一个表,分别复制到两边当成一个来使用。
  2. let Consts = {
  3. OpenDataKeys: {
  4. LevelKey: "reachlevel",
  5. },
  6. DomainAction: {
  7. ShowFriendLevel: "ShowFriendLevel", //展示好友排行榜
  8. },
  9. }
  10. const RANK_SHOW_SIZE = 10; //展示多少条数据
  11. const DEFAULT_LEVEL = 1;
  12. class myRank{
  13. constructor( ) {
  14. this.init();
  15. }
  16. init(argument) {
  17. this.canvas = wx.getSharedCanvas();
  18. this.ctx = this.canvas.getContext('2d');
  19. this.mDataType = null;
  20. //数据结构
  21. // [
  22. // {"nickname":"name" , "openid":"openid" , "avatarUrl":"avatarUrl", "KVDataList":[ { "key":"key" ,"value":"value" } ] }
  23. // ]
  24. this.mBaseData = [ ];
  25. }
  26. //对数据进行排序处理
  27. dealData(data) {
  28. if (data != null) {
  29. for (var i = data.length - 1; i >= 0; i--) {
  30. if(data[i].KVDataList && data[i].KVDataList[0] && data[i].KVDataList[0].value){
  31. data[i].score = parseInt(data[i].KVDataList[0].value);
  32. }else{
  33. data[i].score = DEFAULT_LEVEL;
  34. }
  35. };
  36. let neweData = data.sort((a,b)=>{
  37. if (a && a.score && b && b.score ) {
  38. return a.score < b.score;
  39. };
  40. return false;
  41. });
  42. return neweData;
  43. };
  44. }
  45. //开始描绘列表数据
  46. startDrawContent(){
  47. for (var i = 0 ; i < this.mBaseData.length ; i++) {
  48. this.drawUnin(this.mBaseData[i] , i,100,50);
  49. };
  50. }
  51. //获取好友的关卡进度
  52. getFriendLevelList( ) {
  53. wx.getFriendCloudStorage({
  54. keyList: [
  55. Consts.OpenDataKeys.LevelKey,
  56. ],
  57. success: res => {
  58. this.mBaseData = this.dealData(res.data);
  59. if ( this.mBaseData ) {
  60. this.mDataType = Consts.OpenDataKeys.LevelKey;
  61. this.startDrawContent();
  62. }else{
  63. this.mDataType = null;
  64. };
  65. },
  66. fail: res => {
  67. console.log("wx.getFriendCloudStorage fail", res);
  68. },
  69. });
  70. }
  71. //描绘一个item ,item 包括 名次、头像、昵称、关卡数
  72. drawUnin(data,index,width,height) {
  73. var self = this
  74. var lineHeight = 100
  75. var HeadHeight = 80
  76. var name = data.nickname;
  77. var score = data.score;
  78. var avatarUrl = data.avatarUrl;
  79. var y = (index)*lineHeight;
  80. var x = 20;
  81. //使得相邻的两行背景颜色不一样
  82. if (index%2==0) {
  83. this.ctx.fillStyle = "#eae5e3";
  84. }else{
  85. this.ctx.fillStyle = "#887f7a";
  86. };
  87. //描绘背景
  88. this.ctx.fillRect(0 , y , 600 , lineHeight );
  89. this.ctx.textAlign = "center";
  90. this.ctx.baseLine = "center";
  91. //改变一二三名 名次字体颜色不一样
  92. var indexFntSize = 30
  93. if (index<=2) {
  94. this.ctx.fillStyle = "#e0815e";
  95. this.ctx.font = "60px Helvetica";
  96. indexFntSize = 60
  97. }else{
  98. this.ctx.fillStyle = "#274a78";
  99. this.ctx.font = "40px Helvetica";
  100. };
  101. //描绘名次
  102. this.ctx.fillText(index+1, x+20, y+ indexFntSize/2+lineHeight/2 );
  103. //描绘头像
  104. var imgx = x + 60 + 20
  105. const avatarImg = wx.createImage();
  106. avatarImg.src = avatarUrl;
  107. avatarImg.onload = () => {
  108. self.ctx.drawImage(avatarImg, imgx , y+lineHeight/2-HeadHeight/2 , HeadHeight, HeadHeight);
  109. };
  110. x = imgx + HeadHeight + 100
  111. this.ctx.fillStyle ="#165e83";
  112. this.ctx.textAlign = "center";
  113. this.ctx.baseLine = "center";
  114. this.ctx.font = "30px Helvetica";
  115. //描绘昵称
  116. this.ctx.fillText(name, x, y+lineHeight/2 + 15 );
  117. x = x + 40+ 100
  118. this.ctx.fillStyle ="#ee836f";
  119. this.ctx.font = "50px Helvetica";
  120. //描绘关卡分数
  121. this.ctx.fillText(score, x, y +lineHeight/2 +15 );
  122. }
  123. //监听主域发过来的消息
  124. listenMainMsg(){
  125. wx.onMessage(msg => {
  126. switch(msg.action)
  127. {
  128. case Consts.DomainAction.ShowFriendLevel:
  129. this.getFriendLevelList( );
  130. break;
  131. default:
  132. console.log(`未知消息类型:msg.action=${msg.action}`);
  133. break;
  134. }
  135. });
  136. }
  137. }
  138. const rankList = new myRank();
  139. //直接进行监听主域发过来的消息,做出相应的动作
  140. rankList.listenMainMsg();

至此简简单单的排行榜功能 就有了。如果你想排行榜好看就在主域添加层修饰 rank_sp ,子域画到上面,超出去部分是会被剪裁掉的,因此可以监听rank_sp的触摸 ,实现排行榜的滑动效果。这个留到下一次再说。

欢迎线上体验

欢迎一起讨论学习。

Demo下载页面 Demo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/369426
推荐阅读
相关标签
  

闽ICP备14008679号