草庐IT

【微信小游戏】cocos creator 3.x对接小游戏子域

老豆8 2023-04-08 原文

Cocos creator 3.x起的微信子域,和旧版不一样了,当前做微信排行榜教程。

以前是使用creator新建一个子域项目进行操作,详情参考皮神的手把手案例:

微信小游戏接入好友排行榜(开放数据域)https://forum.cocos.org/t/topic/92773

一、构建

头部菜单栏》项目》构建

打开构建页面,点击左上角新建构建任务,或者是原项目点击修改按钮

打勾 生成开放数据域,将会在生成的wx项目里多一个openDataContext的文件夹

自动对应在你的项目里生成:build\wechatgame\openDataContext

二、openDataContext

里面已经存在案例demo,我开发的时候卡住的主要是在于demo不会操作,耗费了挺多时间,现在给案例大家参考就明白了。

分别对应是index入口,template模板,demodata测试数据

结构为:

 

具体代码分析

index:

import { rankStyle } from './render/style'
import { setRankTemplate } from './render/template'
import Layout from './engine'
import {friendRankData, getFriendRankData } from './render/dataDemo'

let __env = GameGlobal.wx || GameGlobal.tt || GameGlobal.swan;
let sharedCanvas = __env.getSharedCanvas();
let sharedContext = sharedCanvas.getContext('2d');
let danmuInterval = 0;

function drawRank() {
    Layout.clear();
    Layout.init(setRankTemplate(friendRankData), rankStyle);
    Layout.layout(sharedContext);
}


function updateViewPort(data) {
    Layout.updateViewPort({
        x: data.x,
        y: data.y,
        width: data.width,
        height: data.height,
    });
}


__env.onMessage(data => {
    console.log("onMessage---", data);

    clearInterval(danmuInterval);
    if (data.type === 'engine' && data.event === 'viewport') {
        updateViewPort(data);

    } else if (data.key == "RankData") {
        getFriendRankData("RankData", drawRank)
    }
});

demoData:

let testData = {
    data: [
        /*
        {
            rankScore: 0,
            avatarUrl: '',
            nickname: '',
        },
        */
    ],
};

const maxCount = 30;
for (let i = 0; i < maxCount; ++i) {
    let item = {};
    item.rankScore = Math.floor((Math.random() * 500));
    item.avatarUrl = 'openDataContext/render/avatar.png';
    item.nickname = 'Player_' + i;
    testData.data.push(item);
}
testData.data.sort((a, b) => b.rankScore - a.rankScore);



export let friendRankData = {
    data: [
        /*
        {
            rankScore: 0,
            avatarUrl: '',
            nickname: '',
        },
        */
    ],
    itemBg: "",
};

/**
 * 获取好友排行榜列表
 */
export function getFriendRankData(key, callback) {
    wx.getFriendCloudStorage({
        keyList: [key],
        success: res => {
            // console.log("getFriendData success--------", res);
            friendRankData.data = res.data;
            friendRankData.data.sort((a, b) => b.KVDataList[0].value - a.KVDataList[0].value);
            friendRankData.itemBg = 'openDataContext/render/itemBg.png';
            for (let i = 0; i < friendRankData.data.length; i++) {
                friendRankData.data[i].rankImg = 'openDataContext/render/Rank_' + (i + 1) + '.png';
            }

            callback && callback();
        },
        fail: res => {
            console.log("getFriendData fail--------", res);
            callback && callback(res.data);
        },
    });
}

style:


//-----------------------------------rankStyle-------------------------------------------
export let rankStyle = {
    container: {
        width: 750,
        height: 1334,
        borderRadius: 12,
        backgroundColor: 'rgba(0, 0, 0, 0)',
        alignItems: 'center',
    },

    rankList: {
        width: 750,
        height: 595,
        marginTop: 430,
        backgroundColor: 'rgba(0, 0, 0, 0)',
    },

    list: {
        width: 750,
        height: 500,
        backgroundColor: 'rgba(0, 0, 0, 0)',
        alignItems: 'center',
    },

    listItem: {
        backgroundColor: 'rgba(0, 0, 0, 0)',
        width: 600,
        height: 120,
        flexDirection: 'row',
        alignItems: 'center',
    },
    listItemNumImg: {
        marginLeft: 28,
        marginRight: 18,
        borderRadius: 6,
        width: 54,
        height: 70,
    },

    listItemNum: {
        marginLeft: 20,
        width: 80,
        height: 80,
        fontSize: 30,
        fontWeight: 'bold',
        color: '#452E27',
        lineHeight: 90,
        textAlign: 'center',
    },

    listHeadBg: {
        position: 'absolute',
        borderRadius: 6,
        width: 600,
        height: 120,
    },

    listHeadImg: {
        borderRadius: 6,
        width: 70,
        height: 70,
    },

    listItemScore: {
        fontSize: 40,
        fontWeight: 'bold',
        marginLeft: 10,
        height: 80,
        lineHeight: 80,
        width: 100,
        textAlign: 'right',
    },

    listItemName: {
        fontSize: 40,
        height: 80,
        lineHeight: 80,
        width: 200,
        marginLeft: 30,
    },

    listScoreUnit: {
        opacity: 0.5,
        color: '#000000',
        fontSize: 40,
        height: 80,
        lineHeight: 80,
        marginLeft: 8,
    },
}

