您的位置:首页 > 其它

PacMan开发-碰撞检测实现

2015-04-15 19:06 176 查看
在游戏如何让程序知道物体在撞墙?

可通过无题所在点的位置和墙体边缘的位置进行检测。

计算方法是:用中心坐标和朝向所对应的墙的位置与物体的宽度进行比较,若是大于宽度,则没有碰上。

将地图分为若干个小的正方形格子,物体到每一个格子后进行碰撞检测。

碰撞检测函数是在"GObject.h"的Collision()函数中,这是一个bool型函数。

bool GObject::Collision()
{
	bool b = false;
	AchiveCtrl();//更新行列的数据
	if (dArray<0 || dRow<0 || dArray>MAPLENTH || dRow>MAPLENTH)
	{
		b = true;
	}
	else if (Achive())
	{
		switch (twCommand)
		{
		case LEFT:
			if (dArray > 0 && !pStage->mapData[dRow][dArray - 1])
			{
				b = true;
			}
			break;
		case RIGHT:
			if (dArray < MAPLENTH - 1 && !pStage->mapData[dRow][dArray + 1])
			{
				b = true;
			}
			break;
		case UP:
			if (dRow>0 && !pStage->mapData[dRow - 1][dArray])
			{
				b = true;
			}
			break;
		case DOWN:
			if (dRow < MAPLENTH - 1 && !pStage->mapData[dRow + 1][dArray])
			{
				b = true;
			}
			break;
		}
		if (!b)
		{
			tw = twCommand;//没撞墙,指令成功
		}
	}
	mX = point.x;
	mY = point.y;
	int MAX = pStage->LD*MAPLENTH + pStage->LD / 2;
	int MIN = pStage->LD / 2;
	switch (tw)
	{
	case LEFT:
		if (dArray > 0 && !pStage->mapData[dRow][dArray - 1])
		{
			b = true;//撞墙了
			break;
		}
		if (point.x < MIN)
		{
			point.x = MAX;
		}
		point.x -= speed;
		break;
	case RIGHT:
		if (dArray < MAPLENTH - 1 && !pStage->mapData[dRow][dArray + 1])
		{
			b = true;//撞墙了
			break;
		}
		point.x += speed;
		if (point.x >MAX)
		{
			point.x = MIN;
		}
		break;
	case UP:
		if (dRow>0 && !pStage->mapData[dRow - 1][dArray])
		{
			b = true;//撞墙了
			break;
		}
		if (point.y < MIN)
		{
			point.y = MAX;
		}
		point.y -= speed;
		break;
	case DOWN:
		if (dRow < MAPLENTH - 1 && !pStage->mapData[dRow + 1][dArray])
		{
			b = true;
			break;
		}
		point.y += speed;
		if (point.y >MAX)
		{
			point.y = MIN;
		}
		break;
	}
	return b;
}


@ Mayuko
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: