小朋友问个问题,获取用widget适配后的节点坐标问题? 坑!

版本:2.0.6
获取位置:在onLoad或start中获取节点用widget适配后的坐标,获取的坐标并没有改变
当节点用widget适配后,节点位置发生了改变,但获取的坐标并没有改变,看API 说用updateAlignment立刻执行对齐,但是这个updateAlignment执行之后还是原先未适配坐标,在定时器中输出了一下节点坐标,发现前两帧是原始坐标,之后才是适配后坐标,

这应该是在onLoad,start执行时widget还没有适配好坐标,所以获取的是原编辑器中的坐标,这个应该在onload之前widget就适配好吧,因为打开模拟器的时候有一个很明显的用widget闪移适配过程;
之所以想在初始化的时候去获取这个坐标的原因是,获取一个点相对另一个节点的坐标已经进行了多次转换,所以想在初始化的时候获取,而不是在用到的时候。

另外再说一个小问题,苹果手机当电量不足的时候,系统会提示电量不足弹框,关闭弹框,游戏的循环背景音乐会被关闭。微信小游戏遇到,2.0.6

昨天遇到这个问题,调用updateAlignment后坐标是适配后的,楼主可以再检查一下是不是没调用成功?

1赞

你确定你是在onLoad或start中调用的吗? 并且我说的原坐标是原编辑器中的节点坐标(-300,580),适配后的坐标是启动模拟器后根据不同屏幕而定的实际节点坐标(-300,720.21),你要是手动在onLoad或start中改变边距后调用updateAlignment,比如top+=50;那你适配后的坐标是手动改变边距后坐标(-300,580-50),是能及时得到,但你是相对于原编辑器坐标 ;
我的问题是:在onLoad,start执行时(widget还没有根据不同屏幕适配好坐标)即节点还没有变成屏幕适配后的坐标(-300,720.21);

测试可用

updateAlignment亲测可用
在onLoad中加入

this.node.getComponent(cc.Widget).updateAlignment();

组建代码就是:

    onLoad () {
        this.node.getComponent(cc.Widget).updateAlignment();
        console.log(this.node.x, this.node.y);
    },

    start () {
        console.log(this.node.x, this.node.y);
    },

    update (dt) {
        console.log(this.node.x, this.node.y);
    },

没加updateAlignment的效果是:

加了之后:

上面模拟器屏幕忘了说明,还有widget模式;
环境:
竖屏
设计屏幕:720,1280
模拟器屏幕:1125,2436
场景cavas适配,Fit width
节点:
挂组件widget,勾选top,target拖上场景cavas,模式Aign Mode:Always;

cavas挂上以下脚本代码:

cc.Class({
extends: cc.Component,

properties: {
    testNode: cc.Node
},
onLoad:function(){
    console.log(`[onLoad] this.testNode= ${this.testNode.position}`);
},

start () {
    console.log(`[start] this.testNode= ${this.testNode.position}`);

},

update (dt) {
    console.log(`[update] this.testNode= ${this.testNode.position}`);
},

});

加这一句话,测试打印正常

谢谢,我之前我测试错了,真无语

我就知道,哈哈

@pufanyang @BigBear
我回自己项目重新测试了一下,环境给错一个了;
场景canvas适配:都不勾选
场景适配用代码去根据不同实际屏幕去选择
widgetDemo2.zip (758.2 KB)