使用cocos creator 1.9.1 ,微信子域绘制上屏模糊

  • Creator 版本:1.9.1-rc.1

  • 目标平台: 微信小游戏

实现排行榜,单独建了个cocos工程,发布到子域。上屏后 文字 、图片 都是模糊的。开始以为是自己哪里搞错了,后来试了下你们参考文档里提供的sample(当然,我们在sample里改动了下,加了几张自己的图片测试用),跑起来也是模糊的。

参考的文档是:
https://github.com/cocos-creator/creator-docs/blob/master/zh/publish/publish-wechatgame-sub-domain.md

2赞

@jare
@panda

666 来学习显示排行榜了

主域加上如下代码:
var openDataContext = wx.getOpenDataContext();
var sharedCanvas = openDataContext.canvas;
if (sharedCanvas) {
sharedCanvas.width = cc.game.canvas.width * 2;
sharedCanvas.height = cc.game.canvas.height * 2;
}
子域修改引擎代码:
cc.view._convertPointWithScale=function(point) {
var viewport = this._viewPortRect;
point.x = (point.x - viewport.x) / (this._scaleX / 2);
point.y = (point.y - viewport.y) / (this._scaleY / 2);
};
cc.view._convertTouchesWithScale=function(touches) {
var viewport = this._viewPortRect, scaleX = this._scaleX / 2, scaleY = this._scaleY / 2, selTouch, selPoint, selPrePoint;
for (var i = 0; i < touches.length; i++) {
selTouch = touches[i];
selPoint = selTouch._point;
selPrePoint = selTouch._prevPoint;
selPoint.x = (selPoint.x - viewport.x) / scaleX;
selPoint.y = (selPoint.y - viewport.y) / scaleY;
selPrePoint.x = (selPrePoint.x - viewport.x) / scaleX;
selPrePoint.y = (selPrePoint.y - viewport.y) / scaleY;
}
};
即可解决问题。

4赞

核心的思路还是用一个固定的比例去扩展子域 canvas,然后在子域中去矫正触摸的响应

panda大大,
请问一下ios系统在loading页面预加载资源的时候切换小游戏至后台,再返回的时候跳转至其他场景页面渲染是资源不全的,但是加载资源的回调里可以看出资源已经全部加载成功了,且切回来用了onShow监听,回调里用过cc.game.resume,用过preloadScene,都没有用,请问有什么好的处理方法吗?
谢谢您。

给sharedCanvas.width赋值的话,微信开发工具会提示read only

主域才可以设置的,子域内部不能设置。
@494901744 你的问题我不是很确定原因,可以尝试检查一下这些资源是否在 loader 中,cc.loader._cache 检查

我觉得1.9.1这个子域的方案很傻很天真。为了实现个排行榜又要加个工程,引入一堆和主域工程一样重复的js文件,体积还不小。简直就是得不偿失。不如直接在子域中用canvas绘图方法画头像,昵称,其它文字。再按教程说的把sharedCanvas画到主域去。

@panda @jare

5赞

加上if (sharedCanvas) {
sharedCanvas.width = cc.game.canvas.width * 2;
sharedCanvas.height = cc.game.canvas.height * 2;
}
后无法显示了呢?

1赞

给canvas设置宽高一定要在upate之前

子域,还是要抛弃一下引擎的一些固有概念,比如MainLoop,比如Resolution,就简简单单写一个子域的小引擎,更好用

1赞

子域就老老实实调用wx接口吧,不要再引入一个cocos creator工程了

第二个引擎函数的var viewport = this.viewPortRect中的viewPortRect前面少了一个下划线,应为_viewPortRect

1赞

如何在子域中绘制玩家微信头像?(不用微信提供的api,我想用cocos控件来显示)

我是在子域中用cocos控件做了一个排行榜,涉及到头像的代码如下:
cc.loader.load(userData.avatarUrl, function(err, texture){
console.log("load download_url = ", userData.avatarUrl);
var MyHeadSprite = new cc.SpriteFrame(texture);
this.head.spriteFrame = MyHeadSprite;
}.bind(this));

结果报错了:
gameSubContextThirdScriptError
fs.access is not a function;at requestAnimationFrame callback function
TypeError: fs.access is not a function

是不是只能用wx.createImage()???
如果是这样的话,cocos提供的子域方案不是没用?

createImage(sprite,url){
let image = wx.createImage();
image.onload = function () {
let texture = new cc.Texture2D();
texture.initWithElement(image);
texture.handleLoadedTexture();
sprite.spriteFrame = new cc.SpriteFrame(texture);
};
image.src = url;
}

已解决

1赞

设置canvas宽高会清空内容,所以这时候将canvas通过texture2d绘制出来是空的。

子域的话,我觉得可以用一些很小的引擎写。比如phaser啥的

安卓机子上排行榜确实很模糊

看到cocos的范例写成这样子,感觉cocos的引擎估计也写的不怎么样,有点不想用cocos了

4赞