Laya微信排行榜基于TypeScript脚本 详细步骤

3 篇文章 0 订阅
1 篇文章 0 订阅

Laya 微信排行榜功能实现(ts脚本)

Demo在最下面

Laya的微信排行榜分为主域和子域两个部分,主域就是游戏的包,子域是排行榜。

主域

新建view场景,命名Ranking(命名随意)添加WXOpenDataViewer

在这里插入图片描述
在这里插入图片描述
添加到场景里,改变长宽, 这个组件的范围就代表排行榜能显示的范围。类似于电视机的屏幕。
命名为open(命名随意)
然后新建脚本RankingList(命名随意)

export default class RankingList extends Laya.Script {
    constructor() { super(); }
    static open: Laya.WXOpenDataViewer;
    back: Laya.Image;//返回按钮
    onEnable(): void {
        this.back = this.owner.getChildByName("back") as Laya.Image;
        this.back.on(Laya.Event.CLICK, this, () => {
            (this.owner as Laya.View).close();
        })
        RankingList.open = this.owner.getChildByName("open") as Laya.WXOpenDataViewer;
        if (Laya.Browser.onMiniGame) {
            var w: any = wx;
            w.getUserInfo({
                success(res) {
                    var value1 = 123;//参数1
                    var value2 = 234;//参数2
                    RankingList.open.postMsg([res.userInfo, value1, value2]);
                }
            });
        }

    }

    onDisable(): void {
    }
}

把这个代码拖到刚才的场景节点上。

然后再Main.ts里写

if (Laya.Browser.onMiniGame) {
//排行榜相关图片图集的路径
			Laya.loader.load(["res/atlas/ui/RankingListAtlas.atlas"], Laya.Handler.create(this, () => {
				//图集加载完成后把图集信息发送到子域
				Laya.MiniAdpter.sendAtlasToOpenDataContext("res/atlas/ui/RankingListAtlas.atlas");
			}))
		}

找个地方给主域加一个授权按钮。

			 let button = w.createUserInfoButton({
                    type: '',
                    text: '',
                    style: {
                        left: 0,
                        top: 0,
                        width: 640,
                        height: 1280,
                        lineHeight: 40,
                        backgroundColor: '',
                        color: '',
                        textAlign: 'center',
                        fontSize: 16,
                        borderRadius: 4
                    }
                })
                button.onTap((res) => {
                    console.log(res)
                   //授权完成后可以吧按钮删掉
                     //button.destroy();
                })
              //打开排行榜的事件
              this.button_ranking.on(Laya.Event.CLICK, this, () => {
           		 Laya.Scene.open("uiscene/Ranking.json");
       		  })

主域的东西基本完成了

子域

新建开放域项目
在这里插入图片描述
创建好 搭个界面
在这里插入图片描述
这是我的。。。
在这里插入图片描述
在这里插入图片描述
这是界面设置
下面是Main.ts里写的

import GameConfig from "./GameConfig";
import BigRank from "./view/BigRank";
class Main {
	constructor() {
		//设置子域
		Laya.isWXOpenDataContext = true;
		Laya.isWXPosMsg = true;
		//根据IDE设置初始化引擎		
		Laya.init(GameConfig.width, GameConfig.height, false);
		Laya.stage.scaleMode = GameConfig.scaleMode;
		Laya.stage.screenMode = GameConfig.screenMode;
		Laya.stage.alignV = GameConfig.alignV;
		Laya.stage.alignH = GameConfig.alignH;
		if (Laya.Browser.onMiniGame) {
			Laya.Browser.window.wx.onMessage(function (data) {//微信接受信息
				if (data.url == "res/atlas/ui/RankingListAtlas.atlas") {
					Laya.loader.load([
						"res/atlas/ui/RankingListAtlas.atlas"], Laya.Handler.create(this, this.onComplete));
				}
			}.bind(this));
		}
	}

	onComplete(): void {
		//初始化rank排行榜
		var rank = new BigRank();
		//初始化
		rank.init();
	}
}
//激活启动类
new Main();

