碰撞检测 (矩形圆形点旋转矩形框像素)

Posted gamedaybyday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了碰撞检测 (矩形圆形点旋转矩形框像素)相关的知识,希望对你有一定的参考价值。

 

一、矩形碰撞

1. 使用rectangle的intersects判断碰撞

		let rectA:egret.Rectangle = this.red.getBounds();
		let rectB:egret.Rectangle = this.blue.getBounds();
		
		//获得的rect不包含x,y位置
		console.log(rectA);  //x=0,y=0,width=200,height=200
		console.log(rectB);  //x=0,y=0,width=200,height=200

		//必须加上方块所在的x,y
		rectA.x += this.red.x;
		rectA.y += this.red.y;
		rectB.x += this.blue.x;
		rectB.y += this.blue.y;
		
		let startTime = egret.getTimer();
		for(let i=0;i<1000;i++){
			if(rectA.intersects(rectB)){
				console.log("hit");
			}else{
				console.log("no hit");
			}
		}
		console.log(egret.getTimer() - startTime);  //检测1000次,耗时215ms

 

下图:no hit

技术分享图片

 

下图:hit

技术分享图片

 

矩形旋转后,还能正确判断碰撞吗?

下图:no hit

技术分享图片

 下图:no hit

技术分享图片

 下图:hit

 技术分享图片

矩形旋转后,并不能正确的判断碰撞了。查看源代码,可知并没有计算rotation这样的算法。

        /**
         * 确定在 toIntersect 参数中指定的对象是否与此 Rectangle 对象相交。此方法检查指定的 Rectangle
         * 对象的 x、y、width 和 height 属性,以查看它是否与此 Rectangle 对象相交。
         * @param toIntersect 要与此 Rectangle 对象比较的 Rectangle 对象。
         * @returns 如果两个矩形相交,返回true,否则返回false
         * @version Egret 2.4
         * @platform Web,Native
         * @language zh_CN
         */
        public intersects(toIntersect:Rectangle):boolean {
            return Math.max(this.x, toIntersect.x) <= Math.min(this.right, toIntersect.right)
                && Math.max(this.y, toIntersect.y) <= Math.min(this.bottom, toIntersect.bottom);
        }

 

所以intersects的碰撞检测适用:

1. 用于矩形(未旋转)

2. eui对象(才有right、bottom属性)

3. 修改了锚点也能正常检测

 

2. 自定义的矩形碰撞检测

	protected childrenCreated(){

		let startTime = egret.getTimer();
		for(let i=0;i<1000;i++){
			if(this.checkRect(this.red, this.blue)){
				console.log("hit");
			}else{
				console.log("no hit");
			}
		}
		console.log(egret.getTimer() - startTime);  //220ms
		
	}

    /**
     * 检测碰撞矩形
     * @objA 对象A 
     * @objB 对象B      
   */ public checkRect(objA: egret.DisplayObject,objB: egret.DisplayObject) { var x1 = objA.x - objA.anchorOffsetX; var y1 = objA.y - objA.anchorOffsetY; var x2 = objB.x - objB.anchorOffsetX; var y2 = objB.y - objB.anchorOffsetY; if(y1 > (y2 - objA.height) && y1 < (y2 + objB.height)) { if(x1 > (x2 - objA.width) && x1 < (x2 + objB.width)) { return true; } } return false; }

 

适用范围:

1. 只要是矩形显示对象就可以,对比intersects不要求必须是eui对象

2. 对于旋转对象,同样没法碰撞检测

3. 对象修改了锚点也能正确检测

 

二、圆形碰撞

 


以上是关于碰撞检测 (矩形圆形点旋转矩形框像素)的主要内容,如果未能解决你的问题,请参考以下文章

android 游戏 碰撞检测

OpenGL 2D 圆 - 旋转 AABB 碰撞

圆形与矩形的碰撞检测--Mr.Ember

SDL 中的每像素 2D 圆形碰撞检测

矩形碰撞检测和圆形碰撞检测。

使用旋转矩形进行碰撞检测