子弹与敌机的碰撞
程序员文章站
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;
}
}
}
}