2008年12月20日星期六

Rectangle Collision Function

两矩形碰撞检测函数.
Rect定义:
typedef struct {
int x, y, w, h;
} Rect;

#define CL_RIGHT 1
#define CL_LEFT 2
#define CL_DOWN 4
#define CL_UP 8

检测到碰撞后函数返回0或上面几个值, 并且由src->x和src->y传出碰撞后的新位置.


int cl (Rect *dest, Rect *src, float oldx, float oldy)
{
int isbeat = 0;
float dy, dx0, dx1, dx, dy0, dy1;
float ix, iy; /* interpolation xy */

/* right */
if (oldx+src->w <= dest->x && src->x+src->w > dest->x) {
/* Y interpolation */
dy = src->y - oldy;
dx0 = dest->x-oldx-src->w;
dx1 = src->x+src->w-dest->x;
iy = dy * dx0 / (dx0+dx1) + oldy;
if (iy+src->h > dest->y && iy < dest->y+dest->h) {
src->x = dest->x - src->w;
isbeat |= CL_RIGHT;
}
}
else
if (oldx >= dest->x+dest->w && src->x < dest->x+dest->w) {
dy = src->y - oldy;
dx0 = oldx - dest->x-dest->w;
dx1 = dest->x+dest->w-src->x;
iy = dy * dx0 / (dx0 + dx1) + oldy;
if (iy+src->h > dest->y && iy < dest->y+dest->h) {
src->x = dest->x + dest->w;
isbeat |= CL_LEFT;
}
}
else
/* down */
if (oldy+src->h <= dest->y && src->y+src->h > dest->y) {
dx = src->x - oldx;
dy0 = dest->y-oldy-src->h;
dy1 = src->y+src->h-dest->y;
ix = dx * dy0 / (dy0+dy1) + oldx;
if (ix+src->w > dest->x && ix < dest->x+dest->w) {
src->y = dest->y - src->h;
isbeat |= CL_DOWN;
}
}
else
if (oldy >= dest->y+dest->h && src->y < dest->y+dest->h) {
dx = src->x - oldx;
dy0 = oldy-dest->y-dest->h;
dy1 = dest->y+dest->h-src->y;
ix = dx * dy0 / (dy0+dy1) + oldx;
if (ix+src->w > dest->x && ix < dest->x+dest->w) {
src->y = dest->y + dest->h;
isbeat |= CL_UP;
}
}

return isbeat;
}
}

没有评论: