Sia che io entri nell'if, sia che non entri, quindi provando distruggere e ricostruire gli oggetti al di fuori di ogni if/for, il risultato non cambia.
Ovvio che il risultato non cambi se distruggi e ricrei oggetti in quella funzione. Che siano all'interno di if o for è un dettaglio insignificante. Il punto è che stai usando puntatori locali alla funzioni, pertanto le ricostruzioni restano all'interno della funzione. Se vuoi che il tutto si trasmetta al di fuori dei passare dei doppi puntatori (più scomodo che sconsigliato) o dei reference ai puntatori (consigliato).
In pratica devi modificare il prototipo così:
void GameEngine::collisionBulletPlayer(std::vector <ProiettileNemico> &proiettile_nemico, Player*& player, Camera*& camera)
e devi farlo per ogni funzione in cui prevedi distruzioni e riallocazioni di puntatori che debbano essere visibili all'esterno.
Nota però che questo non serve quando devi solo modificare delle variabili membro.
A ogni modo, distruggere e ricreare oggetti in quel modo è sconsigliato, in quanto le allocazioni possono sollevare eccezioni (e causare dei memory leaks), sono pesanti dal punto di vista prestazionale e sono comunque aggirabili con opportuni metodi di classe.
Se proprio ti piace quel modo, puoi usare il placement delete e il placement new, senza passare per reference i puntatori in oggetto, senza allocazioni extra di memoria e ricostruendo player e camera nella stessa locazione di memoria già allocata.
if (player->vita <= 0)
{
player->~Player(); // placement delete
new (player) Player(); // placement new
camera->~Camera(); // placement delete
new (camera) Camera(); // placement new
}