C++游戏开发之碰撞检测算法

/*检测是否碰撞*/
if(CCRectMake(X-mario->getPathLenght()+1,Y,Widht-2,Height).intersectsRect(mario->getPlayerBoundingBox()))
{
	/*上面的函数是检测到已经碰撞后, 下面的逻辑是判断碰撞后人物与物体的位置关系*/
	/*物体位置和长宽*/
	float x2 = X-mario->getPathLenght();
	float y2 = Y;
	int h2 = Height;
	int w2 = Widht;

	/*人物位置和长宽*/
	int y1 = mario->getPositionY();
	int x1 = mario->getPositionX();
	float w1 = mario->getCurrentWidth();
	float h1 = mario->getCurrentHeight();

	/*如果y坐标不重叠 , y坐标就减去人物y轴的速度*/
	if (abs(y1+h1-y2)>1e-4)
	{
		y1-=mario->verticalVelocity;
	}

	
	/*     2
5		------------        6
	|           |
	|	    |
1		|<span style="white-space:pre">	</span>    |       3
	|	    |
	------------      
8	            4               7
	
	上面数字是物体的方位

	人物从哪个方位碰撞到物体
	*/
	if ((y1>=y2)&&(y1+h1<y2+h2))
	{
		if (x1<x2)//1
		{
			/*
			正面碰撞1
			设置x位置
			设置水平速度
			*/
			mario->setPositionX(x2-w1);
			mario->horizontalVelocity = 0;
		} 
		else//3
		{
			/*
			正面碰撞3
			设置x位置
			设置水平速度
			*/
			mario->setPositionX(x2+w2);
			mario->horizontalVelocity = 0;

		}
	}
	else if ((x1>=x2)&&(x1+w1<x2+w2))
	{
		if (y1>y2)//2
		{
			/*
			正面碰撞2
			设置y位置
			设置垂直速度
			*/
			mario->setPositionY(y2+h2);
			if (mario->getIsJumping())
			{
				mario->setIsJumping(false);
			}
			mario->setIsOnTheObject(true);
		} 
		else//4
		{
			/*
			正面碰撞4
			设置y位置
			设置垂直速度
			*/
			mario->setPositionY(y2-h1);

			mario->verticalVelocity = -mario->verticalVelocity;
		}
	}
	else if(x1<=x2&&y1>y2)//5
	{
		/*
			碰撞面5 (同时碰撞 面1 和 面2 )
		*/
		if (x1+w1-x2>y2+h2-y1)
		{
			/*
				如果碰撞到的2比1多
				设置y坐标
				设置垂直速度
			*/
			mario->setPositionY(y2+h2);
			if (mario->getIsJumping())
			{
				mario->setIsJumping(false);
			}
			mario->setIsOnTheObject(true);
		}
		else
		{
			/*
				如果碰撞到的2比1少
				设置x坐标
				设置水平速度
			*/
			mario->setPositionX(x2-w1);
			mario->horizontalVelocity = 0;

		}
	}
	else if (x1>=x2&&y1>y2)//6
	{
		/*
		同理。。。。。。
		*/
		if (x2+w2-x1>y2+h2-y1)
		{
			mario->setPositionY(y2+h2);
			if (mario->getIsJumping())
			{
				mario->setIsJumping(false);
			}
			mario->setIsOnTheObject(true);
		} 
		else
		{
			mario->setPositionX(x2+w2);
			mario->horizontalVelocity = 0;

		}
	}
	else if(x1>=x2&&y1<y2)//7
	{
		if (x2+w2-x1>y1+h1-y2)
		{
			mario->setPositionY(y2-h1);

			mario->verticalVelocity = -mario->verticalVelocity;

			mario->setPositionY(mario->getPositionY()+mario->verticalVelocity);

		} 
		else
		{
			mario->setPositionX(x2+w2);
			mario->horizontalVelocity = 0;

		}
	}
	else if (x1<=x2&&y1<y2)//8
	{
		if (x1+w1-x2>y1+h1-y2)
		{
			mario->verticalVelocity = -mario->verticalVelocity;
			mario->setPositionY(y2-h1);
			mario->setPositionY(mario->getPositionY()+mario->verticalVelocity);

		} 
		else
		{
			mario->setPositionX(x2-w1);
			mario->horizontalVelocity = 0;

		}
	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值