CocosCreator项目实战(13):功能-排行榜

2023-05-16

文章目录

  • 一、主域设置
  • 二、子域设置
  • 三、其他相关设置


  1. 参考Cocos接入微信小游戏官方文档,为了保护其社交关系链数据,微信小游戏增加了开放数据域的概念。只有在开放数据域中才能访问微信提供的wx.getFriendCloudStorage()wx.getGroupCloudStorage()两个 API来实现排行榜功能。
  2. 查看微信开放接口API的官方文档,了解相关用法。
  3. 参考《Cocos Creator游戏实战》实现微信小游戏排行榜 进行排行榜功能开发。

一、主域设置

  1. box节点下创建rankBox节点,包含rankBgtitleBoxmainBoxbuttonBox。并设置其不可见。
    rankBg:颜色为#FFFFFF78半透明白色,考虑到屏幕适配的情况,添加Widget组件,分别为-30% -27% -35% -35%
    titleBox:包含titleBgtitleLabel,即排行榜文字标签;
    mainBox:包含mainBgopenData,openData为开放数据域;
    buttonBox:包含returnButtonshareButton

在这里插入图片描述

  1. openData节点下添加其他组件 -> WXSubContextView组件

在这里插入图片描述

  1. game.js进行相关函数的增加。首先在属性中添加rankBoxrankButton。并与Canvas节点绑定。
    properties: {
		...
        rankBox: cc.Node,
        rankButton: cc.Button,
    },
  1. onLoad()方法中,添加对rankButton的click响应事件,调用showRanks方法。并添加initUserInfoButton()方法。
    onLoad() {
    	...
        this.initUserInfoButton();
        this.rankButton.node.on('click', this.showRanks, this);
    },
  1. showRanks()方法,将rankBox显示可见,并调用wx.getOpenDataContext().postMessage()方法发送score(这里先取了100以内随机数),与子域进行通信生成排行榜内容。
    showRanks() {
        if (typeof wx === 'undefined') {
            return;
        }
        this.rankBox.active = true;
        let score = Math.round(Math.random() * 100);
        wx.getOpenDataContext().postMessage({
            message: score
        });
    },
  1. initUserInfoButton()方法为官方文档中微信小游戏用户授权相关。
    initUserInfoButton() {
        if (typeof wx === 'undefined') {
            return;
        }

        let systemInfo = wx.getSystemInfoSync();
        let width = systemInfo.windowWidth;
        let height = systemInfo.windowHeight;
        let button = wx.createUserInfoButton({
            type: 'text',
            text: '',
            style: {
                left: 0,
                top: 0,
                width: width,
                height: height,
                lineHeight: 40,
                backgroundColor: '#00000000',
                color: '#00000000',
                textAlign: 'center',
                fontSize: 10,
                borderRadius: 4
            }
        });

        button.onTap((res) => {
            if (res.userInfo) {
                console.log('authorized success!');
            }
            else {
                console.log('authorized fail!');
            }
            button.hide();
            button.destroy();
        });
    },
  1. 构建发布,需要在开放数据域代码目录中输入子域项目名称,笔者设置为openData,点击构建。

在这里插入图片描述


二、子域设置

  1. 新建一个openData项目,将Canvas的宽高设置为主域openData节点的宽高。
  2. 在资源管理器中assets下新建prefabsscenesscripts文件夹,在scenes下新建openData场景
  3. 并在Canvas节点下新建UI节点 -> ScrollView节点命名为rankScrollView,添加Widget组件与父节点对齐,设置Color属性为#CDC1B4。(Canvas下新建bg节点是为了防止适配屏幕时出现黑边,但预览时发现不需要)。
  4. 删除scrollBar节点,并对view节点添加Widget组件与父节点对齐。
  5. content节点添加Widget组件与父节点对齐,添加Layout组件设置Type为VERTICAL、ResizeMode为CONTAINER
  6. item节点添加Widget组件与父节点对齐,设置高度为150,并在item节点下添加bgrankavatarnamescoreline
    bg:item的背景颜色,Color属性为#FAF8EF
    rank:item中显示的用户排名;
    avatar:item中显示的用户头像;
    name:item中显示的用户昵称;
    score:item中显示的用户最高分;
    line:高度3Sprite(单色)节点,呈线状,用于分隔每个item。
  7. 将设置好的item拖到prefabs文件夹下作为预制资源,对层级管理器中item节点取消可见。

