`
119568242
  • 浏览: 420299 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

Android菜鸟日记32-游戏中的碰撞

 
阅读更多

Android菜鸟日记

32-游戏中的碰撞

一、矩形与矩形的碰撞

 

用反向思维,除了不碰撞的都是碰撞的。

四种情况

如图:

         1

    3

         4

红色表示相对应的矩形

 x1 y1 w1 h1

      X2 y2 w2 h2

 

1的情况

y2 < y1 && y2 < y1 - h2

2的情况

x2 < x1 && x2 < x1 - w2

3的情况

x2 > x1 && x2 > x1 + w1

4的情况

y2 > y1 && y2 > y1 + h1

 

二、圆形与圆形的碰撞

主要就是判断圆心距离

(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2)

Math.pow(double a,double b)ab次方

 

三、圆形与矩形的碰撞

 

第一种:就是圆形与矩形边框的碰撞检测

检测Y轴圆心到矩中心的距离是否小于半径+矩形X1/2

检测X轴圆心到矩中心的距离是否小于半径+矩形Y1/2

 

第二种:就是特殊的矩形四个角检测

四个矩形顶角到圆心的距离是否小于半径

 

四、多矩形的碰撞

把不规则图片看成多矩形然后检验碰撞。

 

下面是我自己封装的一个碰撞类

封装了上面几个加上

2组矩形数组内容之间检验是否碰撞的类


package com.lurencun.SurfaceUtil;

import android.graphics.Rect;

/**
 * 游戏碰撞检测类
 * 
 * @author poolo
 * @version 1.00
 */
public class CollisionUtil {

	/**
	 * 矩形碰撞检测 参数为x,y,width,height
	 * 
	 * @param x1
	 *            第一个矩形的x
	 * @param y1
	 *            第一个矩形的y
	 * @param w1
	 *            第一个矩形的w
	 * @param h1
	 *            第一个矩形的h
	 * @param x2
	 *            第二个矩形的x
	 * @param y2
	 *            第二个矩形的y
	 * @param w2
	 *            第二个矩形的w
	 * @param h2
	 *            第二个矩形的h
	 * @return 是否碰撞
	 */
	public boolean IsRectCollision(int x1, int y1, int w1, int h1, int x2,
			int y2, int w2, int h2) {
		if (x2 > x1 && x2 > x1 + w1) {
			return false;
		} else if (x2 < x1 && x2 < x1 - w2) {
			return false;
		} else if (y2 > y1 && y2 > y1 + h1) {
			return false;
		} else if (y2 < y1 && y2 < y1 - h2) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 矩形碰撞检测 参数为Rect对象
	 * 
	 * @param r1
	 *            第一个Rect对象
	 * @param r2
	 *            第二个Rect对象
	 * @return 是否碰撞
	 */
	public boolean IsRectCollision(Rect r1, Rect r2) {
		return IsRectCollision(r1.left, r1.top, r1.right - r1.left, r1.bottom
				- r1.top, r2.left, r2.top, r2.right - r2.left, r2.bottom
				- r2.top);
	}

	/**
	 * 圆形碰撞检测
	 * 
	 * @param x1
	 *            第一个圆的圆心x
	 * @param y1
	 *            第一个圆的圆心y
	 * @param r1
	 *            第一个圆的半径
	 * @param x2
	 *            第二个圆的圆心x
	 * @param y2
	 *            第二个圆的圆心y
	 * @param r2
	 *            第二个圆的半径
	 * @return 是否碰撞
	 */
	public boolean IsCircleCollision(int x1, int y1, int r1, int x2, int y2,
			int r2) {
		// 两点距大于 2圆形半径距离
		if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2) {
			return false;
		}
		return true;
	}

	/**
	 * 圆形与矩形碰撞检测
	 * 
	 * @param x1
	 *            第一个矩形的x
	 * @param y1
	 *            第一个矩形的y
	 * @param w1
	 *            第一个矩形的宽
	 * @param h1
	 *            第一个矩形的高
	 * @param x2
	 *            圆的圆心x
	 * @param y2
	 *            圆的圆心y
	 * @param r2
	 *            圆的半径r
	 * @return 是否碰撞
	 */
	public boolean IsC2RCollision(int x1, int y1, int w1, int h1, int x2,
			int y2, int r2) {
		if ((Math.abs(x2 - (x1 + w1 / 2)) > w1 / 2 + r2)
				|| Math.abs(y2 - (y1 + h1 / 2)) > h1 / 2 + r2) {
			return false;
		}
		return true;
	}

	/**
	 * 多矩形碰撞
	 * 
	 * @param rArray1
	 * @param rArray2
	 * @return 是否碰撞
	 */
	public boolean IsRectsCollision(Rect[] rArray1, Rect[] rArray2) {
		for (Rect rt1 : rArray1) {
			for (Rect rt2 : rArray2) {
				if (IsRectCollision(rt1, rt2)) {
					return true;
				}

			}
		}
		return false;
	}

}
  

2012-01-11

poolo

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics