void Simulation::Start(){ memset(¶ms.rnd,0,sizeof(Random)); params.rnd.Set(params.initialRandomAlg); params.rnd.Srand(params.initialRandomSeed); frameCount = 0; for(unsigned int n=0; n<food.size(); n++)food[n].active = false; foodCount = 0; food.clear(); food.reserve(params.foodMaxInWorld + FOODRESERVE); for(unsigned int n=0; n<critter.size(); n++)critter[n].active = false; critCount = 0; critter.clear(); critter.reserve(params.critMaxInWorld + CRITRESERVE); float canvasArea = M_PI*pow(params.simRadius,2); float energyPerFood = (params.initialFoodDistribution*canvasArea)/params.initialFoodCount; for(unsigned int n=0; n<params.initialFoodCount; n++){ float d = sqrt(params.rnd.xrand(0.,1.))*params.simRadius; float a = params.rnd.xrand(-M_PI,M_PI); AddFood(cos(a)*d,sin(a)*d,energyPerFood,0.); } for(unsigned int n=0; n<params.initialCritCount; n++){ float d = sqrt(params.rnd.xrand(0.,1.))*params.simRadius; float a = params.rnd.xrand(-M_PI,M_PI); AddCritter(cos(a)*d,sin(a)*d); } }
void Simulation::RemoveCritter(uint32_t i){ critCount--; critter[i].active = false; if(critSelected&&(i==critSelect)){ critSelect = 0; critSelected = false; } AddFood(critter[i].x, critter[i].y, critter[i].energy, critter[i].waste, critter[i].rot); critter[i].waste = 0.; critter[i].energy = 0.; if(critCount<params.critMinInWorld){ float d = sqrt(params.rnd.xrand(0.,1.))*params.simRadius; float a = params.rnd.xrand(-M_PI,M_PI); Critter *A = NULL, *B = NULL; if(critCount>1){ do{ A = &critter.at(params.rnd.Next()%critter.size()); }while(!(A->active)); do{ B = &critter.at(params.rnd.Next()%critter.size()); }while(!(B->active)); } if((A!=NULL)&&(B!=NULL))AddCritter(cos(a)*d,sin(a)*d,A,B); } }
void Simulation::AddFood(float x, float y, float energy, float waste){ AddFood(x,y,energy,waste,params.rnd.xrand(-M_PI,M_PI)); }
void GameMain::Update(){ if (true == is_game_end){ if (ResMed.Get(AudioKey::Game).isPlaying()){ ResMed.Get(AudioKey::Game).stop(); } if (!ResMed.Get(AudioKey::TimeOut).isPlaying()){ ResMed.Get(AudioKey::TimeOut).play(); } } if (true == is_end){ scene_manager->ChangeScene(std::shared_ptr<Result>(new Result(result))); return; } if (!ResMed.Get(AudioKey::Game).isPlaying()){ ResMed.Get(AudioKey::Game).play(); ResMed.Get(AudioKey::Game).looping(true); } if (food_click_limit == 0){ if (Collision::MouseToBox(App::Get().mousePosition(), food[0]->GetBox())){ if (App::Get().isPushButton(Mouse::LEFT)){ ResMed.Get(AudioKey::Eating).play(); selected.push_back(SelectedFood(Position::Left, food[0]->GetFoodType(), food[0]->GetFoodVariation())); AddFood(food[0]->GetFoodType()); Reset(); } } if (App::Get().isPushKey(GLFW_KEY_LEFT_SHIFT) || App::Get().isPushKey('Z')){ ResMed.Get(AudioKey::Eating).play(); selected.push_back(SelectedFood(Position::Left, food[0]->GetFoodType(), food[0]->GetFoodVariation())); AddFood(food[0]->GetFoodType()); Reset(); } if (Collision::MouseToBox(App::Get().mousePosition(), food[1]->GetBox())){ if (App::Get().isPushButton(Mouse::LEFT)){ ResMed.Get(AudioKey::Eating).play(); selected.push_back(SelectedFood(Position::Middle, food[1]->GetFoodType(), food[1]->GetFoodVariation())); AddFood(food[1]->GetFoodType()); Reset(); } } if (App::Get().isPushKey(GLFW_KEY_SPACE) || App::Get().isPushKey('B')){ ResMed.Get(AudioKey::Eating).play(); selected.push_back(SelectedFood(Position::Middle, food[1]->GetFoodType(), food[1]->GetFoodVariation())); AddFood(food[1]->GetFoodType()); Reset(); } if (Collision::MouseToBox(App::Get().mousePosition(), food[2]->GetBox())){ if (App::Get().isPushButton(Mouse::LEFT) || App::Get().isPushKey(GLFW_KEY_RIGHT_SHIFT)){ ResMed.Get(AudioKey::Eating).play(); selected.push_back(SelectedFood(Position::Right, food[2]->GetFoodType(), food[2]->GetFoodVariation())); AddFood(food[2]->GetFoodType()); Reset(); } } if (App::Get().isPushKey(GLFW_KEY_RIGHT_SHIFT) || App::Get().isPushKey(GLFW_KEY_SLASH)){ ResMed.Get(AudioKey::Eating).play(); selected.push_back(SelectedFood(Position::Right, food[2]->GetFoodType(), food[2]->GetFoodVariation())); AddFood(food[2]->GetFoodType()); Reset(); } } for (auto& itr : selected){ itr.Update(); } UpdateList(); if (true != is_game_end){ if (food_click_limit > 0){ food_click_limit--; } } time_limit--; if (time_limit < ENDWAITTIME){ is_game_end = true; } if (time_limit < 0){ is_end = true; } }