//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); } }
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; } }
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); } }
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); }
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(); } } }