在制作新手引导或者自动化测试时,有了模拟点击真的方便不少,虽然cocos官方没有提供,但是查看源码还是支持的,这篇文章是转载自:
https://forum.cocos.org/t/topic/83221
https://github.com/ShawnZhang2015/GodGuide/blob/01b5041c255e0ea8dc5cb34ee63f4a4e4c3b344b/assets/GodGuide/GodGuide.js#L25
function getHTMLElementPosition(element) {
var docElem = document.documentElement;
var leftOffset = window.pageXOffset - docElem.clientLeft;
var topOffset = window.pageYOffset - docElem.clientTop;
if (typeof element.getBoundingClientRect === 'function') {
var box = element.getBoundingClientRect();
return {
left: box.left + leftOffset,
top: box.top + topOffset,
width: box.width,
height: box.height
};
}
else {
if (element instanceof HTMLCanvasElement) {
return {
left: leftOffset,
top: topOffset,
width: element.width,
height: element.height
};
}
else {
return {
left: leftOffset,
top: topOffset,
width: parseInt(element.style.width),
height: parseInt(element.style.height)
};
}
}
}
// (x,y)世界坐标(左下角为0,0)
function touchSimulation(x, y) {
let rect;
//兼容2.2.x 与 2.3.2
let inputManager = window._cc ? window['_cc'].inputManager : cc.internal.inputManager;
if (cc.sys.isBrowser) {
let canvas = document.getElementById("GameCanvas");
rect = getHTMLElementPosition(canvas);
} else {
rect = cc.view.getFrameSize();
rect.left = 0;
rect.top = 0;
}
let vp = cc.view.getViewportRect();
let sx = cc.view.getScaleX();
let sy = cc.view.getScaleY();
let ratio = cc.view.getDevicePixelRatio();
let htmlx = (x * sx + vp.x) / ratio + rect.left;
let htmly = rect.top + rect.height - (y * sy + vp.y) / ratio;
let pt = cc.v2(htmlx, htmly);
cc.log(`模拟点击坐标:${pt.x}, ${pt.y}`);
let touch = inputManager.getTouchByXY(pt.x, pt.y, rect);
inputManager.handleTouchesBegin([touch]);
setTimeout(() => {
inputManager.handleTouchesEnd([touch]);
}, 200);
}