收藏
回答

小游戏在获取关系链时遇到无法显示sharedCanvas的情况

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 Bug wx.getOpenDataContext 工具 6.6.5 1.02.1803210
// 点击分享按钮
shareClicked:function() {
    if (cc.sys.platform === cc.sys.WECHAT_GAME) {
 
        var openDataContext = wx.getOpenDataContext()
        var sharedCanvas = openDataContext.canvas
 
        if (sharedCanvas) {
            cc.log ("分享的面板存在")
        }
 
        var canvas = wx.createCanvas()
        var context = canvas.getContext('2d')
        context.drawImage(sharedCanvas, 0, 0)
 
        cc.log ("微信分享")
    }
},

在使用cocos creator开发小游戏时,需要获取些用户信息来制作排行版,根据提供的 https://mp.weixin.qq.com/debug/wxagame/dev/tutorial/open-ability/open-data.html?t=2018323 中的教程,主域和开放数据域的相关配置已经配置完成,但最后需要调用时却给出这样的提示:


An unsecure canvas can't take an secure canvas as arugment of drawImage When using subcontext

回答关注问题邀请回答
收藏

23 个回答

  • 白开水
    白开水
    2018-03-29

    @许敬,power-of-2 的解决方案,请直接搜索相关资料,这是 WebGL 自身的特性,与小程序无关。另外你在另一个帖子里的代码在将 sharedCanvas 上屏之前重设了 sharedCanvas 的宽高,重设 canvas 是会将 canvas 清空的。所以你得到了一个黑块。建议将设置 sharedCanvas 宽高的代码放到一开始去执行。

    2018-03-29
    有用
    回复
  • 白开水
    白开水
    2018-03-29

    @许敬,尝试用 requestAnimationFrame 的方式不断地将 sharedCanvas 以 gl 绘图方式绘制到上屏 canvas 上

    2018-03-29
    有用
    回复
  • 白开水
    白开水
    2018-03-29
    1. 引擎应该都是会不断地重绘上屏画布的,所以也要不断地将 sharedCanvas 重绘到上屏画布上。

    2. 如果想要清除掉 sharedCanvas,那 clear 掉画布重绘一次就好了

    2018-03-29
    有用
    回复
  • 白开水
    白开水
    2018-03-26

    错误提示翻译成中文就是:一个非安全的 Canvas 不能以 drawImage 的方式将一个安全的 Canvas 画到自己身上。


    在使用了开放数据域的情况下,安全 Canvas 只有两个:主域的上屏 Canvas 和主域与开放数据域共享的 sharedCanvas


    你代码中的错误在于 wx.createCanvas() 创建的并不是主域的上屏 Canvas 而只是一个普通的离屏 Canvas,即一个非安全 Canvas。因为你使用了 cocos 引擎。


    在整个小游戏代码中首次调用 wx.createCanvas() 创建的是上屏 Canvas,之后调用则创建的是离屏 Canvas。


    而你引入 cocos 引擎后, cocos 早就在你的那句 wx.createCanvas() 之前调用过 wx.createCanvas(),创建了上屏 Canvas。


    关于安全 Canvas 和非安全 Canvas 的概念,请参考教程文档。https://mp.weixin.qq.com/debug/wxagame/dev/tutorial/open-ability/open-data.html?t=2018323

    2018-03-26
    有用
    回复
  • 杨志鹏 Victor
    杨志鹏 Victor
    2018-05-18

    整理一下,所以应该是这样吗?

    let openDataContext = wx.getOpenDataContext();
    let sharedCanvas = openDataContext.canvas;
     
    let canvas = cc.game.canvas;
    let context = canvas.getContext('webgl');
    context.drawImage(sharedCanvas, 0, 0);

    但是这样的话我会报错:

    cc.game.canvas.getContext(...).drawImage is not a function TypeError: cc.game.canvas.getContext(...).drawImage is not a function

    而且我用了 Cocos Creator 的 camera 没办法不用 webgl 模式阿……

    2018-05-18
    有用
    回复
  • 刘彬
    刘彬
    2018-03-30

    @田顺建  是的

    2018-03-30
    有用
    回复
  • 田顺建
    田顺建
    2018-03-30

    @刘彬 你现在的做法是cocos构建的时候,选择渲染模式:canvas,然后在代码里用requestAnimationFrame不停的绘制sharedCanvas吗

    2018-03-30
    有用
    回复
  • 许敬
    许敬
    2018-03-29

    @白开水 明白你的意思了

    2018-03-29
    有用
    回复
  • 刘彬
    刘彬
    2018-03-29

    {"errMsg":"getUserCloudStorage:ok","KVDataList":[{"key":"score","value":"9"}]}

    {"errMsg":"getFriendUserGameData:fail 系统错误,错误码:-2"}

    @白开水, 个人数据取得到,好友数据取不到,请问这个系统错误码-2具体是什么原因呢?

    2018-03-29
    有用
    回复
  • 刘彬
    刘彬
    2018-03-29

    @白开水 谢谢大佬,终于能画出来了。

    2018-03-29
    有用
    回复

正在加载...

登录 后发表内容