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传出碰撞后的新位置.
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;
}
}
2008年12月9日星期二
Music Breakout
2008年12月6日星期六
2008年12月1日星期一
PingxPong
exe 24k src 14k
这么长时间总算弄出来个游戏. 这个是模仿的日本的一个flash小游戏PingxPong.
游戏分3个状态: 菜单和演示动画, 主游戏, 游戏结束. 用一个全局变量g_state来区别. 后来发现这个状态不就相当于flash里的贞嘛, g_state = 1就等于GotoAndPlay(1).
球碰到板时的反弹我做的不太好.
电脑的AI我是这样设计的: 球离自己1/3屏距离以外的时候就随机的改变vx, 靠边的时候就更大的概率回到中间. 1/3以内时就计算板到球的距离d, d越小就以越大的概率和速度靠近球. 另外AI还会随着比分的差距和增长有所变化, 例如到了9:9的时候虽然分差是0, 但接近比赛结束, 是关键时刻, AI一样会调很高.
这么长时间总算弄出来个游戏. 这个是模仿的日本的一个flash小游戏PingxPong.
游戏分3个状态: 菜单和演示动画, 主游戏, 游戏结束. 用一个全局变量g_state来区别. 后来发现这个状态不就相当于flash里的贞嘛, g_state = 1就等于GotoAndPlay(1).
球碰到板时的反弹我做的不太好.
电脑的AI我是这样设计的: 球离自己1/3屏距离以外的时候就随机的改变vx, 靠边的时候就更大的概率回到中间. 1/3以内时就计算板到球的距离d, d越小就以越大的概率和速度靠近球. 另外AI还会随着比分的差距和增长有所变化, 例如到了9:9的时候虽然分差是0, 但接近比赛结束, 是关键时刻, AI一样会调很高.
订阅:
博文 (Atom)