GRoot在Canvas不同fit height/fit width选项下位置错位

FGUI版本最新,COCOS 版本 2.4.0,预览分辨率 IPHONE X
同时勾选 Fit Width,Fit Height 显示正常
只勾选 Fit Width,显示偏上
只勾选 Fit Height, 显示偏左
都不勾选,显示有所放大
 GRoot.prototype.onWinResize = function () {
//fgui 历史代码
// var size = cc.view.getCanvasSize();
// size.width /= cc.view.getScaleX();
// size.height /= cc.view.getScaleY();
// var pos = cc.view.getViewportRect().origin;
// pos.x = pos.x / cc.view.getScaleX();
// pos.y = pos.y / cc.view.getScaleY();
// this.setSize(size.width, size.height);
// this._node.setPosition(-pos.x, this._height - pos.y);

// //可用大小
// var size = cc.view.getVisibleSize();
// //设计大小
var canvasSize = cc.view.getDesignResolutionSize();
// //方案二 始终保持全屏
// //认为的全屏大小
var size2 = cc.view.getCanvasSize();
size2.width /= cc.view.getScaleX();
size2.height /= cc.view.getScaleY();
var pos = cc.v2((size2.width-canvasSize.width)/2,(size2.height - canvasSize.height)/2);
this.setSize(size2.width,size2.height);
this._node.setPosition(-pos.x, size2.height - pos.y);


this.updateContentScaleLevel();
};
我使用
getDesignResolutionSize获取设计分辨率来计算位置,表现上能解决问题,
能否请问一下谷主这样做会不会有什么问题,以及为什么会产生偏移。
 
附:cocos Viewport的计算代码
getViewportRect,
_buildResult: function (containerW, containerH, contentW, contentH, scaleX, scaleY) {
// Makes content fit better the canvas
Math.abs(containerW - contentW) < 2 && (contentW = containerW);
Math.abs(containerH - contentH) < 2 && (contentH = containerH);

var viewport = cc.rect((containerW - contentW) / 2, (containerH - contentH) / 2, contentW, contentH);

// Translate the content
if (cc.game.renderType === cc.game.RENDER_TYPE_CANVAS){
//TODO: modify something for setTransform
//cc.game._renderContext.translate(viewport.x, viewport.y + contentH);
}

this._result.scale = [scaleX, scaleY];
this._result.viewport = viewport;
return this._result;
},

var viewport = cc.rect((containerW - contentW) / 2, (containerH - contentH) / 2, contentW, contentH);
 
已邀请:

谷主

赞同来自:

这里你可以自己改一个正确的效果。我没有测试过所有的适配设置。一般只用Fit Width&Height。单独的Fit Width或者Fit Height都会有留边的情况发生。

pengpeng

赞同来自:

我试过,应该是canvas的问题,canvas只会拉伸游戏画面,但是不会改变他的节点的size,所以如果摄像机在canvas下面,他的尺寸也不会改变,会导致偏移。
如果你使用widget组件适配节点的尺寸让canvas和摄像机的尺寸都是实际分辨率就不会发生偏移。
虽然对你应该没用了,希望下面的人不用踩坑

要回复问题请先登录注册