引擎版本2.0.2
参考继承mask修改 _hitTest 的触发规则
继承了cc.Mask并修改了_hitTest在网页平台达到了预期效果,但是在Android平台启用继承的mask组件则报错
@Knox 请问我该如何做?
报错贴图:
代码如下:
let _vec2_temp = cc.v2();
let _mat4_temp = cc.mat4();
let invert = function (out, a) {
var a00 = a.m00, a01 = a.m01, a02 = a.m02, a03 = a.m03,
a10 = a.m04, a11 = a.m05, a12 = a.m06, a13 = a.m07,
a20 = a.m08, a21 = a.m09, a22 = a.m10, a23 = a.m11,
a30 = a.m12, a31 = a.m13, a32 = a.m14, a33 = a.m15;
var b00 = a00 * a11 - a01 * a10;
var b01 = a00 * a12 - a02 * a10;
var b02 = a00 * a13 - a03 * a10;
var b03 = a01 * a12 - a02 * a11;
var b04 = a01 * a13 - a03 * a11;
var b05 = a02 * a13 - a03 * a12;
var b06 = a20 * a31 - a21 * a30;
var b07 = a20 * a32 - a22 * a30;
var b08 = a20 * a33 - a23 * a30;
var b09 = a21 * a32 - a22 * a31;
var b10 = a21 * a33 - a23 * a31;
var b11 = a22 * a33 - a23 * a32;
// Calculate the determinant
var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
if (!det) {
return null;
}
det = 1.0 / det;
out.m00 = (a11 * b11 - a12 * b10 + a13 * b09) * det;
out.m01 = (a02 * b10 - a01 * b11 - a03 * b09) * det;
out.m02 = (a31 * b05 - a32 * b04 + a33 * b03) * det;
out.m03 = (a22 * b04 - a21 * b05 - a23 * b03) * det;
out.m04 = (a12 * b08 - a10 * b11 - a13 * b07) * det;
out.m05 = (a00 * b11 - a02 * b08 + a03 * b07) * det;
out.m06 = (a32 * b02 - a30 * b05 - a33 * b01) * det;
out.m07 = (a20 * b05 - a22 * b02 + a23 * b01) * det;
out.m08 = (a10 * b10 - a11 * b08 + a13 * b06) * det;
out.m09 = (a01 * b08 - a00 * b10 - a03 * b06) * det;
out.m10 = (a30 * b04 - a31 * b02 + a33 * b00) * det;
out.m11 = (a21 * b02 - a20 * b04 - a23 * b00) * det;
out.m12 = (a11 * b07 - a10 * b09 - a12 * b06) * det;
out.m13 = (a00 * b09 - a01 * b07 + a02 * b06) * det;
out.m14 = (a31 * b01 - a30 * b03 - a32 * b00) * det;
out.m15 = (a20 * b03 - a21 * b01 + a22 * b00) * det;
return out;
};
let transformMat4 = function (out, a, m) {
var x = a.x,
y = a.y;
out.x = m.m00 * x + m.m04 * y + m.m12;
out.y = m.m01 * x + m.m05 * y + m.m13;
return out;
};
cc.Class({
extends: cc.Mask,
editor: CC_EDITOR && {
menu: 'i18n:MAIN_MENU.component.renderers/Mask',
help: 'i18n:COMPONENT.help_url.mask',
inspector: 'packages://inspector/inspectors/comps/mask.js'
},
_hitTest(cameraPt) {
let node = this.node;
let size = node.getContentSize(),
w = size.width,
h = size.height,
testPt = _vec2_temp;
node._updateWorldMatrix();
invert(_mat4_temp, node._worldMatrix);
transformMat4(testPt, cameraPt, _mat4_temp);
testPt.x += node._anchorPoint.x * w;
testPt.y += node._anchorPoint.y * h;
let result = false;
if (this.type === cc.Mask.Type.RECT || this.type === cc.Mask.Type.IMAGE_STENCIL) {
result = testPt.x >= 0 && testPt.y >= 0 && testPt.x <= w && testPt.y <= h;
} else if (this.type === cc.Mask.Type.ELLIPSE) {
let rx = w / 2, ry = h / 2;
let px = testPt.x - 0.5 * w, py = testPt.y - 0.5 * h;
result = px * px / (rx * rx) + py * py / (ry * ry) < 1;
}
if (this.inverted) {
result = !result;
}
return result;
},
});