新建脚本BigRank.ts

import { ui } from "../ui/layaMaxUI"
export default class BigRank extends ui.test.ListUI {
    static I: BigRank;
    constructor() {
        super();
        BigRank.I = this;
    }

    /**list初始化使用的数据 */
    private arr: Array<any> = []
    /**list初始化使用的数据{nickName,avatarUrl,value1,value2} */
    private UserData: Array<any> = []
    //榜1
    List1: Array<any> = [];
    //榜2
    List2: Array<any> = [];
    /**
     * 初始化
     */
    public init() {
        Laya.stage.addChild(this);
        console.log(" 初始化");
        if (Laya.Browser.onMiniGame) {
            //接受来自主域的信息
            // 直接展示数据
            // this.getFriendData();       
            this.getData();

        }
        this.CheckRanking.on(Laya.Event.CLICK, this, () => {
            if (!(this.CheckRanking.getChildAt(0) as Laya.Image).visible) {
                (this.CheckRanking.getChildAt(0) as Laya.Image).visible = true;
                (this.LoveRanking.getChildAt(0) as Laya.Image).visible = false;
                Laya.Tween.to(this.lists, { x: 0 }, 500, Laya.Ease.backInOut);
            }

        });
        this.LoveRanking.on(Laya.Event.CLICK, this, () => {
            if (!(this.LoveRanking.getChildAt(0) as Laya.Image).visible) {
                (this.LoveRanking.getChildAt(0) as Laya.Image).visible = true;
                (this.CheckRanking.getChildAt(0) as Laya.Image).visible = false;
                Laya.Tween.to(this.lists, { x: -640 }, 500, Laya.Ease.backInOut);
            }
        });

    }
    //  ["萝卜", 123, 456]
    recevieData2(message): void {
        if (message.type) {
            return;
        }
        console.log(message);
        //判断arr集合中的元素是否存在名字与传送过来的消息的名字相同的值,若存在则删除该值 
        for (let i = 0; i < BigRank.I.UserData.length; i++) {
            const element = BigRank.I.UserData[i];
            if (element.nickName == message[0].nickName) {
                console.log("判断", element.UserName, message[0].nickName);
                console.log(BigRank.I.UserData.length);
                BigRank.I.UserData.splice(i, 1);
                console.log(BigRank.I.UserData.length);
            }
        }
        //在arr集合中添加新的值。
        BigRank.I.UserData.push({ Number: 1, nickName: message[0].nickName, avatarUrl: message[0].avatarUrl, value1: message[1], value2: message[2] });
        //榜1排序
        for (var i = 0; i < BigRank.I.UserData.length - 1; i++) {
            for (var j = i + 1; j < BigRank.I.UserData.length; j++) {
                if (BigRank.I.UserData[i].value1 < BigRank.I.UserData[j].value1) {
                    var data = BigRank.I.UserData[i];
                    BigRank.I.UserData[i] = BigRank.I.UserData[j];
                    BigRank.I.UserData[j] = data;
                }
            }
        }
        //将排序好的集合复制到List1中
        BigRank.I.List1 = [];
        for (let i = 0; i < BigRank.I.UserData.length; i++) {
            const element = BigRank.I.UserData[i];
            element.Number = i + 1;
            BigRank.I.List1.push(element);
        }
        if (BigRank.I.List1.length > 20)
            BigRank.I.List1.splice(19);
        //榜2排序
        for (var i = 0; i < BigRank.I.UserData.length - 1; i++) {
            for (var j = i + 1; j < BigRank.I.UserData.length; j++) {
                if (BigRank.I.UserData[i].value2 < BigRank.I.UserData[j].value2) {
                    var data = BigRank.I.UserData[i];
                    BigRank.I.UserData[i] = BigRank.I.UserData[j];
                    BigRank.I.UserData[j] = data;
                }
            }
        }
        //将排序好的集合复制到List2中
        BigRank.I.List2 = [];
        for (let i = 0; i < BigRank.I.UserData.length; i++) {
            const element = BigRank.I.UserData[i];
            element.Number = i + 1;
            BigRank.I.List2.push(element);
        }
        if (BigRank.I.List2.length > 20)
            BigRank.I.List2.splice(19);
        console.log("榜1", BigRank.I.List1);
        console.log("榜2", BigRank.I.List2);
        BigRank.I.setSelfData2(message);
        BigRank.I.setlist(BigRank.I.List1);
    }

