I haven't tried running it, but looking through the code there's one possibility I noticed:
In Player::update you have this line:
float gradient = (startX - xTarget) / (startY - yTarget);
If startY (player pos) and yTarget (mouse coords) are the same, then that will cause a divide by zero, and gradient will be a NaN (not a number).
The NaN will then spread to everything gradient is used with, which will set the player position to NaN. That position is then used (back in Engine::update) to move the view, which will also become a NaN and break the rendering.