在这里插入图片描述

  1. scrpit目录下创建openData.js,与Canvas节点绑定。添加属性itemPrefabcontent,与Canvas节点绑定。
    properties: {
        itemPrefab: cc.Prefab,
        content: cc.Node,
    },
  1. onLoad()中调用wx.onMessage()方法,如果从主域中传入的message不是clear字串,则与云托管上的分数比较,初始化排行榜列表rankList,传入玩家数据,getPlayerInfo()用于测试;getFriendInfo()方法用于获取好友的数据,设置了0.25s的时延,因为在实际预览过程中出现compareScore()方法没结束就调用getFriendInfo()出错的情况。
    onLoad() {
        if (typeof wx === 'undefined') {
            return;
        }

        wx.onMessage(data => {
            if (data.message != undefined) {
                if (data.message != 'clear') {
                    this.score = data.message;
                    this.compareScore();
                    this.rankList= [];
                    this.getPlayerInfo();
                    // this.scheduleOnce(function () { this.getFriendInfo() }, 0.25);
                }
                else {
                    this.content.removeAllChildren();
                }
            }
        });
    },
  1. compareOldScore()方法调用wx.getUserCloudStorage()方法。首先判断有没有云托管分数,如果没有则直接创建一个newKVData变量,并调用setNewCloudScore()方法将传过来的分数设置到云托管;如果有云托管分数,则比较新分数和云托管分数,若新分数大则将新分数存入云托管。
    compareScore() {
        wx.getUserCloudStorage({
            keyList: ['score'],
            success: (res) => {
                if (res.KVDataList.length > 0) {
                    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);
            }
        });
    },
  1. setNewCloudScore(newKVData)调用wx.setUserCloudStorage()方法上传云托管分数。
    setNewCloudScore(newKVData) {
        wx.setUserCloudStorage({
            KVDataList: [newKVData],
            success: (res) => {
                console.log('update score success!');
            },
            fail: (res) => {
                console.log(res);
            }
        });
    },
  1. getPlayerInfo()调用wx.getUserInfo()方法用于测试,用自己的信息模拟50名不同分数的玩家。
    getPlayerInfo() {
        wx.getUserInfo({
            openIdList: ['selfOpenId'],
            lang: 'zh_CN',
            success: (res) => {
                let userInfo = res.data[0];
                for (let i = 0; i < 50; i++) {
                    this.rankList.push({
                        nickName: userInfo.nickName,
                        avatarUrl: userInfo.avatarUrl,
                        score: Math.round(Math.random() * 100)
                    });
                }
                this.makeRanks();
            },
            fail: (res) => {
                console.log(res);
            }
        });
    },
  1. getFriendInfo()调用wx.getFriendCloudStorage()方法,往rankList中传入数据。
    getFriendInfo() {
        wx.getFriendCloudStorage({
            keyList: ['score'],
            success: (res) => {
                for (let i = 0; i < res.data.length; i++) {
                    this.rankList.push({
                        nickName: res.data[i].nickname,
                        avatarUrl: res.data[i].avatarUrl,
                        score: res.data[i].KVDataList[0]['value'],
                    });
                }
                this.makeRanks();
            },
            fail: (res) => {
                console.log(res);
            }
        });
    },
  1. makeRanks()方法用于在rankList进行正确排序,排序完调用createItem()方法生成item。
    makeRanks() {
        this.rankList.sort((a, b) => {
            return b['score'] - a['score'];
        });
        for (let i = 0; i < this.rankList.length; i++) {
            let nickName = this.rankList[i]['nickName'];
            let avatarUrl = this.rankList[i]['avatarUrl'];
            let score = this.rankList[i]['score'];
            this.createItem(i + 1, nickName, avatarUrl, score);
        }
    },
  1. createItem()方法用于生成item实体包括rankavatarUrlnickNamescore
    createItem(rank, nickName, avatarUrl, score) {
        let item = cc.instantiate(this.itemPrefab);
        item.children[1].getComponent(cc.Label).string = rank <= 9 ? ' ' + rank : rank;
        cc.loader.load({ url: avatarUrl, type: 'png' }, (err, texture) => {
            if (err) console.error(err);
            item.children[2].getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
        });
        item.children[3].getComponent(cc.Label).string = '昵称:' + nickName;
        item.children[4].getComponent(cc.Label).string = '最高分:' + score;
        this.content.addChild(item);
    },
  1. 构建发布,可设置发布路径为主目录./build/wechatgame目录下,点击构建。

