记录一次世界坐标排查过程(Canvas节点始终在屏幕正中间)

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;
                        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值