import { _decorator, Color, Component, EventTouch, Graphics, Label, Mask, Node, size, Size, Sprite, UITransform, Vec2, Vec3 } from 'cc'; const { ccclass, property } = _decorator; @ccclass('test') export class test extends Component { @property(Node) draw_bg:Node = null; @property(Node) btn_type:Node = null; @property(Node) btn_clear:Node = null; @property(Node) bottom:Node = null; @property(Mask) top_mask:Mask = null; @property(Node) top:Node = null; private is_circle:boolean = true; private bottom_size:Size = new Size(0,0); private top_mask_graphics: Graphics = null; private smear_rect_size:Size = new Size(40, 50); private smear_circle_size:number = 45; private hide_points = [] private hide_points_total_num:number = 0 start() { this.bottom_size = this.bottom.getComponent(UITransform).contentSize this.top_mask_graphics = this.top_mask.getComponent(Graphics) this.top.getComponent(UITransform).contentSize = this.bottom_size this.btn_type.on(Node.EventType.TOUCH_END, ()=>{ this.is_circle = !this.is_circle this.updateBtnTypeStatus() this.clearMaskGraphics() },this) this.updateBtnTypeStatus() this.btn_clear.on(Node.EventType.TOUCH_END, ()=>{ this.clearMaskGraphics() },this) this.bottom.on(Node.EventType.TOUCH_START, this.onTouchBegin, this); this.bottom.on(Node.EventType.TOUCH_MOVE, this.onTouchMoved, this); this.bottom.on(Node.EventType.TOUCH_END, this.onTouchEnd, this); this.clearMaskGraphics() } updateBtnTypeStatus() { if(this.is_circle) { this.btn_type.getChildByName("Label").getComponent(Label).string = '更改为方形' } else { this.btn_type.getChildByName("Label").getComponent(Label).string = '更改为圆形' } } clearMaskGraphics() { this.top_mask_graphics.clear() this.initMaskPoints() } initMaskPoints() { var rows = 0 var cols = 0 if(this.is_circle) { rows = Math.floor(this.bottom_size.height/(this.smear_circle_size*1.5)); cols = Math.floor(this.bottom_size.width/(this.smear_circle_size*1.5)); } else { rows = Math.floor(this.bottom_size.height/(this.smear_rect_size.height*1.5)); cols = Math.floor(this.bottom_size.width/(this.smear_rect_size.width*1.5)); } if(rows>0) { rows = Math.ceil(rows/2); } if(cols>0) { cols = Math.ceil(cols/2); } this.hide_points = [] for (let i =-rows; i<=rows; i++) { for(let j=-cols; j<=cols; j++) { this.hide_points.push({'x':j, "y":i}) } } this.hide_points_total_num = this.hide_points.length console.log('hidePoints',this.hide_points, '数量:',this.hide_points_total_num) } onTouchBegin(event:EventTouch) { this.scratch(event) } onTouchMoved(event:EventTouch) { this.scratch(event) } onTouchEnd(event:EventTouch) { this.scratch(event) } scratch(event:EventTouch) { let event_point = event.touch.getUILocation(); let v3 = new Vec3(event_point.x, event_point.y,1) let point = this.bottom.getComponent(UITransform).convertToNodeSpaceAR(v3); this.addCircle(point) } addCircle(point:Vec3) { // if(point.x < -(this.bottom_size.width / 2) || point.x > this.bottom_size.width / 2) { // return console.log('超出 X 界限') // } // if(point.y < -(this.bottom_size.height / 2) || point.y > this.bottom_size.height / 2) { // return console.log('超出 Y 界限') // } // console.log('point=',point) this.top_mask_graphics = this.top_mask.getComponent(Graphics) if(this.is_circle) { this.top_mask_graphics.circle(point.x, point.y, this.smear_circle_size) } else { this.top_mask_graphics.rect(point.x, point.y, this.smear_rect_size.width, this.smear_rect_size.height) } this.top_mask_graphics.fill() this.calculateScratchArea(point) } calculateScratchArea(point:Vec3) { var x = 0 var y = 0 if(this.is_circle) { x = Math.floor(point.x/this.smear_circle_size) y = Math.floor(point.y/this.smear_circle_size) } else { x = Math.floor(point.x/this.smear_rect_size.width) y = Math.floor(point.y/this.smear_rect_size.height) } for (let i = 0; i < this.hide_points.length; i++) { const element = this.hide_points[i]; if(x==this.hide_points[i].x && y==this.hide_points[i].y) { this.hide_points.splice(i,1) break } } let ratio = Math.floor((1 - (this.hide_points.length/this.hide_points_total_num)) * 100) console.log('计算=',this.hide_points.length,' 百分比= ',ratio, '%') } } // import { _decorator, Component, EventTouch, Label, Node, UITransform, Vec2, Vec3 } from 'cc'; // const { ccclass, property } = _decorator; // @ccclass('test') // export class test extends Component { // @property(Node) bg:Node = null; // @property(Node) img:Node = null; // @property(Node) img_point:Node = null; // @property(Node) btn_rotate:Node = null; // protected is_rotate:boolean = false; // protected anchor_point:Vec2 = new Vec2(0.5,0.5) // start() { // this.img.on(Node.EventType.TOUCH_END, (et:EventTouch)=> { // let p = new Vec3(et.getUILocation().x,et.getUILocation().y) // let n_p = this.img.getComponent(UITransform).convertToNodeSpaceAR(p) // // console.log('n_p',n_p) // let img_position_x = n_p.x // let img_position_y = n_p.y // this.img_point.position = new Vec3(img_position_x, img_position_y, 1) // this.anchor_point = new Vec2(0.5,0.5) // this.img.getComponent(UITransform).setAnchorPoint(this.anchor_point) // let img_contentSize = this.img.getComponent(UITransform).contentSize // let anchor_point_x = (img_contentSize.width / 2 + n_p.x) / img_contentSize.width // let anchor_point_y = (img_contentSize.height / 2 + n_p.y) / img_contentSize.height // this.anchor_point = new Vec2(anchor_point_x, anchor_point_y) // console.log('当前锚点=',this.anchor_point) // },this) // this.btn_rotate.on(Node.EventType.TOUCH_END, ()=> { // if(this.is_rotate) { // // 归位 // this.btn_rotate.children[0].getComponent(Label).string = '旋转' // this.img.angle = 0 // this.anchor_point = new Vec2(0.5,0.5) // this.img_point.position = new Vec3(0, 0, 1) // } else { // // 旋转 // this.btn_rotate.children[0].getComponent(Label).string = '归位' // this.img.angle = 10 // } // this.img.getComponent(UITransform).setAnchorPoint(this.anchor_point) // this.is_rotate = !this.is_rotate // },this) // } // }