PacMan开发-碰撞检测实现

在游戏如何让程序知道物体在撞墙?

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

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

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

碰撞检测函数是在"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

转载于:https://www.cnblogs.com/mayuko/p/4567514.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值