在这里插入图片描述

  1. 微信开发者工具中预览,可以看到,点击排行榜按钮,进行微信授权,之后正常显示排行榜。(但此时没有取消监听,可以看到控制台打印了move up语句)。

在这里插入图片描述


三、其他相关设置

  1. 监听设置。在showRanks()添加对removeEventHandler()的调用,并禁用重新开始按钮排行榜按钮
    showRanks() {
        this.removeEventHandler();
        this.restartButton.onDisable();
        this.rankButton.onDisable();
		...
    },
  1. 返回按钮。在属性中添加returnButtonCanvas绑定。在onLoad()监听按钮点击触发returnGame()。returnGame()添加屏幕滑动监听,启用重新开始按钮排行榜按钮,并将rankBox显示不可见,并再次与子域通信发送clear字串,请求删除之前生成的排行榜信息(如果不删除,下次打开排行榜时会有重复内容出现)。
    properties: {
		...
        returnButton: cc.Button,
    },
    onLoad() {
		...
        this.returnButton.node.on('click', this.returnGame, this);
    },
    ...
    returnGame() {
        this.addEventHandler();
        this.restartButton.onEnable();
        this.rankButton.onEnable();
		this.rankBox.active = false;
        if (typeof wx === 'undefined') {
            return;
        }
        wx.getOpenDataContext().postMessage({
            message: 'clear'
        });
    },
  1. 历史最高分更新updateBest(number)方法。可参考updateScore()方法,同时在init()时读取本地最高分,在游戏过程中只有当score > best时才更新最高分。
    init() {
    	...
        this.updateBest(cc.sys.localStorage.getItem('best'));
		...
    },
    afterMove(hasMoved) {
        if (hasMoved) {
            this.updateScore(this.score);
            this.updateBest(this.score);
			...
        }
		...
    },
    ...
    updateBest(number) {
        this.best = cc.sys.localStorage.getItem('best');
        if (!this.best || number >= this.best) {
            cc.sys.localStorage.setItem('best', number);
            this.best = number;
            this.bestLabel.string = number;
        }
    },
  1. 微信开发者工具中预览,设置SUCCESS为32,可以看到:
    1)第一阶段:分数、历史最佳、排行榜上显示的最高分均为0;
    2)第二阶段:第一次游戏成功,分数、历史最佳、排行榜上显示的最高分均为120,排行榜成功更新;
    3)第三阶段:点击再玩一次按钮后,分数清零,历史最佳仍为120;
    4)第四阶段:第二次游戏过程中,分数变化,历史最佳在分数大于120之后变化,排行榜上成功更新为220。

