欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

子弹与敌机的碰撞

程序员文章站 2022-03-13 14:50:59
...

如果不是格子地图,两个精灵的碰撞一般是通过包围盒是否交叉来判定(记得在同一坐标系下)

void CGameScene::update(float fDelta)
{
	//通过管理者分别拿到子弹和敌机
	Vector<Node*> vecBullet = m_pBulletMgr->getChildren();
	Vector<Node*> vecEnemy = m_pEnemyMgr->getChildren();
	for (int i = 0; i < vecBullet.size();i++)  //遍历子弹容器
	{
		CBullet* pBullet = static_cast<CBullet*>(vecBullet.at(i));  //拿到子弹

		if (!pBullet->getIsPlayer())  //如果该子弹不是玩家的
		{
			continue;  //跳出本次循环
		}


		Rect rcBullet = pBullet->getBoundingBox();  //拿到子弹包围盒

		for (int j = 0; j < vecEnemy.size(); j++)  //遍历敌人容器
		{
			CEnemy* pEnemy = static_cast<CEnemy*>(vecEnemy.at(j));  //拿到敌人

			if (pEnemy->getDeath())
			{
				continue;
			}
			Rect rcEnemy = pEnemy->getBoundingBox();  //拿到敌人包围盒

 			//碰撞(包围盒交叉)
 			if (rcBullet.intersectsRect(rcEnemy))
 			{
				//敌人扣血
				pEnemy->damage(pBullet->getAck());
				if (pEnemy->getDeath())
				{
					pEnemy->removeFromParent();  //敌人移除
				}
 				pBullet->removeFromParent();
 				break;
 			}
		}
	}
}
相关标签: # PlaneWar c++