template:

(注意:模板引擎编译成版本函数,可通过olado.github.io/doT/index.html在线获得)

//-----------------------------------rankTemplate-------------------------------------------
/*
<view class="container" id="main">
  <view class="rankList">
        <scrollview class="list">
            {{~it.data :item:index}}
          		<view class="listItem">       		
				
                  <image class="listHeadBg" src="{{= it.itemBg }}"></image>
                {{? index <= 2 }}
                <image class="listItemNumImg" src="{{= item.rankImg}}"></image>
                {{?}}
                {{? index > 2 }}
                <text class="listItemNum" value="{{= index + 1}}"></text>
                {{?}}
                    <image class="listHeadImg" src="{{= item.avatarUrl }}"></image>
                  <text class="listItemName" value="{{= item.nickname}}"></text>
                  <text class="listItemScore" value="{{= item.KVDataList[0].value}}"></text>
                  <text class="listScoreUnit" value="关"></text>
                </view>
            {{~}}
        </scrollview>
    </view>
</view>
*/

// 上述模板经过模板引擎编译成版本函数,可通过 olado.github.io/doT/index.html 在线获得
export function setRankTemplate(it) {
    var out = '<view class="container" id="main"> <view class="rankList"> <scrollview class="list"> ';
    var arr1 = it.data;
    if (arr1) {
        var item, index = -1,
            l1 = arr1.length - 1;
        while (index < l1) {
            item = arr1[index += 1];
            out += ' <view class="listItem">  <image class="listHeadBg" src="' + (it.itemBg) + '"></image> ';
            if (index <= 2) {
                out += ' <image class="listItemNumImg" src="' + (item.rankImg) + '"></image> ';
            }
            out += ' ';
            if (index > 2) {
                out += ' <text class="listItemNum" value="' + (index + 1) + '"></text> ';
            }
            out += ' <image class="listHeadImg" src="' + (item.avatarUrl) + '"></image> <text class="listItemName" value="' + (item.nickname) + '"></text> <text class="listItemScore" value="' + (item.KVDataList[0].value) + '"></text> <text class="listScoreUnit" value="关"></text> </view> ';
        }
    }
    out += ' </scrollview> </view></view>';
    return out;
}

三、生成模板

还支持一个模板的生成,点击头部主菜单》项目》创建模板》微信小游戏

自动对应在你的项目里生成:build-templates\ wechatgame 以后修改这里,对应微信项目那边的子域也会变成和这里一样。

有关【微信小游戏】cocos creator 3.x对接小游戏子域的更多相关文章

  1. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  5. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  6. Ubuntu20.04系统WineHQ7.0安装微信 - 2

    提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信

  7. 微信小程序订餐系统 - 2

    对传统的餐饮商家来说,小程序很好地解决了餐厅线下线上连接的问题,在引流获客、节约人力、营销宣传、塑造会员体系、改善消费体验等方面都有很大帮助。小程序点餐可以帮助餐饮企业节省一大把人力开支。一个包含扫码点单、菜品管理、优惠券推送、外卖配送的小程序,商家花几万元就能完成开发测试并投入。商家为什么要开通“扫码点餐”1.解决服务员不够用的问题。2.不怕顾客跑单漏单。3.在微信就能管理菜品、查看营业额。4.订单小票显示顾客桌号和已点菜品。5.可在“附近的小程序”找到您的门店。如今餐饮业常用的三种经营模式:1堂食点单模式客人通过小程序堂食点单。商家可以在微信扫码点餐小程序管理后台根据自己店内情况来设置不同

  8. ruby-on-rails - 使用用户或管理员模型和 Basecamp 样式子域设计登录 - 2

    我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica

  9. ruby-on-rails - 子域 + ActionView::Template::Error(缺少要链接的主机!) - 2

    我已经解决了标题中描述的错误的众多解决方案。ActionView::Template::Error(缺少要链接的主机!请提供:host参数,设置default_url_options[:host],或将:only_path设置为true):但是,该项目还修改了url_for函数以使用子域,如本railscast所示:http://railscasts.com/episodes/221-subdomains-in-rails-3因此,这个错误的传统答案,例如在我的环境设置中设置变量似乎不是解决方案。这里有一些其他的提示:这是一个全新的设置,我刚刚克隆了一个项目并安装了ruby​​、rai

  10. ruby - 使用 Ruby 编写 Unity 游戏 - 2

    所以我看到unity支持c#、JS和Boo。我可以学习其中一个,但我想制作一个“编译器”或类似的东西,让我可以编写ruby​​代码并输出JS代码或制作一个可以被Unity编译器读取的层。这有可能吗?我愿意在这方面投入很多时间并且有相当多的经验。 最佳答案 如果您的问题实际上是“我如何将Ruby编译为JavaScript”,那么这更容易回答:Opal:RubytoJavaScriptcompiler但是,学习其中一种受支持的语言会更好。当运行的是用另一种语言解释的代码时,很难调试“您的”代码。

随机推荐