在这里插入图片描述


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CocosCreator项目实战(13):功能-排行榜 的相关文章

  • 软件测试电商项目实战(写进简历没问题)

    前言 说实话 在找项目的过程中 我下载过 甚至付费下载过 N多个项目 联系过很多项目的作者 但是绝大部分项目 在我看来 并不适合你拿来练习 它们或多或少都存在着 问题 比如 1 大部分项目是web项目 很难找到app项目 特别是有app安装
  • cocosCreator 物理关节组件

    cocosCreator 物理关节组件 重点 距离关节 旋转关节 绳子关节 轮子关节 焊接关节 棱柱关节 马达关节 重点 开启物理系统 物理系统默认是关闭的 如果需要使用物理系统 那么首先需要做的事情就是开启物理系统 否则你在编辑器里做的所
  • CocosCreator Java传参数到JS

    最近正在接GooglePlay内购 在传参数回CocosCreator的环境的时候 没有调用到JS的方法 其中错误的写法是 app runOnGLThread new Runnable Override public void run Co
  • Python项目实战 —— 05. 小红书达人大盘分析

    Python项目实战 Python项目实战 目录 Python项目实战 05 小红书达人大盘分析 一 背景 二 可视化 三 代码 Python项目实战 目录 Python项目实战 05 小红书达人大盘分析 大家可以关注知乎或微信公众号的sh
  • 数据挖掘案例实战:利用LDA主题模型提取京东评论数据(一)

    泰迪智能科技 数据挖掘平台 TipDM数据挖掘平台 最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合 可以让大家获得真实的数据挖掘学习与实践环境 更快 更好的学习数据挖掘知识与积累职业经验 专栏中每四篇文章为一个完整的数据
  • Spring Boot 实现用户行为记录的四种方式

    目录 一 需求背景 二 需要的pom依赖 三 AOP切面编程实现 四 Interceptor拦截器实现 五 Filter过滤器实现 六 ArgumentResolver 七 拓展部分 八 参考文献 一 需求背景 根据产品经理要求 需要对用户
  • 后台权限管理系统(2)——系统基础数据的展示

    目录 1 页面效果展示 2 具体实现 2 1 订单管理模块 2 1 1 订单展示页面 2 1 2 订单详情页面 1 页面效果展示 实现效果如下 订单管理页面 产品管理页面 2 具体实现 2 1 订单管理模块 2 1 1 订单展示页面 点击订
  • CocosCreator3.8研究笔记(一)windows环境安装配置

    一 安装Cocos 编辑器 1 下载Cocos Dashboard安装文件 Cocos 官方网站Cocos Dashboard下载地址 https www cocos com creator download9 下载完成后会得到CocosD
  • 基于Yolov5的交通标志检测识别设计

    项目介绍 上一篇文章介绍了基于卷积神经网络的交通标志分类识别Python交通标志识别基于卷积神经网络的保姆级教程 Tensorflow 并且最后实现了一个pyqt5的GUI界面 并且还制作了一个简单的Falsk前端网页实现了前后端的一个简单
  • Cocos Creator资源管理AssetManager细说一二

    关于AssetManager Asset Manager 是 Creator 在 v2 4 新推出的资源管理器 用于替代之前的 cc loader 新的 Asset Manager 资源管理模块具备加载资源 查找资源 销毁资源 缓存资源 A
  • javascript全局异常监听

    不管我们用javascript做什么开发 总会出现项目运行异常 甚至crash 这个时候 我们希望不只是javascript会打印一行日志 而是可以出现一个弹窗或者其他的一些让我们开发者更能直接获取到的信息 对于这个需求 javascrip
  • 【项目实战】---需求分析+表关系分析

    SSH 小编初次接触的时候傻傻的以为这个跟SHE有什么关系呢 又是哪路明星歌手 后来才知道小编又土鳖了 原来SSH是这个样子滴 百度百科对她这样阐述 SSH即 Spring Struts Hibernate Struts对Model Vie
  • 基于Vision Transformer的鸟类图像分类(200个类别)完整代码+数据

    视频讲解 Vision Transformer的鸟类图像分类 200个类别 完整代码 数据 哔哩哔哩 bilibili 项目结构 数据展示 主要的运行代码 import os import math import random import
  • MQTT在Android端的使用详解以及MQTT服务器搭建、Paho客户端使用

    前言 最近的项目中使用了MQTT来接收后端推送过来的一些数据 这篇文章来介绍下Android端如何集成使用 关于MQTT相关介绍将不再阐述 由于光写代码不实践的接收下数据很难验证我们写的是否正确 所以我将简单介绍下如何配置个MQTT服务端
  • [华为云云服务器评测] 华为云耀云服务器 Java、node环境配置

    系列文章目录 第一章 linux实战 华为云耀云服务器L实例 Java node环境配置 文章目录 系列文章目录 前言 一 任务拆解 二 修改密码 三 配置安全规则 四 远程登录并更新apt 五 安装 配置JDK环境 5 1 安装openj
  • 优化(2)——射线检测基础,合批原理

    射线检测 射线响应的方法 首先获取到canvas下所有graphic组件 当前的ui元素是否接收射线 第一个if判断是否绘制到屏幕上 是否勾选RaycastTarget接受射线 是否进行了剔除 第二个if判断点击是否在当前对象上 第三个判断
  • 数据挖掘案例实战:利用LDA主题模型提取京东评论数据(二)

    泰迪智能科技 数据挖掘平台 TipDM数据挖掘平台 最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合 可以让大家获得真实的数据挖掘学习与实践环境 更快 更好的学习数据挖掘知识与积累职业经验 专栏中每四篇文章为一个完整的数据
  • Maven 项目模板学习

    目录 Maven 项目模板 什么是 archetype 使用项目模板 Maven 将询问原型的版本 创建的项目 创建 pom xml Maven 项目文档 Maven 快照 SNAPSHOT 什么是快照 项目快照 vs 版本 app ui
  • cocos creator主程入门教程(九)—— 瓦片地图

    这一篇介绍瓦片地图 在开发模拟经营类游戏 SLG类游戏 RPG游戏 都会使用到瓦片地图 瓦片地图地面是通过一个个地砖拼起来的 又分为45度角和90度角两种 45度角俗称2 5D 每个格子都是菱形 而90度角每个格子都是正方形 瓦片地图一般包
  • CocosCreator波浪Shader

    waveEffect effect Copyright c 2017 2020 Xiamen Yaji Software Co Ltd CCEffect techniques passes vert sprite vs vert frag

