| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- cc.Class({
- extends: cc.Component,
- properties: {
- targetButton: {
- default: null,
- type: cc.Button,
- visible: false,
- serializable: false,
- },
- stencil: cc.Node,
- stencil_tip: cc.Node,
- //转换坐标的偏移量
- offset: {
- default: null,
- visible: false,
- serializable: false,
- },
- //需要偏移第几个节点
- offsetCount: {
- default: -1,
- type: cc.Integer,
- visible: false,
- serializable: false,
- },
- collider: cc.PolygonCollider
- },
- random(max, min) {
- return Math.floor(Math.random() * (max - min + 1) + min);
- },
- onLoad() {
- // this.node.on(cc.Node.EventType.TOUCH_START, this.TouchStartFunction, this);
- // this.node.on(cc.Node.EventType.TOUCH_END, this.TouchEndFunction, this);
- // this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.TouchCancelFunction, this);
- //箭头动画
- // this.stencil_tip.opacity = 255;
- this.stencil_tip.stopAllActions();
- var s = cc.sequence(cc.scaleTo(0.5, 1.5), cc.scaleTo(0.5, 1.0));
- var repeat = cc.repeatForever(s);
- this.stencil_tip.runAction(repeat);
-
- this.collider.node.on(cc.Node.EventType.TOUCH_START, function (touch, event) {
- console.log("Hit!");
- // // 返回世界坐标
- // let touchLoc = touch.getLocation();
- // console.log('this.collider.world.points=', this.collider.world.points);
- // // https://docs.cocos.com/creator/api/zh/classes/Intersection.html 检测辅助类
- // if (cc.Intersection.pointInPolygon(touchLoc, this.collider.world.points)) {
- // console.log("Hit!");
- // }
- // else {
- // console.log("No hit");
- // }
- if (this.targetButton) {
- cc.Component.EventHandler.emitEvents(this.targetButton.clickEvents, event);
- this.count++;
- if (this.count < this.targetNodes.length) {
- this._setMaskPosAndEvent();
- } else {
- GlobalD.GameControl.isTaskInProgress = false;
- this.node.destroy();
- }
- }
- }, this);
- },
- /**
- * 初始设置目标参数
- * @method onInitTaskMask
- * @param {[Node]} _targetNodes 透明区域指向的位置节点对象数组
- * @param {Button} _targetButton 需要传递事件的按钮对象
- */
- onInitTaskMask(_targetNodes) {
- GlobalD.GameControl.isTaskInProgress = true;
- // this.nodeLength = _targetNodes.length;
- this.targetNodes = _targetNodes;
- this.count = 0;
- this._setMaskPosAndEvent();
- },
- //设置提示位置和绑定对应的按钮事件
- _setMaskPosAndEvent() {
- let pt = this.stencil.parent.convertToNodeSpaceAR(this.targetNodes[this.count].parent.convertToWorldSpaceAR(this.targetNodes[this.count].position));
- //设置最后一个点的偏移量
- //铺路时候,场景的位置不准确需要修正
- // console.log(this.offset, this.offsetCount);
- if (this.offset && this.offsetCount == this.count)
- pt = cc.v2(pt.x + this.offset.x, pt.y + this.offset.y);
- this.stencil.position = pt;
- let _size = this.targetNodes[this.count].width > this.targetNodes[this.count].height ? this.targetNodes[this.count].width : this.targetNodes[this.count].height;
- this.stencil.width = _size + 5;
- this.stencil.height = _size + 5;
- this.stencil_tip.position = cc.v2(pt.x, pt.y + _size * 0.4);
- let _targetButton = this.targetNodes[this.count].getComponent(cc.Button);
- if (_targetButton)
- this.targetButton = _targetButton;
- else
- console.error('遮挡模板的按钮对象不存在;');
- },
- isInCircle: function (pos, cPos, r) {
- console.log('pospos:', pos, cPos, r, pos.sub(cPos).mag());
- if (pos.sub(cPos).mag() <= r) {
- return true;
- }
- return false;
- },
- TouchEndFunction(event) {
- let pt = this.stencil.parent.convertToNodeSpaceAR(event.getLocation());
- let x = this.stencil.position.x;
- let y = this.stencil.position.y;
- // let rect = cc.rect(0, 0, this.stencil.width, this.stencil.height);
- //点中空洞,返回false,触摸事件继续派发
- // if (rect.contains(pt)) {
- if (this.isInCircle(pt, cc.v2(x, y), this.stencil.width)) {
- console.log('点击区域');
- return;
- if (this.targetButton) {
- cc.Component.EventHandler.emitEvents(this.targetButton.clickEvents, event);
- this.count++;
- if (this.count < this.targetNodes.length) {
- this._setMaskPosAndEvent();
- } else {
- GlobalD.GameControl.isTaskInProgress = false;
- this.node.destroy();
- }
- }
- return false;
- }
- // console.log('点击区域无效:', pt);
- },
- // update (dt) {},
- onButtonEvent(target, event) {
- console.log(target, event);
- }
- });
|