欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录一次世界坐标排查过程

程序员文章站 2022-03-23 12:58:02
...

记录一次世界坐标排查过程

1)出错原因: 录制时是一个死的坐标,但是在回放时,如果屏幕分辨率大小发生改变,那么节点就不在录制的点的坐标了。

2)解决办法: 物体坐标在不同分辨率下的变化和Canvas坐标的变化一致,计算出来一个Offset即可,

       优点是:不用改变代码了。

3)更好的解决办法:  发送消息时,一定要是是本地坐标-->使用时转换为世界坐标-->再将世界坐标转换使用节点的本地坐标。

       优点是:完全不用考虑canvas这个东西,在不同分辨率下,自动会转换。

let TaskReplayAnswer = require("TaskReplayAnswer");

class tetra_utils {

    /**
     * 转换全局坐标
     * 区分下: 是回放传递过来的,还是其它操作.
     * 只有回放状态,有些传递的是全局坐标,可能在其它分辨率下有问题
     *
     * @param globalPos
     * @returns {r|Vec2|Vec2|Vec2}
     */
    static convertGlobalPosWithOffset(globalPos) {
        // 如果正在回放才计算偏移
        if (TaskReplayAnswer.getInstance().isReplaying) {
            let offset = tetra_utils._getCanvasOffset();
            let new_globalPos = new cc.Vec2(globalPos.x + offset.x, globalPos.y + offset.y);
            return new_globalPos;
        }

        return globalPos;
    }

    /**
     * 全局坐标偏移
     */
    static _getCanvasOffset() {
        if (!tetra_utils.is_init) {
            let canvasNode = cc.find("Canvas");
            if (canvasNode) {
                // 400 300是射击分辨率下Canvas坐标
                // canvasNode.x canvasNode.y是真实环境下Canvas坐标
                tetra_utils.globalOffset = {
                    x: canvasNode.x - 400,
                    y: canvasNode.y - 300,
                };
                tetra_utils.is_init = true;
                cc.log("初始化Canvas偏移", tetra_utils.globalOffset);
            }
        }

        return tetra_utils.globalOffset;
    }

}

tetra_utils.globalOffset = new cc.Vec2(0, 0);
tetra_utils.is_init = false;

module.exports = tetra_utils;

使用:

 // fix bug:全局坐标
                        final_w_pos = tetra_utils.convertGlobalPosWithOffset(final_w_pos);

                        // 最终位置
                        let tmpX = final_w_pos.x;
                        let tmpY = final_w_pos.y;

                        let diff = 20;
                        final_w_pos.x = Math.max(diff, final_w_pos.x);
                        final_w_pos.x = Math.min(this.limitSize.width - diff, final_w_pos.x);

                        final_w_pos.y = Math.max(diff, final_w_pos.y);
                        final_w_pos.y = Math.min(this.limitSize.height - diff, final_w_pos.y);

                        // 是否拖到外面强制同步
                        let isPosOutSync = false;

                        if ((tmpX != final_w_pos.x) || (tmpY != final_w_pos.y)) {
                            isPosOutSync = true;
                        }

 

相关标签: debug