/** * Created by daichenxi on 2020/10/25 */ import Common5 from "../../Platform/th/Common5"; const { ccclass, property, disallowMultiple, menu } = cc._decorator; // cc.macro.ENABLE_WEBGL_ANTIALIAS = true; @ccclass @disallowMultiple() @menu('对话剧情/ScratchMask') export class ScratchMask extends cc.Component { @property(cc.Node) maskNode: cc.Node = null; @property({ tooltip: "圆角半径:\n具体像素值\n生成的圆会依赖此值", type: cc.Integer }) radius = 66; @property({ tooltip: "分片后阈值:\n结果判断会依赖此值", type: cc.Integer }) value = 40; @property(cc.Component.EventHandler) dismissCallBack: cc.Component.EventHandler = null; // @property(cc.Mask) protected mask: cc.Mask = null; protected pisitionProgress: Boolean[] = null; protected positions: cc.Vec2[] = null; protected onEnable(): void { this.mask = this.maskNode.getComponent(cc.Mask); } protected onLoad(): void { let position = cc.v2(0, 0)//this.node.position; let width = this.node.width / 3; let height = this.node.height / 3; this.positions = [ cc.v2(position.x, position.y), // 中心点 cc.v2(position.x - width, position.y), // 中心点偏左 cc.v2(position.x + width, position.y), // 中心点偏右 cc.v2(position.x, position.y + height), // 上 cc.v2(position.x - width, position.y + height), // 上左 cc.v2(position.x + width, position.y + height), // 上右 cc.v2(position.x, position.y - height), // 下 cc.v2(position.x - width, position.y - height), // 下左 cc.v2(position.x + width, position.y - height), // 下右 ]; this.pisitionProgress = new Array(this.positions.length); this.node.on(cc.Node.EventType.TOUCH_START, this._onTouchBegin, this); this.node.on(cc.Node.EventType.TOUCH_MOVE, this._onTouchMoved, this); this.node.on(cc.Node.EventType.TOUCH_END, this._onTouchEnd, this); } private _onTouchBegin(event) { this._onDrawWithEvent(event); } private _onTouchMoved(event) { this._onDrawWithEvent(event); } private _onTouchEnd(event) { this._onDrawWithEvent(event); this._checkProgress(); } private _onDrawWithEvent(event) { let point = event.getLocation(); point = this.node.convertToNodeSpaceAR(point); this.onDraw(point); } public onClearMask() { let graphics = this.mask._graphics; if (!graphics) { return; } graphics.clear(); } public hideMask(callBack) { cc.tween(this.maskNode) .to(0.3, { opacity: 0 }) .call(callBack) .start(); } /** * mask 用于绘制罩子的函数. * this 指向mask 对象,需要特别注意. * @param point */ protected onDraw(point: cc.Vec2) { let graphics = this.mask._graphics; if (!graphics) { return; } this.scheduleOnce(() => { Common5.playRemoteAudioEffect('remotesound/effect/擦东西') }, 0.1) this._checkPoint(point); let width = this.radius * 2; graphics.roundRect(point.x - this.radius, point.y - this.radius, width, width, this.radius || 0); if (cc.game.renderType === cc.game.RENDER_TYPE_CANVAS) { graphics.stroke(); } else { graphics.fill(); } } private _checkPoint(point: cc.Vec2) { for (let i = 0; i < 9; i++) { let p = this.positions[i]; // 此点在关键点附近 console.log("point=", point) console.log("this.value=", this.value) console.log("p.x + this.value", this.value) if (p.x + this.value > point.x && p.x - this.value < point.x && p.y + this.value > point.y && p.y - this.value < point.y) { this.pisitionProgress[i] = true; } } } private _checkProgress() { // let result = this.pisitionProgress.filter((value) => { // return value; // }).length === 9; let result = this.pisitionProgress.filter((value) => { return value; }).length >= 5; if (result) { this.dismissCallBack && this.dismissCallBack.emit(null); } } }