void FieldSystem::Update(double elapsed) { if (m_automaticModeEnabled && m_gameMode == MODE_DONE) { m_eventManager->FireEvent<StepEvent>(new StepEvent()); UpdatePheromones(); RecalculateColors(); } }
/// ANT COLONY ALGORITHMS /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// ///// ///// ///// void ant_colony() { srand(time(NULL)); const int loop_number = 1000; int** ants = CreateAnts(); int *best_path = ShortestPath(ants); double bestLength = CycleLength(best_path); double **pheromones = InitializePheromones(); int counter = 0; while (counter < loop_number) { UpdateAnts(ants, pheromones); UpdatePheromones(pheromones, ants); int *currBestTrail = ShortestPath(ants); double currBestLength = CycleLength(currBestTrail); if (currBestLength < bestLength) { delete best_path; best_path = NULL; bestLength = currBestLength; best_path = currBestTrail; } counter++; } cout<<bestLength; getchar(); getchar(); }
void FieldSystem::EventListener(IEvent* eventData) { if(MousePositionEvent* event = dynamic_cast<MousePositionEvent*>(eventData)) { glm::ivec2 mousePos = event->getMousePosition(); m_pickedField = nullptr; //Simple mouse picking for field for(std::map<unsigned int, BaseComponent*>::iterator it = m_fieldComponents->begin(); it != m_fieldComponents->end(); ++it) { FieldComponent* fieldComp = static_cast<FieldComponent*>(it->second); unsigned int entityId = fieldComp->getEntityId(); TransformComponent* transformComp = static_cast<TransformComponent*>((*m_transformComponents)[entityId]); SpriteComponent* spriteComp = static_cast<SpriteComponent*>((*m_spriteComponents)[entityId]); glm::vec4 bounds = glm::vec4(transformComp->getPosition().x * transformComp->getScale().x, transformComp->getPosition().y * transformComp->getScale().y, spriteComp->getTextureBounds().z * transformComp->getScale().x, spriteComp->getTextureBounds().w * transformComp->getScale().y); bool isPickedField = m_pickedField == nullptr && fieldComp->getIsPassable() && mousePos.x > bounds.x && mousePos.x < bounds.x + bounds.z && mousePos.y > bounds.y && mousePos.y < bounds.y + bounds.w; //Either showing start or goal to set switch(m_gameMode) { case MODE_CHOOSE_START: if(isPickedField) { fieldComp->setIsStart(true); m_pickedField = fieldComp; } else { fieldComp->setIsStart(false); } break; case MODE_CHOOSE_GOAL: if(isPickedField) { fieldComp->setIsGoal(true); m_pickedField = fieldComp; } else { fieldComp->setIsGoal(false); } break; case MODE_DONE: if (isPickedField) { m_pickedField = fieldComp; } break; default: break; } } RecalculateColors(); } else if(MouseClickEvent* event = dynamic_cast<MouseClickEvent*>(eventData)) { if (event->getButton() == sf::Mouse::Button::Left) { //Take enemy step/reculculate path or set start/goal if (m_gameMode == MODE_DONE) { m_eventManager->FireEvent<StepEvent>(new StepEvent()); UpdatePheromones(); RecalculateColors(); } else { if (m_pickedField != nullptr) { switch (m_gameMode) { case MODE_CHOOSE_START: m_eventManager->FireEvent<StartSetEvent>(new StartSetEvent(m_pickedField)); std::cout << "Start set" << std::endl; m_eventManager->FireEvent<ShowMessageEvent>(new ShowMessageEvent("Please choose a goal point.")); m_gameMode = MODE_CHOOSE_GOAL; break; case MODE_CHOOSE_GOAL: m_eventManager->FireEvent<GoalSetEvent>(new GoalSetEvent(m_pickedField)); std::cout << "Goal set" << std::endl; m_eventManager->FireEvent<ShowMessageEvent>(new ShowMessageEvent("Press mouse button for simulation step or 'A' for automatic mode.")); m_gameMode = MODE_DONE; break; default: break; } } } } else if (event->getButton() == sf::Mouse::Button::Right) { if (m_pickedField != nullptr) { m_pickedField->setIsPassable(!m_pickedField->getIsPassable()); m_pickedField->setCurrentPheromoneStrength(0); m_pickedField->setNewPheromoneStrength(0); RecalculateColors(); } } } else if (KeyEvent* event = dynamic_cast<KeyEvent*>(eventData)) { if (m_gameMode == MODE_DONE && event->getKey() == sf::Keyboard::A && event->getIsDown()) { m_automaticModeEnabled = !m_automaticModeEnabled; } } }