void move() { for(auto &b: bullets){ if(b){ b.move(); } } player_.move(); auto p = player_.get_position(); auto r = paint::rect(p, player_.get_size()); auto s = get_size(); if(r.left < 0.f) p.x = 0.f; else if(r.right >= s.width) p.x = s.width - 1.f - r.width(); if(r.top < 0.f) p.y = 0.f; else if(r.bottom >= s.height) p.y = s.height - 1.f - r.height(); player_.set_position(p); auto rect = get_rect(); for(auto it = enemy_bullets.begin(); it != enemy_bullets.end(); ++it){ (*it)->move(player_); if((*it)->is_colliding(player_)){ gameover(); return; } float r = (*it)->get_radius(); if(!(*it)->get_center().is_inside(rect - paint::point(r, r) + paint::size(r, r))){ delete *it; *it = nullptr; } } enemy_bullets.erase(std::remove(enemy_bullets.begin(), enemy_bullets.end(), nullptr), enemy_bullets.end()); for(auto it = enemies.begin(); it != enemies.end(); ++it){ (*it)->move(player_, enemy_bullets); if((*it)->is_colliding(player_)){ gameover(); return; } for(auto &b: bullets){ if(b && (*it)->is_colliding(b)){ b.set_active(false); delete *it; *it = nullptr; break; } } } auto remover = std::remove(enemies.begin(), enemies.end(), nullptr); score += static_cast<int>(std::distance(remover, enemies.end())); enemies.erase(remover, enemies.end()); }