Simple 2D RPG made in C++ and SFML
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.1 KiB

#include "entitymanager.h"
EntityManager::EntityManager() {
}
void EntityManager::SetCollisionMethod(CollisionUpdateEvent collisionsEvent) {
this->collisionsEvent = collisionsEvent;
}
void EntityManager::AddEntity(std::string name, Entity* entity) {
std::unordered_map<std::string, Entity*>::const_iterator found = this->entities.find(name);
while(found != this->entities.end()) {
name += "0";
found = this->entities.find(name);
}
this->entities.insert(std::make_pair(name, entity));
}
Entity* EntityManager::Get(std::string name) {
std::unordered_map<std::string, Entity*>::const_iterator found = this->entities.find(name);
if(found != this->entities.end()) {
return found->second;
}
return NULL;
}
void EntityManager::Update() {
std::vector<std::string> toRemove;
for (auto& iterator : this->entities) {
if (iterator.second != NULL) {
if (this->collisionsEvent != NULL) {
for (auto& iterator2 : this->entities) {
if (iterator != iterator2) {
if(iterator.second->Collision(iterator2.second)) {
this->collisionsEvent(iterator.second, iterator2.second);
}
}
}
}
if (iterator.second->Active()) {
iterator.second->Update();
}
else {
toRemove.push_back(iterator.first);
}
}
}
while (toRemove.size() > 0) {
this->entities.erase(toRemove[toRemove.size() - 1]);
toRemove.pop_back();
}
toRemove.clear();
}
void EntityManager::Render(sf::RenderWindow* window, Camera *camera) {
for(auto& iterator : this->entities) {
if(iterator.second != NULL
&& iterator.second->Active()
&& camera->IsOnScreen(window, iterator.second)) {
window->draw(*iterator.second);
}
}
}
EntityManager::~EntityManager() {
for (auto& iterator : this->entities) {
delete iterator.second;
}
this->entities.clear();
}