记录一次世界坐标排查过程
程序员文章站
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;
}