#ifndef GAMELOGIC_H #define GAMELOGIC_H #include "Cell.h" #include "Scene.h" #include "VectorMath.h" #include class GameLogic { public: GameLogic() { } bool AreNeighbours(Cell* cell1, Cell* cell2) { sf::Vector2f dist = cell2->position-cell1->position; float r = GetSqrLength(dist); if(rradius+cell2->radius, 2)) return true; else return false; } void UpdateScene(Scene* scene, float dt) { std::map< Cell*, std::map< Cell*, float> > map; for(int i = 0; i < scene->GetCellCount() - 1; i++) { Cell* cell1 = scene->GetCell(i); for(int j = i+1; j < scene->GetCellCount(); j++) { Cell* cell2 = scene->GetCell(j); float d = GetSqrLength(cell2->position - cell1->position); d = std::sqrt(d); if(d*0.8fradius+cell2->radius) { map[cell1][cell2] = d; map[cell2][cell1] = d; } } } for(int i = 0; i < scene->GetCellCount(); i++) { scene->GetCell(i)->speed = sf::Vector2f(0, 0); } for(int i = 0; i < scene->GetCellCount()-1; i++) { Cell* c1 = scene->GetCell(i); for(int j = i+1; j < scene->GetCellCount(); j++) { Cell* c2 = scene->GetCell(j); if(map.find(c1)!=map.end())//map.end() такой элемент возвращается, если элемент не найден if(map[c1].find(c2)!=map[c1].end()) { float d = map[c1][c2]; sf::Vector2f dist = c2->position-c1->position; float sum = c1->radius+c2->radius; float komma = sum - d; if(komma>0) { dist*=komma; c1->speed-=dist*c2->radius; c2->speed+=dist*c1->radius; } } } } for(int i = 0; i < scene->GetCellCount(); i++) { Cell* cell = scene->GetCell(i); cell->position+=normalize(cell->speed); } /* for(int i = 0; i < scene->GetCellCount(); i++) { Cell* cell = scene->GetCell(i); scene->GetCell(i)->radius+=(random()%100)*0.001f; if(scene->GetCell(i)->radius<1.f) scene->GetCell(i)->radius = 1.f; scene->GetCell(i)->color.r*=random()%20; scene->GetCell(i)->color.g+=random()%20; scene->GetCell(i)->color.b+=random()%20; scene->GetCell(i)->color.a+=random()%5; }*/ } void CycleOfCell(Cell* cell, float food, float dt) { if (cell->radius>=11) { cell->isAlive=false; cell->canDivide=true; } else cell->generAge+=dt/(random()%100+1); cell->radius+=cell->generAge/200; } void CycleOfScene(Scene* scene, float food, float dt) { for (int i = 0; iGetCellCount(); i++) { Cell* c = scene->cells[i]; CycleOfCell(c, food, dt); if(c->canDivide) { scene->AddCell(sf::Vector2f(c->position.x+c->radius/2+0.001 ,c->position.y), c->genCode, c->health, 10, 1, true, false, 10, c->color); scene->AddCell(sf::Vector2f(c->position.x, c->position.y+c->radius/2), c->genCode, c->health, 10, 1, true, false, 10, c->color); scene->DeleteCell((sf::Vector2f(c->position))); } } } }; #endif // GAMELOGIC_H