    private getData(): void {
        wx.getFriendCloudStorage({
            keyList: ['test10086'],
            success: function (res) {
                BigRank.I.UserData = [];
                for (let l = 0; l < res.data.length; l++) {
                    const data = res.data[l];
                    console.log(data);
                    console.log(data.nickname, data.avatarUrl, data.KVDataList)
                    var KVdata = JSON.parse(data.KVDataList[0].value)
                    var message = KVdata.wxgame.value;
                    BigRank.I.UserData.push({ nickName: message[0].nickName, avatarUrl: message[0].avatarUrl, value1: message[1], value2: message[2] });
                }
                wx.onMessage(BigRank.I.recevieData2);
            }
        });
    }
    /**
     * 设置list arr
     * @param arr 赋值用的arr
     */
    public setlist(arr): void {
        BigRank.I._list.array = arr;
        BigRank.I._list.refresh();
        BigRank.I._list2.array = arr;
        BigRank.I._list2.refresh();
    }
    public setSelfData2(message): void {
        var kvDataList = [];
        var obj: any = {};
        obj.wxgame = {};
        obj.wxgame.value = message;
        console.log(obj);
        kvDataList.push({ "key": "test10086", "value": JSON.stringify(obj) });
        wx.setUserCloudStorage({
            KVDataList: kvDataList,
            success: function (e) {
                console.log('-----success:' + JSON.stringify(e));
            },
            fail: function (e) {
                console.log('-----fail:' + JSON.stringify(e));
            },
            complete: function (e) {
                console.log('-----complete:' + JSON.stringify(e));
            }
        });

    }
}

BigItem.ts

import { ui } from "../ui/layaMaxUI"
export default class BigItem extends ui.test.BigItemUI {
    constructor() {
        super();
    }

    public set dataSource(value) {
        if (!value)
            return;
        this.img_head.skin = value.avatarUrl;
        this.text_name.text = value.nickName;
        this.text_score.text = value.value1;
        this.love.visible = false;
        this.Number.text = "" + value.Number;
    }
}   

BigItem2.ts

import { ui } from "../ui/layaMaxUI"
export default class BigItem extends ui.test.BigItemUI {
    constructor() {
        super();
    }

    public set dataSource(value) {
        if (!value)
            return;
        this.img_head.skin = value.avatarUrl;
        this.text_name.text = value.nickName;
        this.text_score.text = value.value2;
        this.love.visible = true;
    }
}   

排行榜1里在这里插入图片描述
在UIView的runtime上加BigItem.ts
在这里插入图片描述
排行榜2里在这里插入图片描述
UIView的runtime上加BigItem2.ts
在这里插入图片描述

导出

导出开放域项目
在这里插入图片描述
打包完成后 打开发布文件夹
在这里插入图片描述
将这些文件复制
回到主域 在主域的bin目录下添加新的文件夹openDataContext
把刚才的文件粘贴到这个文件夹下
在这里插入图片描述
在子域的图集里找到排行榜的图集
在这里插入图片描述
吧这些东西复制到主域文件里 注意:跟之前主域Main.ts文件中写的路径要一样。
在这里插入图片描述
最后在主域的game.json文件中添加 “openDataContext”:“openDataContext”
发布测试
在这里插入图片描述
这个报错是正常的 不影响效果
在这里插入图片描述
在这里插入图片描述

完成了 有什么问题欢迎留言。最后。。。点个赞再走呗

Demo在这里 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
点个赞 ↓
这个Demo跟上面的代码类似 但不完全一样。用的时候注意点。。。。
Demo的GitHub地址
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
点个赞 ↑
Demo在这里 ↑

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值