Creator 小游戏排行榜 触碰位置和适配调整问题解决方案
排行榜的添加用的追风大神的开源方案自行搜索不再赘述,直接写解决问题的过程和方法:
问题:
-
sharedCanvas 设置宽高后渲染位置正确,但是触碰位置在不同分辨率的机型上位置偏差,有的根本点不到;
-
sharedCanvas 不设置宽高触碰位置正确,但是渲染却会有拉伸,缩放的现实问题;
解决办法:
1.首先要设置子域的 设计分辨率和主域的相同以便以后绘制适配;
2.sharedCanvas 不设置宽高,即使用实际的机型分辨率作为宽高,这样解决了触碰位置的问题;
3.主域用来绘制 sharedCanvas 的 Sprite 要设置为实际显示分辨率(即cc.director.getVisibleSize)来保证 sharedCanvas可以完全绘制出来并铺满全屏且不会被拉深失真;
this.rankingScrollView.node.setContentSize(cc.director.getVisibleSize());
4.此时你如果用的适配高的适配方案应该就完全可以了(因为子域的canvas在绘制到 sharedCanvas 上时用的就是适配宽策略,目前本人还没这个发现怎么设置),
但是我用的是自动更改适配宽高的配置,所以在子域中需要对自身canvas进行缩放设置(判断如果适配高对canvas进行缩放)
if(_rateV > _rateR)
{
console.log(“winSizeRank: fitWidth”);
}
else
{
console.log(“winSizeRank: fitHeight”);
cc.Canvas.instance.node.setScale(cc.Canvas.instance.node.getContentSize().height/cc.Canvas.instance.designResolution.height);}
ok,这样就可以完美解决所有分辨率的适配问题。
原理分析(个人理解)和问题解决过程:
1.sharedCanvas是一个离屏画布,子域绘制到主域的过程就是 子域canvas 绘制到 sharedCanvas 上,之后 主域绘制 sharedCanvas,所以主域和子域并不能直接接触,需要通过 sharedCanvas 这
个中间层来进行画面的传递,所以要考虑主域、sharedCanvas和子域这三者的绘制传递方式。
2.首先主域绘制sharedCanvas时需要承载的sprite与sharedCanvas保持宽高比率一致,以保证在铺满全屏情况下不致失真。
3.其次由于触碰位置的关系我们不能动sharedCanvas 的大小,这样就确定了 sprite 和 sharedCanvas的大小以及平铺的渲染模式,此时 sprite 在 绘制时就可以自动拉伸sharedCanvas来铺满全屏。
4.子域绘制到 sharedCanvas 时需要保证子域的 Canvas 通过sharedCanvas 缩放传递后绘制到主域不会影响原来大小(即子域传递期间缩放是等价的)否则就会出现不同机型子域的大小显示不一
致问题,这是一个大问题,因为不知道适配方式和渲染模式所以只能一种种尝试,发现子域canvas的ContentSize的宽会与设计分辨率一直保持一致,高会根据实际分辨率的大小进行缩放,即
子域绘制到sharedCanvas使用的是适配宽的方案,所以此时主域如果用的是适配宽就没有问题,所以其他适配发难就要对应缩放画布,比如在适配高时根据实际画布的与设计分辨率高的比进
行画布的缩放。
以上是个人观点以及解决思路,亲测有效,如果有误,欢迎批评指正!