微信小游戏利用开放域好友关系链做排行榜

鉴于这块功能的重要性,自己在这块也走了不少弯路,做了许多无用功,现把这块记录如下:
 
1.引擎版本: 1.7.18(我直接使用链接:引擎版本及IDE下载
2.项目结构
需要建立两个项目:一个用于主域(游戏本身),一个用于开放放域,结构如下:
wxdemo
      |-------demo-main
      |-------demo-open
即建立文件夹wxdemo,然后在下面建立两个文件夹demo-main(主域)和demo-open(开放域),在这两个文件夹下分别建立微信小游戏项目。
2.在LayaAirIDE中对上面建立的两个项目中搜索关键字bitmap._addReference,在laya.core.js中找到,如下代码:
if (bitmap){
     bitmap._addReference();
}将其改成:
if (bitmap && bitmap._addReference){
    bitmap._addReference();
}
其实就是在if中加了个判断
3.修改主域的game.js文件,在里面增加开放域的映射目录
"openDataContext": "src/myOpenDataContext",
请记住这个目录,此目录就是开放域发布的目录,所以在发布开放域项目时,请将发布目录指向此目录
4.在主域项目的bin目录下建立目录结构: src/myOpenDataContext
按照我建立的这个项目,那目录路径就是:/wxdemo/demo-main/src/myOpenDataContext
5.主域这边代码:


import Label = Laya.Label;
import Handler = Laya.Handler;
import Loader = Laya.Loader; 
class GameBootstrap{ 
    public constructor(){
        this.init();
    } 
    private init():void{
        //初始化微信小游戏
        Laya.MiniAdpter.init(true);
        //程序入口
        Laya.init(600, 400,Laya.WebGL); 
        //激活资源版本控制
        Laya.ResourceVersion.enable("version.json", Handler.create(this, this.beginLoad), Laya.ResourceVersion.FILENAME_VERSION);
    } 
    private beginLoad():void{
        Laya.loader.load("res/atlas/comp.atlas", Handler.create(this, this.onLoaded));
    } 
    private onLoaded(): void {
        console.log("onLoaded ......");
        GameBootstrap.wxPostMessage({
            cmd:1,
            text: 'hello',
            year: (new Date()).getFullYear()
        },null,function(message){
            let wx = Laya.Browser.window.wx;
            let openDataContext = wx.getOpenDataContext(); 
            var rankTexture:Laya.Texture = new Laya.Texture(Laya.Browser.window.sharedCanvas);
                rankTexture.bitmap.alwaysChange = true;//小游戏使用,非常费,每帧刷新
                
                let sprite:Laya.Sprite = new Laya.Sprite();
                Laya.stage.addChild(sprite);
                sprite.graphics.drawTexture(rankTexture,0,0,rankTexture.width,rankTexture.height); 
                // console.log("再次往开放域发请求");
                // openDataContext.postMessage({
                //  cmd:2,
                //  text: 'hello---2',
                //  year: (new Date()).getFullYear()
                // }); 
        });
    }
    /**
     * 启动主域
     */
    public start():void{
        console.log("Game running ......");
    } 
    /**
     * 向开放域发送消息,并接收开放域返回过来的数据,
     * 可根据发送参数和接收数据在主域这边进行下步处理
     * @param message
     * @param caller
     * @param callback
     */
    public static wxPostMessage(message:any,caller:any,callback:Function):void{
        let wx = Laya.Browser.window.wx;
        if(wx != undefined){
            let openDataContext = wx.getOpenDataContext();
            openDataContext.postMessage(message);
            Laya.timer.once(400,this,function():void{
                //回调处理
                if(caller == null || caller == undefined){
                    callback(message);
                }else{
                    caller.callback(message);
                }   
            });
        }
    }

let bootstrap = new GameBootstrap();
bootstrap.start();


开放域代码:


class OpenDataBootstrap {
    private wx:any;
    public constructor(){
        this.init();
    } 
    private init():void{
        //初始化微信小游戏
        Laya.MiniAdpter.init(true,true);
        //程序入口
        Laya.init(600, 400);
        this.wx = Laya.Browser.window.wx;
        
        
    } 
    /**
     * 监听服务端发送过来的消息
     */
    private wxOnMessage():void{
    
        if(this.wx!=undefined){
            // Laya.timer.once(200,this,function():void{
                //监听主域发送过来的消息   
                this.wx.onMessage(function(message:any){ 
                        if(message == undefined || message.cmd == undefined){
                            console.log("消息传递格式错误 ......"+JSON.stringify(message));
                            return;
                        }
                    
                        console.log("收到主域发送过来的数据"+JSON.stringify(message));
                        OpenDataBootstrap.dispatch(message);
                        
                });
            // });
        }
    }
    /**
     * 消息调度
     * 可以将message.cmd 跟消息处理类或方法用字典做个映射表
     * @param message
     */
    private static dispatch(message:any):void{
        switch(message.cmd){
            case 1:
                var testUI: ui.test.TestPageUI = new ui.test.TestPageUI();
                testUI.x = 100;
                testUI.y = 20;
                Laya.stage.addChild(testUI);
                break;
            case 2:
                console.log("cmd: "+message.cmd);
                break;
            default:
                console.log(JSON.stringify(message))
        }
    }
    public start():void{
        console.log("OpenDataBootstrap running ...... ......"); 
        this.wxOnMessage();
    }

let bootstrap = new OpenDataBootstrap();
//启动开放域处理
bootstrap.start();


6.微信开发者工具中的调试项目目录指定为主域项目的bin目录:
/wxdemo/demo-main/bin
 
注意:不论修改的是主域代码还是开放域代码都要重新发布对应的项目!!!
 
 
 
 
 
 
 
 
 
 
已邀请:

callback

赞同来自: Speculator 138*****782

rankTexture.bitmap.alwaysChange = true;
这个一开 安卓就卡成翔了~~~ 你们没有这个问题?

Laya_Aaron

赞同来自:

简洁明了,感谢分享。

A4

赞同来自:

if (bitmap && bitmap._addReference){
    bitmap._addReference();
}
我去还有这种操作

yanmingjie

赞同来自:

请教一下,子域里面渲染锯齿比较厉害。是需要注意哪里吗?

老街里的巷

赞同来自:

3.修改主域的game.js文件,在里面增加开放域的映射目录
"openDataContext": "src/myOpenDataContext"
这一步是填到game.js还是game.json
 

Jessica

赞同来自:

求大神能不能把DEMO的代码发我学习学习~~~~
 
邮箱41239808@qq.com

jlike521

赞同来自:

boss_icon.jpg

纯js 的 3D 版本的 刷新会有点问题 二次正常

要回复问题请先

商务合作
商务合作