Laya 如何检测矩形和圆形的碰撞?

发布时间:2026/5/25 7:00:52

Laya 如何检测矩形和圆形的碰撞? 如何检测矩形和圆形的碰撞1.画一个黄色矩形和一个蓝色圆形再放置一个旋转的按钮。2.拖动黄色矩形当矩形碰到圆形时圆形会变为绿色。3.通过旋转按钮改变矩形旋转角度再次碰撞亦可变为绿色。Laya的实现代码如下exportdefaultclass HitRect extends Laya.Sprite{public w:number100;public h:number50;public r:number40;public spRect:Laya.Sprite;public spCircle:Laya.Sprite;constructor(){super();}publicdraw():void{this.spRectnew Laya.Sprite();this.spRect.widththis.w;this.spRect.heightthis.h;this.spRect.graphics.drawRect(0,0,this.w,this.h,0xffff00);this.addChild(this.spRect);this.spRect.mouseEnabledtrue;this.spRect.on(Laya.Event.MOUSE_DOWN,this,this.mouseDown);this.spRect.rotation0;this.spRect.x0;this.spRect.y200;this.spRect.pivotXthis.w/2;this.spRect.pivotYthis.h/2;this.spRect.graphics.drawCircle(this.spRect.pivotX,this.spRect.pivotY,6,0xff0000);this.spCirclenew Laya.Sprite();this.spCircle.graphics.drawCircle(0,0,this.r,0x00ffff);this.spCircle.x150;this.spCircle.y200;this.addChild(this.spCircle);let buttonnew Laya.Button();button.width80;button.skincomp/button.png;button.label旋转1;this.addChild(button);button.on(Laya.Event.MOUSE_DOWN,this,this.onButtonClick);let button5new Laya.Button();button5.skincomp/button.png;button5.x100;button5.label旋转5;this.addChild(button5);button5.on(Laya.Event.MOUSE_DOWN,this,this.onButtonClick5);}privateonButtonClick(e:Laya.Event){this.spRect.rotation1;}privateonButtonClick5(e:Laya.Event){this.spRect.rotation5;}privatemouseDown():void{this.spRect.on(Laya.Event.MOUSE_MOVE,this,this.mouseMove);this.spRect.stage.on(Laya.Event.MOUSE_UP,this,this.mouseUp);}privatemouseUp():void{this.spRect.off(Laya.Event.MOUSE_MOVE,this,this.mouseMove);this.spRect.stage.off(Laya.Event.MOUSE_UP,this,this.mouseUp);}privatemouseMove(evt:Laya.Event):void{this.spRect.xevt.stageX;this.spRect.yevt.stageY;let pos:anythis.getNewPos(this.spRect.x,this.spRect.y,this.spCircle.x,this.spCircle.y,this.spRect.rotation);let booolthis.ComputeCollision(this.w,this.h,this.r,pos.x,pos.y);if(boool){this.spCircle.graphics.drawCircle(0,0,this.r,0x00ff00);}else{this.spCircle.graphics.drawCircle(0,0,this.r,0x00ffff);}}/** * 计算碰撞 * param w 宽度 * param h 高度 * param rx 圆形x * param ry 圆形y */privateComputeCollision(w,h,r,rx,ry):boolean{var dxMath.min(rx,w*0.5);var dx1Math.max(dx,-w*0.5);var dyMath.min(ry,h*0.5);var dy1Math.max(dy,-h*0.5);return(dx1-rx)*(dx1-rx)(dy1-ry)*(dy1-ry)r*r;}privategetNewPos(x1,y1,x2,y2,rotation):any{var pos:any{};//距离var distanceMath.pow((Math.pow((x1-x2),2)Math.pow((y1-y2),2)),0.5);//角度var angle:numberMath.atan((y1-y2)/(x1-x2))*180/Math.PI;//兼容矩形的旋转角度var newAngleangle-rotation;pos.xMath.cos(newAngle/180*Math.PI)*distance;pos.yMath.sin(newAngle/180*Math.PI)*distance;returnpos;}}

相关新闻