Esempio n. 1
0
	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());
	}