Example #1
0
//rend la position de la premiere fleur faisant partie du champs de vision
Vec2d* Bee::visibleFlower()
{
	//création d'un collider simulatant de champs de vision
	Collider vision (centre, rayon + visibility_);
	
	//si aucune fleur nefait partie du champs de vision rendre nullptr
	if (getAppEnv().getCollidingFlower(vision) == nullptr)
	{
		return nullptr;
	} else {
		//sinon rendre la position de la premiere fleur appercue
		Vec2d position ((getAppEnv().getCollidingFlower(vision))->getPosition());
		return new Vec2d (position);
	}
}
Example #2
0
bool Bee:: movebee(sf::Time dt) // on modularise car on en a besoin pour targetmove() et randomMove()
{
	double beta(0);
	
	// calcule de la position envisagée en fonction du vecteur vitesse
	Vec2d possible_pos = centre + speed_*dt.asSeconds();
	
	//verifier que l'abeille peut occuper cette position
	if(getAppEnv().world_.isFlyable(possible_pos))
	{
		//si oui bouger le centre du collider abeille
		centre=possible_pos;
		//on s'assure que il fait toujorus partie de la carte
		clamping();
		return 1;
	} else //si la position envisagée n'est pas libre
	{
		//changement de direction dans la sens opposé
		if(bernoulli(prob))
		{	
			beta=PI/4;
		} else
		{
			beta= -PI/4;
		}
		speed_.rotate(beta);
		clamping();
		return 0;
	}
}
Example #3
0
void FlowerGenerator::update(sf::Time dt)
{
    t+=dt;
    if ((t >= sf::seconds(getAppConfig()["simulation"]["flower generator"]["delay"].toDouble())) and //vérifie que le temps est écoulé, et que la génération aléatoire est activée
        (getAppConfig()["simulation"]["flower generator"]["active"].toBool())) {
        reset(); // remet le compteur à zéro
        Vec2d p(uniform(0.0, getApp().getWorldSize().x), uniform(0.0, getApp().getWorldSize().y));
        getAppEnv().addFlowerAt(p);
    }
}
Example #4
0
void
WorkerBee::drawDebug(sf::RenderTarget& target) const
{
    std::string valueString;
    sf::Color color(sf::Color::Magenta);
    Vec2d position;
    double text_size(getAppEnv().getTextSize());

    position.x = this->getPosition().x;
    position.y = this->getPosition().y + text_size;

    valueString = "Worker: energy " + to_nice_string(this->getEnergy());
    sf::Text text = buildText(valueString, position, getAppFont(), text_size,
                              color);
    target.draw(text);

    position.y = position.y + text_size;
    sf::Text status = buildText(this->getDebugStatus(), position,
                                getAppFont(), text_size, color);
    target.draw(status);
}
Example #5
0
void
WorkerBee::onState(State state, sf::Time dt)
{
    Vec2d empty(-1.0, -1.0);

    // first state
    if (state == IN_HIVE) {
        // if bee has pollen transfer it to hive
        if (getPollen() > 0) {
            transferPollen(dt);
            flower_location_ = empty;
            setDebugStatus("in_hive_leaving_pollen");
        } else {
            // if bee has not enough energy to leave hive, eat its nectar
            if (getEnergy() < energy_leave_hive_
                && getHive().getNectar() > 0) {
                setDebugStatus("in_hive_eating");
                eatFromHive(dt);
            }
            // if there is a flower in memory and enough energy, target move
            // to this flower
            else if (flower_location_ != empty
                     && getEnergy() > energy_collect_pollen_) {
                setDebugStatus("in_hive_leaving");
                setMoveTarget(flower_location_);
                // change state to to flower
                nextState();
            } else {
                setDebugStatus("in_hive_no_flower");
            }
        }
    }

    // second state
    else if (state == TO_FLOWER) {
        setDebugStatus("to_flower");

        if (getEnergy() < energy_collect_pollen_) {
            nextState();
            nextState();
        }

        Flower* flower  = getAppEnv().getCollidingFlower(getVisionRange());

        if (flower) {
            setMoveTarget(flower->getPosition());
            setMoveState(MoveState::TARGET);
            if (isPointInside(flower->getPosition())) {
                nextState();
            }
        } else if (isPointInside(flower_location_)) {
            // go back to hive and clear location
            nextState();
            nextState();
            setFlowerLocation(Vec2d(-1,-1));
        }
    }

    // third state
    else if (state == COLLECT_POLLEN) {
        // if there is a flower at flower location and it has pollen and
        // bee has not enough pollen, eat pollen from flower
        Flower* flower(getAppEnv().getCollidingFlower(getCollider()));
        if ((getPollen() < max_pollen_)
            && (flower != nullptr)
            && (flower->getPollen() > 0)) {
            eatPollen(flower, dt);
        } else {
            // else skip collection
            nextState();
        }
    } else if (state == RETURN_HIVE) {
        // if bee is in hive change state to in hive
        if (getHive().isColliderInside(getCollider())) {
            nextState();
        }
    }
}