// Draw the ship's bullet (if it exists) void RenderShipBullet() { if ( !firing && GetAsyncKeyState( VK_SPACE ) ) { bulletx = ScrW() / 2 + shipx; bullety = ScrH() - 110; firing = true; } if ( firing ) { render.SetDrawColor( 255, 255, 255 ); render.DrawLine( bulletx, bullety, bulletx, bullety + 10 ); bullety -= BULLETSPEED; if ( bullety <= 0 ) firing = false; else CheckShipBulletCollision(); } }
void GameManager::RunCollisionCheck() { for (vector<CBullet*>::iterator bulletIter = shipObj->BulletList.begin(); bulletIter != shipObj->BulletList.end();) { bool killBullet = false; if ((*bulletIter)->fireByPlayer == true) // if bullets fired by player { //Check if enemies are hit for (vector<CEnemyShip*>::iterator eShipIter = enemyList.begin(); eShipIter != enemyList.end(); ) { bool kill = false; if (CheckShipBulletCollision(*eShipIter, *bulletIter) && ((*bulletIter)->fireByPlayer == true)) //Player hit enemy { kill = true; particleObj->ExplosionAt((*eShipIter)->getPos()); score += static_cast<int>(100 * (shipObj->getHp() * 0.5)); } else if((*eShipIter)->getZPos() > 10)//ship Out of screen { kill = true; } if (kill) { killBullet = true; if ((*eShipIter)) { delete (*eShipIter); (*eShipIter) = 0; } eShipIter = enemyList.erase(eShipIter); } else { ++eShipIter; } } } else //Bullets fired by enemies { if ((*bulletIter)->getPosPtr()->z > -10.0f) //Bullets are close to player { if (CheckShipBulletCollision(shipObj, *bulletIter)) { particleObj->ExplosionAt((*shipObj).getPos()); shipObj->subtractHP(); killBullet = true; } } } if (killBullet) //Erase bullet if it has collided { if ((*bulletIter)) { delete (*bulletIter); (*bulletIter) = 0; } bulletIter = shipObj->BulletList.erase(bulletIter); } else { ++bulletIter; } } //Check if ships have collided with player for (vector<CEnemyShip*>::iterator eShipIter = enemyList.begin(); eShipIter != enemyList.end(); ) { bool shipCollision = false; if ((*eShipIter)->getEnemyType() == 0) { if ((*eShipIter)->getZPos() > -10.0f) { if (CheckShipShipCollision((*eShipIter), shipObj)) { shipCollision = true; shipObj->subtractHP(); particleObj->ExplosionAt((*eShipIter)->getPos()); if ((*eShipIter)) { delete (*eShipIter); (*eShipIter) = 0; } eShipIter = enemyList.erase(eShipIter); } else { ++eShipIter; continue; } } ++eShipIter; continue; } else { ++eShipIter; } } }