export function getPosByAngle(angle, len) { const radian = angle * Math.PI / 180; const x = Math.sin(radian) * len; const y = Math.cos(radian) * len; return { x, y }; } export function getAngleByPos(px, py, mx, my) { const x = Math.abs(px - mx); const y = Math.abs(py - my); const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); const cos = y / z; const radina = Math.acos(cos); // 用反三角函数求弧度 let angle = Math.floor(180 / (Math.PI / radina) * 100) / 100; // 将弧度转换成角度 if (mx > px && my > py) {// 鼠标在第四象限 angle = 180 - angle; } if (mx === px && my > py) {// 鼠标在y轴负方向上 angle = 180; } if (mx > px && my === py) {// 鼠标在x轴正方向上 angle = 90; } if (mx < px && my > py) {// 鼠标在第三象限 angle = 180 + angle; } if (mx < px && my === py) {// 鼠标在x轴负方向 angle = 270; } if (mx < px && my < py) {// 鼠标在第二象限 angle = 360 - angle; } // console.log('angle: ', angle); return angle; } export function exchangeNodePos(baseNode, targetNode) { return baseNode.convertToNodeSpaceAR(targetNode._parent.convertToWorldSpaceAR(cc.v2(targetNode.x, targetNode.y))); } export function RandomInt(a, b = 0) { let max = Math.max(a, b); let min = Math.min(a, b); return Math.floor(Math.random() * (max - min) + min); } export function randomSortByArr(arr) { const newArr = []; const tmpArr = arr.concat(); while (tmpArr.length > 0) { const randomIndex = Math.floor(tmpArr.length * Math.random()); newArr.push(tmpArr[randomIndex]); tmpArr.splice(randomIndex, 1); } return newArr; } export function setSprNodeMaxLen(sprNode, maxW, maxH) { const sx = maxW / sprNode.width; const sy = maxH / sprNode.height; const s = Math.min(sx, sy); sprNode.scale = Math.round(s * 1000) / 1000; } export function localPosTolocalPos(baseNode, targetNode) { const worldPos = targetNode.parent.convertToWorldSpaceAR(cc.v2(targetNode.x, targetNode.y)); const localPos = baseNode.parent.convertToNodeSpaceAR(cc.v2(worldPos.x, worldPos.y)); return localPos; } export function worldPosToLocalPos(worldPos, baseNode) { const localPos = baseNode.parent.convertToNodeSpaceAR(cc.v2(worldPos.x, worldPos.y)); return localPos; } export function getScaleRateBy2Node(baseNode, targetNode, maxFlag = true) { const worldRect1 = targetNode.getBoundingBoxToWorld(); const worldRect2 = baseNode.getBoundingBoxToWorld(); const sx = worldRect1.width / worldRect2.width; const sy = worldRect1.height / worldRect2.height; if (maxFlag) { return Math.max(sx, sy); } else { return Math.min(sx, sy); } } export function getDistance (start, end){ var pos = cc.v2(start.x - end.x, start.y - end.y); var dis = Math.sqrt(pos.x*pos.x + pos.y*pos.y); return dis; } export function playAudioByUrl(audio_url, cb=null) { if (audio_url) { cc.assetManager.loadRemote(audio_url, (err, audioClip) => { const audioId = cc.audioEngine.play(audioClip, false, 0.8); if (cb) { cc.audioEngine.setFinishCallback(audioId, () => { cb(); }); } }); } } export function btnClickAnima(btn, time=0.15, rate=1.05) { btn.tmpScale = btn.scale; btn.on(cc.Node.EventType.TOUCH_START, () => { cc.tween(btn) .to(time / 2, {scale: btn.scale * rate}) .start() }) btn.on(cc.Node.EventType.TOUCH_CANCEL, () => { cc.tween(btn) .to(time / 2, {scale: btn.tmpScale}) .start() }) btn.on(cc.Node.EventType.TOUCH_END, () => { cc.tween(btn) .to(time / 2, {scale: btn.tmpScale}) .start() }) }