收藏
评论

如何在 Creator环境下,把sharedCanvas上的内容绘制到主域上屏

在过去的几天一直在研究微信的开放数据域,因为我们的项目也用到了好友排行榜的群排行榜功能,我们的项目是用Cocos Creator开发的,所以最终SharedCanvas上的内容还是要绘制到Creator的环境里,如果用纯webGL的形式绘制,我就得抛弃Creator引擎,那会使我的项目开发变得更加困难;

我研究了一下Creator引擎的代码,他有一个类,叫做cc.Texture2D,表示的是2D纹理,这个类,有一个方法叫作initWithElement,源代码如下:

/**
     * Init with HTML element.
     * @method initWithElement
     * @param {HTMLImageElement|HTMLCanvasElement} element
     * @example
     * var img = new Image();
     * img.src = dataURL;
     * texture.initWithElement(img);
     * texture.handleLoadedTexture();
     */
    initWithElement: function (element) {
        if (!element)
            return;
        this._image = element;
        this.width = element.width;
        this.height = element.height;
        this.loaded = true;
    }

意思是,2D纹理,可以通过图片或canvas进行初始化,我写了一段测试代码如下:

var openDataContext = wx.getOpenDataContext();
        var sharedCanvas = openDataContext.canvas;
        sharedCanvas.width  = 512;
        sharedCanvas.height = 2048;
 
        //发送消息通知开放数据域,生成sharedCanvas
        openDataContext.postMessage({
            method:'showGroupRank',
            pageIndex: 1
        });
 
        var texture = new cc.Texture2D();
 
 
        var main = function () {
            texture.initWithElement(sharedCanvas);
            texture.handleLoadedTexture();
             
            this.rankSprite.spriteFrame = new cc.SpriteFrame(texture);
        };
 
 
        setTimeout(main, 1000);


运行了一下,居然能够正常输出sharedcanvas的内容,到此为止,终于把sharedcanvas与Cocos Creator的通道打通。


在之前我尝试过webGL的方式,在主域上屏绘制,遇到了不少问题,也请教了微信官方的开发人员,提到了不少帮助,在此表示感谢!

收藏

19 个评论

  • 削个椰子皮
    削个椰子皮
    2018-05-03

    sharedCanvas的尺寸在主域上修改感觉意义不大,因为不知道渲染的好友列表数是多少,翻页其实也不需要设置sharedCanvas的大小。感觉给出的好友排行榜解决方案很烂啊,没人骂么 - -

    2018-05-03
    赞同 1
    回复
  • Abel
    Abel
    2018-04-25

    你好,为什么现在按照这个方法显示不了

    2018-04-25
    赞同
    回复
  • YZ
    YZ
    2018-04-17

    @E.N  是cc.Sprite,场景编辑器右边的控件库中也能拖出Sprite控件

    2018-04-17
    赞同
    回复
  • AaronE.N
    AaronE.N
    2018-04-15

    this.rankSprite.spriteFrame = new cc.SpriteFrame(texture);

    请问这里的this.rankSprite是什么类型的?类型是cc.SpriteFrame吗?

    2018-04-15
    赞同
    回复
  • 许敬
    许敬
    2018-04-11

    @犀牛,sharedCanvas的尺寸,目前只能在主域里改,不能在开放数据域里改

    2018-04-11
    赞同
    回复
  • YZ
    YZ
    2018-04-10

    也谢谢楼主@许敬的分享!

    2018-04-10
    赞同
    回复
  • YZ
    YZ
    2018-04-10

    这样的限制真是很不人性化啊!好的,明白了。谢谢@冯驰!

    2018-04-10
    赞同
    回复
  • Faust
    Faust
    2018-04-10

    你说的这两点目前肯定是不支持的。

    第一个问题,就像你说的,我们能采取的手段也只有用定时器。

    第二个问题,主域的确不能知道子域里的数据有多少项,所以项数要主域来确定,比如只显示好友排行里的前30名。

    但是如果好友排行榜没有超过30个,子域还是按30个来依次绘制,那么滚动列表容器里就会有大片空白,因为对主域来说,没法知道绘制出来的sprite是有内容的还是空白的。 所以这就是为什么比较适合用翻页来表现排行榜。


    至于跳一跳,还不知道他的底层是基于“小游戏”还是“小程序”,如果是“小程序”,可能访问排行榜数据没有那么多限制。况且跳一跳是微信小程序的首发应用,可能当时数据接口并没有被这样限制。

    2018-04-10
    赞同
    回复
  • YZ
    YZ
    2018-04-10

    @冯驰 再请教一下,按你说的办法,如何从开放数据域中做到让主域知道sharedCanvas是否已经绘完?目前我是用延时一定时间再去获取sharedCanvas,还有我在开放数据域中绘制到最后一项时,主域如何知道已经到最后一项呢?

    2018-04-10
    赞同
    回复
  • Faust
    Faust
    2018-04-10

    想要做到也不是不可以,还是一样的思路。每次sharedCanvas只绘制一项,分多次在主域里把他们用sprite实例化出来,把这些sprite放到滚动容器里。

    2018-04-10
    赞同
    回复

正在加载...

登录 后发表内容