随机推荐

  • Android Studio 配置 JDK1.8 使用Lambda表达式

    Android Studio 配置 JDK1 8 使用Lambda表达式 JDK1 8 添加几项新特性譬如对集合的优化语法的便捷配合Lambda表达式使用可以让代码更加简便美观 xff0c 但对于一些没有接触Lambda表达式的同学们来说就
  • 深入解读四轴飞行器的硬件设计

    xfeff xfeff 转载自 xff1a http www openedv com posts list 20892 htm 传感器之一 xff1a 角速度传感器应用科里奥利力原理 xff1a 科里奥利力来自于物体运动所具有的惯性 xff
  • 【GIT】使用Vscode同步git仓库,错误和解决方法记录

    这里写目录标题 命令行操作仓库常见命令1 报错 在签出前 xff0c 请清理存储库工作树 2 报错 fatal unable to access 39 https github com 39 OpenSSL SSL read Connect
  • 基于k近邻(KNN)的手写数字识别

    作者 xff1a faaronzheng 转载请注明出处 xff01 最近再看Machine Learning in Action k近邻算法这一章节提供了不少例子 xff0c 本着Talk is cheap的原则 xff0c 我们用手写数
  • 机器学习算法地图(转自SIGAI)

    转自 xff1a http sigai cn paper 18 html 下面先看这张图 xff1a 图的左半部分列出了常用的机器学习算法与它们之间的演化关系 xff0c 分为有监督学习 xff0c 无监督学习 xff0c 强化学习 3 大
  • 一个非常适合单片机的滤波算法

    连接 xff1a http bbs 21ic com icview 170880 1 1 html 以下为原文 连接 xff1a http bbs 21ic com icview 170880 1 1 html 单片机大多资源小 xff0c
  • 6.蒙特卡洛方法(TSP)

    定义 xff1a 旅行商问题 xff0c 即TSP问题 xff08 Traveling Salesman Problem xff09 又译为旅行推销员问题 货郎担问题 xff0c 是数学领域中著名问题之一 假设有一个旅行商人要拜访n个城市
  • 云和AI时代下,需要怎样的存储?

    数字化浪潮席卷而来 xff0c 颠覆着传统的生产和生活方式 xff0c 随之产生的新经济和新应用给传统业务模式和产业结构带来前所未有的冲击 特别是云计算 人工智能 AI 和物联网 IoT 的兴起 xff0c 加快了传统产业升级改造的步伐 在
  • 人工智能6个核心技术

    机械学习 机械学习是多领域交叉的学科 xff0c 可以从学习模式和学习方法上面进行分类 xff0c 学习模式将机器学习分类为监督学习 无监督学习和强化学习等 xff0c 学习方法可以将机器学习分为传统机器学习和深度学习 机器学习按学习方式分
  • CAN总线的标准(二)

    一 OSI参考模型 CAN总线标准规定了物理层和数据链路层 xff0c 至于应用层需要用户自定义 不同的CAN标准仅物理层不同 物理层和数据链路层ISO11898 xff1b 应用层 xff1a 不同的应用领域使用不同的应用层标准 二 各层
  • 数据通信--ASCII码通信&16进制通信的区别

    16进制通信一般用于网络传输等的通信上 xff0c 传输效率高 数据量大是二进制通信 ASCII码通信一般用与串口通信等通信上 xff0c 数据量小 易于处理 便于调试 xff0c 它虽然是文本模式 xff0c 但本质仍然是二进制通信 在使
  • ubuntu下安装boost

    boost中 xff0c 用到了别的函数库 xff0c 所以为了使用boost中相应的功能 xff0c 需要先安装系统中可能缺失的库 第一步 安装依赖库 sudo apt get install mpi default dev 安装mpi库
  • 数据结构实验快速排序、冒泡排序算法(交换排序),使用STM32单片机测试(学计算机综合考试408悟单片机系列)

    快速排序和冒泡排序均属于交换排序范畴 xff0c 意味着其基本操作是交换两数 快速排序 xff0c 顾名思义快速的排序 xff0c 毫无遮拦得介绍了自己得特征 而冒泡排序也正如其名称 xff0c 如同养鱼冒泡一样慢条斯理锝排序 xff08
  • 操作系统-13-程序员应如何理解中断

    在这一节中我们聊一聊 xff0c 操作系统管理外设的中断机制 为什么要在这一节聊一聊操作系统如何管理外设呢 xff0c 外设管理是操作系统的核心任务之一 xff0c 理解操作系统的外设管理机制对于我们理解操作系统工作原理至关重要 通过第二章
  • Gitee实现本地代码上传他人的远程仓库

    前言 xff1a 需要下载git bash xff0c 并拥有自己的Gitee账号哦 关于git下载可以看这个博客 xff08 CSDN有很多 xff09 xff1a git git bash 下载与安装 娄笙悦的博客 CSDN博客 Git
  • 关于用elsevier-cas模板的一些问题

    关于用elsevier cas模板的一些问题 关于graphical abstract和highlight 这俩东西可能跟具体的期刊有关 xff0c 在我要投的这个期刊里边 xff0c 这俩是不需要的 xff0c 可以直接从模板中删除 关于
  • 几种供电总线技术

    PowerBus技术 PowerBus为可供电总线技术 xff0c 是业内唯一可以支持大功率负载供电和高速通讯的总线技术 xff0c 相比其他可供电总线技术 xff1a PowerBus供电效率高 xff0c 通过两根电源线最大可提供单个设
  • 使用dd复制将乌班图系统(Ubuntu22.04)完整迁移到新硬盘并扩容

    我的折磨历程 开始的时候用乌班图的时候 xff0c 不懂事 xff0c 根目录太小了 xff0c 后来就满了 xff0c 就就感觉完全没法用 xff0c 看着现在硬盘贼便宜 xff0c 去狗东买了个新的硬盘 感觉挂载硬盘并不能解决我的问题
  • 《剑指offer》面试题 12:矩阵中的路径(C++实现)

    题目 请设计一个函数 xff0c 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中任意一格开始 xff0c 每一步可以在矩阵中向左 右 上 下移动一格 如果一条路径经过了矩阵的某一格 xff0c 那么该路径不能再
  • CocosCreator项目实战(13):功能-排行榜

    文章目录 一 主域设置二 子域设置三 其他相关设置 参考Cocos接入微信小游戏官方文档 xff0c 为了保护其社交关系链数据 xff0c 微信小游戏增加了开放数据域的概念 只有在开放数据域中才能访问微信提供的wx getFriendClo